cocos2d-x3.14中國(guó)象棋AI(二)擺棋1

在這里我們需要給Stone類(lèi)添加多幾個(gè)成員變量以方便后面解決棋子擺放問(wèn)題拣技。

  • bool _red 顏色標(biāo)記瞧甩,判斷當(dāng)前棋子是否為紅棋
  • int _row 記錄棋子行號(hào)熄捍,行號(hào)不大于9
  • int _col 記錄棋子列號(hào)儿普,列號(hào)不大于8
  • int _id 記錄棋子的id祖娘,id號(hào)不大于32

因?yàn)閯?chuàng)建棋子時(shí)需要傳入棋子的id,所以我們對(duì)Stone類(lèi)的create函數(shù)及init函數(shù)稍做修改妹窖。(create函數(shù)原來(lái)由cocos的工廠(chǎng)方法CREATE_FUNC幫我們創(chuàng)建纬朝,我們重寫(xiě)時(shí)可以參考一下CREATE_FUNC的寫(xiě)法)

bool Stone::init(int id)
{
    if (!Sprite::init())
    {
        return false;
    }

    Sprite *stone = Sprite::create("Stone/rche.png");
    stone->setPosition(getPositionFromPlate());
    this->addChild(stone);

    return true;
}
Stone* Stone::create(int id)
{
    Stone *ret = new Stone();
    if (!ret && ret->init(id))
    {
        ret->autorelease();
    }
    else
    {
        delete ret;
        ret = nullptr;
    }
    return ret;
}

擺棋分析:
擺棋前我們要引入一個(gè)對(duì)稱(chēng)的概念,我們可以把棋盤(pán)平分為四塊矩形骄呼,而這四塊矩形上只要擺好第一塊矩形上的棋子共苛,那么另外三塊即可通過(guò)對(duì)稱(chēng)或旋轉(zhuǎn)和控制棋子顏色獲得,在這里我們需要用枚舉的方法列出棋子的類(lèi)型蜓萄,然后通過(guò)棋子的類(lèi)型記錄棋子在第一塊矩形相應(yīng)的行號(hào)及列號(hào)隅茎,接著我們就可以通過(guò)旋轉(zhuǎn)和棋子的顏色標(biāo)記來(lái)設(shè)置剩下的棋子的位置及紋理。

我們先確定第一塊矩形的棋子的行列嫉沽,以方便我們后面的對(duì)稱(chēng)和旋轉(zhuǎn)擺棋辟犀。如圖。

然后在Stone.h中枚舉出各類(lèi)棋子

enum TYPE{
        CHE,MA,XIANG,SHI,JIANG,PAO,BING
};

接著通過(guò)一個(gè)結(jié)構(gòu)體記錄第一塊矩形的行號(hào)和列號(hào)(該結(jié)構(gòu)體放在了初始化棋子信息的函數(shù)里绸硕,后面會(huì)提到)

struct
{
        TYPE type;
        int row;
        int col;
} proper[9] = {
        {CHE, 0, 0},
        {MA, 0, 1},
        {XIANG, 0, 2},
        {SHI, 0, 3},
        {BING, 3, 2},
        {BING, 3, 0},
        {PAO, 2, 1},

        {JIANG, 0, 4},
        {BING, 3, 4}
};

有了前面的邏輯后堂竟,我們可以開(kāi)始寫(xiě)一個(gè)initStone來(lái)初始化棋子信息

void Stone::initStone(int id)
{
    struct
    {
        TYPE type;
        int col;
        int row;
    }proper[9] = {
        {CHE,0,0},
        {MA,0,1},
        {XIANG,0,2},
        {SHI,0,3},
        {BING,3,2},
        {BING,3,0},
        {PAO,2,1},

        {JIANG,0,4},
        {BING,3,4}
    };
    _red = id < 16;
    if (id < 8)
    {
        this->_id = id;
        this->_col = proper[id].col;
        this->_row = proper[id].row;
    }
}

因?yàn)樘砑恿诵辛谐蓡T變量,相應(yīng)地改一下原來(lái)的getPositionFromPlate函數(shù)

Point Stone::getPositionFromPlate()
{
    Point ret = Point(Stone::_offx + this->_row*_d, Stone::_offy + this->_col*_d);

    return ret;
}

因?yàn)楸救吮磉_(dá)能力有限玻佩,為了避免混亂或有人看不懂跃捣,在最后就把Stone類(lèi)修改后的代碼貼出來(lái)。
Stone.h

#ifndef __STONE_H__
#define __STONE_H__

#include "cocos2d.h"
USING_NS_CC;

/*
布局棋子時(shí)因?yàn)槠灞P(pán)左側(cè)及下側(cè)都空出一段夺蛇,
所以在布局時(shí),每個(gè)棋子都需要加上左側(cè)空白段_offx及下側(cè)空白段_offy酣胀。
*/

class Stone : public Sprite
{
public:
    static int _d;//棋子直徑
    static int _offx;//棋子左側(cè)空白段
    static int _offy;//棋子下側(cè)空白段

    int _id;//棋子id
    int _col;//棋子的列號(hào)
    int _row;//棋子的行號(hào)
    bool _red;//標(biāo)記當(dāng)前棋子顏色

    //枚舉出所有棋子類(lèi)型
    enum TYPE{
        CHE,MA,XIANG,SHI,JIANG,PAO,BING
    };

    static Stone* create(int id);
    virtual bool init(int id);
    void initStone(int id);//該函數(shù)用于初始化棋子成員變量
    
    Point getPositionFromPlate();//該函數(shù)用于獲取棋子相對(duì)于棋盤(pán)的位置
};

#endif

Stone.cpp

#include "Stone.h"

int Stone::_d = 32;
int Stone::_offx = 32;
int Stone::_offy = 16;

bool Stone::init(int id)
{
    if (!Sprite::init())
    {
        return false;
    }
        //設(shè)置紋理圖片刁赦,此處與2.x版本有點(diǎn)區(qū)別,但是區(qū)別不大
    Texture2D *texture = Director::getInstance()->getTextureCache()->addImage("Stone/rche.png");
    this->setTexture(texture);
    this->setTextureRect(Rect(0, 0, texture->getContentSize().width, texture->getContentSize().height));
    initStone(id);
    setPosition(getPositionFromPlate());

    return true;
}

Stone* Stone::create(int id)
{
    Stone *ret = new Stone();
    if (ret && ret->init(id))
    {
        ret->autorelease();
    }
    else
    {
        delete ret;
        ret = nullptr;
    }
    return ret;
}

void Stone::initStone(int id)
{
    struct
    {
        TYPE type;
        int row;
        int col;
    }proper[9] = {
        {CHE,0,0},
        {MA,0,1},
        {XIANG,0,2},
        {SHI,0,3},
        {BING,3,2},
        {BING,3,0},
        {PAO,2,1},

        {JIANG,0,4},
        {BING,3,4}
    };
    _red = id < 16;
    if (id < 8)
    {
        this->_id = id;
        this->_col = proper[_id].col;
        this->_row = proper[_id].row;
    }
    /*此處添加后續(xù)擺棋代碼*/
}

Point Stone::getPositionFromPlate()
{
    Point ret = Point(Stone::_offx + this->_col*_d, Stone::_offy + this->_row*_d);

    return ret;
}

此時(shí)可以通過(guò)修改id號(hào)(不大于8)擺放車(chē)的位置
運(yùn)行圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闻镶,一起剝皮案震驚了整個(gè)濱河市甚脉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铆农,老刑警劉巖牺氨,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墩剖,居然都是意外死亡猴凹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)岭皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)郊霎,“玉大人,你說(shuō)我怎么就攤上這事爷绘∈槿埃” “怎么了进倍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)购对。 經(jīng)常有香客問(wèn)我猾昆,道長(zhǎng),這世上最難降的妖魔是什么骡苞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任垂蜗,我火速辦了婚禮,結(jié)果婚禮上烙如,老公的妹妹穿的比我還像新娘么抗。我一直安慰自己,他們只是感情好亚铁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布蝇刀。 她就那樣靜靜地躺著,像睡著了一般徘溢。 火紅的嫁衣襯著肌膚如雪吞琐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天然爆,我揣著相機(jī)與錄音站粟,去河邊找鬼。 笑死曾雕,一個(gè)胖子當(dāng)著我的面吹牛奴烙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剖张,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼切诀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搔弄?” 一聲冷哼從身側(cè)響起幅虑,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顾犹,沒(méi)想到半個(gè)月后倒庵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炫刷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年擎宝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浑玛。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡认臊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锄奢,到底是詐尸還是另有隱情失晴,我是刑警寧澤剧腻,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站涂屁,受9級(jí)特大地震影響书在,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拆又,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一儒旬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帖族,春花似錦栈源、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涣雕,卻和暖如春艰亮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挣郭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工迄埃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兑障。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓侄非,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親流译。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逞怨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 擺棋看起來(lái)可能會(huì)有點(diǎn)煩,但是棋子亂擺的話(huà)后面會(huì)很難管理先蒋,所以還是要沉下心把棋子按一定規(guī)則擺好。 為了擺棋更方便宛渐,我...
    lable閱讀 575評(píng)論 0 0
  • 要獲取和選中棋子我們需要要在原來(lái)LayerGameMain基礎(chǔ)上添加多三個(gè)成員變量和六個(gè)成員函數(shù)竞漾。幾個(gè)函數(shù)和變量間...
    lable閱讀 717評(píng)論 0 0
  • 悔棋需要用到備忘錄模式。大致思路是:我們先創(chuàng)建一個(gè)Step結(jié)構(gòu)體窥翩,這個(gè)結(jié)構(gòu)體記錄著兩個(gè)棋子的id(一個(gè)是移動(dòng)棋子业岁,...
    lable閱讀 527評(píng)論 0 0
  • 有做完上一篇的同學(xué)會(huì)發(fā)現(xiàn),移動(dòng)棋子存在很多bug寇蚊,這也是正常笔时,我們只是寫(xiě)了移動(dòng)的規(guī)則,具體的細(xì)節(jié)并沒(méi)有完善仗岸,在這一...
    lable閱讀 512評(píng)論 0 0
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線(xiàn)程允耿,因...
    小菜c閱讀 6,402評(píng)論 0 17