
voID moveStone(int moveID,int killID,int x,int y); voID moveComplete(CCNode*,voID*); bool canMove(int moveID,int y); bool canMoveJiang(int moveID,int y); bool canMoveShi(int moveID,int y); bool canMoveXiang(int moveID,int y); bool canMoveChe(int moveID,int y); bool canMoveMa(int moveID,int y); bool canMovePao(int moveID,int y); bool canMoveBing(int moveID,int y); int getStoneCount(int xo,int yo,int y);要实现象棋的运动,首先要确定选中的目标,再其次确定选中的位置,再确定选择的位置是否有对方棋子
voID SceneGame::setSelectID(int ID){ if(ID==-1) { return; } if(_s[ID]->getRed()!=_redTrun) return; _selectID=ID; _selectSprite->setVisible(true); _selectSprite->setposition(_s[_selectID]->getposition());} voID SceneGame::moveStone(int moveID,int y)
{
if(killID != -1&&_s[moveID]->getRed()==_s[killID]->getRed())
{
setSelectID(killID);
return;
}
bool bCanMove = canMove(moveID,killID,x,y); if(bCanMove == false) return; //set step SteP* step = Step::create(moveID,_s[moveID]->getX(),_s[moveID]->getY(),y); _steps->addobject(step); _s[moveID]->setX(x); _s[moveID]->setY(y); //_s[moveID]->setposition(getStonePos(x,y)); CCMoveto *moveto=CCMoveto::create(.5f,getStonePos(x,y)); CCCallFuncND *call=CCCallFuncND::create(this,callfuncND_selector(SceneGame::moveComplete),(voID*)(intptr_t)killID); CCSequence *sequence=CCSequence::create(moveto,call,NulL); _s[moveID]->setZOrder(_s[moveID]->getZOrder()+1); _s[moveID]->runAction(sequence); //_selectID=-1; //_selectSprite->setVisible(false); //_redTrun=!_redTrun;}不同的棋子运动规则不同,车,马,炮等都有不同的运动方式
总函数
bool SceneGame::canMove(int moveID,int y)
{
Stone *s=_s[moveID];
switch(s->getType())
{
case Stone::JIANG:
return canMoveJiang(moveID,y);
case Stone::SHI: return canMoveShi(moveID,y); case Stone::XIANG: return canMoveXiang(moveID,y); case Stone::CHE: return canMoveChe(moveID,y); case Stone::MA: return canMoveMa(moveID,y); case Stone::PAO: return canMovePao(moveID,y); case Stone::BING: return canMoveBing(moveID,y); } return false;}
将的移动
bool SceneGame::canMoveJiang(int moveID,int y)
{
if(killID!=-1) { Stone* skill = _s[killID]; if(skill->getType() == Stone::JIANG) { return canMoveChe(moveID,y); } } //can only walk one step and can not walk out the lattic also can kill the king Stone *s=_s[moveID]; int xo=s->getX(); int yo=s->getY(); int xoff=abs(xo-x); int yoff=abs(yo-y); int d = xoff*10 + yoff; if(d != 1 && d != 10) return false; if(x<3||x>5) return false; if(_redSIDe==s->getRed()) { if(y<0||y>2) return false; }else { if(y < 7 || y > 9) return false; } return true;} 士的移动
bool SceneGame::canMoveShi(int moveID,int y)
{
Stone *s=_s[moveID];
int xo=s->getX();
int yo=s->getY();
int xoff=abs(xo-x);
int yoff=abs(yo-y);
int d = xoff*10 + yoff;
if(d != 11) return false;
if(x<3||x>5) return false; if(_redSIDe==s->getRed()) { if(y<0||y>2) return false; }else { if(y < 7 || y > 9) return false; } return true;} 相的移动
bool SceneGame::canMoveXiang(int moveID,int y)
{
Stone *s=_s[moveID];
int xo=s->getX();
int yo=s->getY();
int xoff=abs(xo-x);
int yoff=abs(yo-y);
int d = xoff*10 + yoff;
if(d != 22) return false;
int xm=(xo+x)/2; int ym=(yo+y)/2; int ID=getStone(xm,ym); if(ID!=-1) { return false; } if(_redSIDe == s->getRed()) { if(y>4) return false; } else { if(y<5) return false; } return true;}车的移动bool SceneGame::canMoveChe(int moveID,int y){ Stone *s=_s[moveID]; int xo=s->getX(); int yo=s->getY(); if(getStoneCount(xo,yo,y)!=0) return false; return true;}bool SceneGame::canMoveMa(int moveID,int y){ Stone* s = _s[moveID]; int xo = s->getX(); int yo = s->getY(); int xoff = abs(xo-x); int yoff = abs(yo-y); int d = xoff*10 + yoff; if(d != 12 && d != 21) return false; int xm,ym; if(d==12) { xm=xo; ym=(yo+y)/2; }else { xm=(xo+x)/2; ym=yo; } if(getStone(xm,ym)!=-1) return false; return true;} 炮的移动
bool SceneGame::canMovePao(int moveID,int y)
{
Stone* s = _s[moveID];
int xo = s->getX();
int yo = s->getY();
if(killID != -1 && this->getStoneCount(xo,y) == 1) { return true; } else if(killID==-1) { return canMoveChe(moveID,y); } return false;}兵的移动bool SceneGame::canMoveBing(int moveID,int y){ Stone* s = _s[moveID]; int xo = s->getX(); int yo = s->getY(); int xoff = abs(xo-x); int yoff = abs(yo-y); int d = xoff*10 + yoff; if(d != 1 && d != 10) return false; if(_redSIDe==s->getRed()) { if(y<yo) return false; if(yo<=4&&y==yo) return false; }else { if(y>yo) return false; if(yo>=5&&y==yo) return false; } return true;} 总结 以上是内存溢出为你收集整理的cocos2dx实现象棋之运动全部内容,希望文章能够帮你解决cocos2dx实现象棋之运动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)