1. 程式人生 > >cocos2d-x遊戲開發系列教程-中國象棋04-擺棋

cocos2d-x遊戲開發系列教程-中國象棋04-擺棋

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

前情回顧

在之前的學習中,我們已經瞭解到,下棋主介面是由CCMainMenu類實現的,在它的init函式中,初始化了

主介面需要的各種資料,包括:建立控制元件,初始化32個棋子,初始化執行變數等等,在這個博文中,我們

主要來學習,32個棋子是如何被初始化並顯示在介面上的。這個顯示和initCoordinate以及

瞭解32個棋子顯示在介面的目的,是為了讓大家更好理解32個棋子的資料結構,這些資料結構在當棋子走動

時,需要改動,所以必須要理解。


initCoordinate

void CCMainMenu::initCoordinate(){ /*std::string str = "../coordinate.txt"; std::ofstream f_output; f_output.open(str.c_str(), std::ios::app);*/
 float xSpan  = 48.0f*0.667ffloat ySpan  = 32.0f*0.6ffloat xStart = 1float yStart = xSpan; for (int i = 0, x = 9; i < 10; ++i, --x) {  for (int j = 0, y = 1; j < 9; ++j, ++y)  {   g_chess_coord[i][j] = ccp(xStart + xSpan*y, yStart*x + ySpan);  // 計算象棋座標點的座標,把象棋座標轉化成view座標
   /*f_output<< "[" << i << "][" << j <<"]: (" << xStart + xSpan*y << ", " << yStart*x + ySpan << ")" << " ";   if(j == 4 || j == 8)   {    f_output<<std::endl;   }*/  }  /*f_output<<std::endl;*/ } /*f_output.close();*/}

這個函式功能是將象棋的座標轉化成螢幕座標,並儲存在g_chess_coord中。有了這些座標,為後面的擺棋工作打下基礎。

initListImage

initListImage函式,初始化了32個棋子的位置,程式碼的邏輯很簡單,就是呼叫32次getListSprite,獲得32個棋子精靈並儲存在m_pChess中

然後呼叫initChessPosition去設定32個棋子的位置,程式碼在MainMenu.cpp中

void CCMainMenu::initListImage(){ // red m_pChess[1][0] = this->getListSprite(CHESS_RK); this->addChild(m_pChess[1][0], 0); m_pChess[1][1] = this->getListSprite(CHESS_RA); this->addChild(m_pChess[1][1], 0); m_pChess[1][2] = this->getListSprite(CHESS_RA); this->addChild(m_pChess[1][2], 0); m_pChess[1][3] = this->getListSprite(CHESS_RB); this->addChild(m_pChess[1][3], 0); m_pChess[1][4] = this->getListSprite(CHESS_RB); this->addChild(m_pChess[1][4], 0); m_pChess[1][5] = this->getListSprite(CHESS_RN); this->addChild(m_pChess[1][5], 0); m_pChess[1][6] = this->getListSprite(CHESS_RN); this->addChild(m_pChess[1][6], 0); m_pChess[1][7] = this->getListSprite(CHESS_RR); this->addChild(m_pChess[1][7], 0); m_pChess[1][8] = this->getListSprite(CHESS_RR); this->addChild(m_pChess[1][8], 0); m_pChess[1][9] = this->getListSprite(CHESS_RC); this->addChild(m_pChess[1][9], 0);  m_pChess[1][10] = this->getListSprite(CHESS_RC); this->addChild(m_pChess[1][10], 0); m_pChess[1][11] = this->getListSprite(CHESS_RP); this->addChild(m_pChess[1][11], 0); m_pChess[1][12] = this->getListSprite(CHESS_RP); this->addChild(m_pChess[1][12], 0); m_pChess[1][13] = this->getListSprite(CHESS_RP); this->addChild(m_pChess[1][13], 0); m_pChess[1][14] = this->getListSprite(CHESS_RP); this->addChild(m_pChess[1][14], 0); m_pChess[1][15] = this->getListSprite(CHESS_RP); this->addChild(m_pChess[1][15], 0); //black m_pChess[0][0] = this->getListSprite(CHESS_BK); this->addChild(m_pChess[0][0], 0); m_pChess[0][1] = this->getListSprite(CHESS_BA); this->addChild(m_pChess[0][1], 0); m_pChess[0][2] = this->getListSprite(CHESS_BA); this->addChild(m_pChess[0][2], 0); m_pChess[0][3] = this->getListSprite(CHESS_BB); this->addChild(m_pChess[0][3], 0); m_pChess[0][4] = this->getListSprite(CHESS_BB); this->addChild(m_pChess[0][4], 0); m_pChess[0][5] = this->getListSprite(CHESS_BN); this->addChild(m_pChess[0][5], 0); m_pChess[0][6] = this->getListSprite(CHESS_BN); this->addChild(m_pChess[0][6], 0); m_pChess[0][7] = this->getListSprite(CHESS_BR); this->addChild(m_pChess[0][7], 0); m_pChess[0][8] = this->getListSprite(CHESS_BR); this->addChild(m_pChess[0][8], 0); m_pChess[0][9] = this->getListSprite(CHESS_BC); this->addChild(m_pChess[0][9], 0); m_pChess[0][10] = this->getListSprite(CHESS_BC); this->addChild(m_pChess[0][10], 0); m_pChess[0][11] = this->getListSprite(CHESS_BP); this->addChild(m_pChess[0][11], 0); m_pChess[0][12] = this->getListSprite(CHESS_BP); this->addChild(m_pChess[0][12], 0); m_pChess[0][13] = this->getListSprite(CHESS_BP); this->addChild(m_pChess[0][13], 0); m_pChess[0][14] = this->getListSprite(CHESS_BP); this->addChild(m_pChess[0][14], 0); m_pChess[0][15] = this->getListSprite(CHESS_BP); this->addChild(m_pChess[0][15], 0); this->initChessPosition();}

getListSprite

這個函式負責建立棋子精靈,根據不同的棋子型別,使用不同的圖片建立精靈,在你們自己的環境中,尤其注意圖片路徑

圖片路勁不對,那什麼都不顯示,所以如果有錯,先考慮是不是圖片路徑不對了。

CCSprite* CCMainMenu::getListSprite(CHESS_TYPE nType){ CCSprite* pSprite; switch(nType) { case CHESS_RK:  pSprite = CCSprite::create(RES_PATH"rk.png");  breakcase CHESS_RA:  pSprite = CCSprite::create(RES_PATH"ra.png");  breakcase CHESS_RB:   pSprite = CCSprite::create(RES_PATH"rb.png");  breakcase CHESS_RN:   pSprite = CCSprite::create(RES_PATH"rn.png");  breakcase CHESS_RR:   pSprite = CCSprite::create(RES_PATH"rr.png");  breakcase CHESS_RC:  pSprite = CCSprite::create(RES_PATH"rc.png");  breakcase CHESS_RP:   pSprite = CCSprite::create(RES_PATH"rp.png");  breakcase CHESS_BK:  pSprite = CCSprite::create(RES_PATH"bk.png");  breakcase CHESS_BA:  pSprite = CCSprite::create(RES_PATH"ba.png");  breakcase CHESS_BB:   pSprite = CCSprite::create(RES_PATH"bb.png");  breakcase CHESS_BN:   pSprite = CCSprite::create(RES_PATH"bn.png");  breakcase CHESS_BR:   pSprite = CCSprite::create(RES_PATH"br.png");  breakcase CHESS_BC:  pSprite = CCSprite::create(RES_PATH"bc.png");  breakcase CHESS_BP:  pSprite = CCSprite::create(RES_PATH"bp.png");  break; } pSprite->setScaleX(0.5f); pSprite->setScaleY(0.5f); return pSprite;}

initChessPosition

initListImage最後呼叫的是initChessPosition,為32個棋子指定位置。這裡位置資訊用到了g_chess_coord,這個座標資訊是之前函式

void CCMainMenu::initChessPosition(){ m_pChess[1][0]->setPosition(g_chess_coord[9][4]); m_pChess[1][1]->setPosition(g_chess_coord[9][3]); m_pChess[1][2]->setPosition(g_chess_coord[9][5]); m_pChess[1][3]->setPosition(g_chess_coord[9][2]); m_pChess[1][4]->setPosition(g_chess_coord[9][6]); m_pChess[1][5]->setPosition(g_chess_coord[9][1]); m_pChess[1][6]->setPosition(g_chess_coord[9][7]); m_pChess[1][7]->setPosition(g_chess_coord[9][0]); m_pChess[1][8]->setPosition(g_chess_coord[9][8]); m_pChess[1][9]->setPosition(g_chess_coord[7][1]); m_pChess[1][10]->setPosition(g_chess_coord[7][7]); m_pChess[1][11]->setPosition(g_chess_coord[6][0]); m_pChess[1][12]->setPosition(g_chess_coord[6][2]); m_pChess[1][13]->setPosition(g_chess_coord[6][4]); m_pChess[1][14]->setPosition(g_chess_coord[6][6]); m_pChess[1][15]->setPosition(g_chess_coord[6][8]); //black m_pChess[0][0]->setPosition(g_chess_coord[0][4]); m_pChess[0][1]->setPosition(g_chess_coord[0][3]); m_pChess[0][2]->setPosition(g_chess_coord[0][5]); m_pChess[0][3]->setPosition(g_chess_coord[0][2]); m_pChess[0][4]->setPosition(g_chess_coord[0][6]); m_pChess[0][5]->setPosition(g_chess_coord[0][1]); m_pChess[0][6]->setPosition(g_chess_coord[0][7]); m_pChess[0][7]->setPosition(g_chess_coord[0][0]); m_pChess[0][8]->setPosition(g_chess_coord[0][8]); m_pChess[0][9]->setPosition(g_chess_coord[2][1]); m_pChess[0][10]->setPosition(g_chess_coord[2][7]); m_pChess[0][11]->setPosition(g_chess_coord[3][0]); m_pChess[0][12]->setPosition(g_chess_coord[3][2]); m_pChess[0][13]->setPosition(g_chess_coord[3][4]); m_pChess[0][14]->setPosition(g_chess_coord[3][6]); m_pChess[0][15]->setPosition(g_chess_coord[3][8]);}

好,當程式完全執行完這些程式碼後,就完成了32個棋子的初始化。

下一遍博文我們講講述這個象棋是怎麼走起來


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述