void moveStone(int moveid, int killid, int x, int y);void moveComplete(CCNode*, void*);bool canMove(int moveid, int killid, int x, int y);bool canMoveJiang(int moveid, int killid, int x, int y);bool canMoveShi(int moveid, int x, int y);bool canMoveXiang(int moveid, int x, int y);bool canMoveChe(int moveid, int x, int y);bool canMoveMa(int moveid, int x, int y);bool canMovePao(int moveid, int killid, int x, int y);bool canMoveBing(int moveid, int x, int y);int getStoneCount(int xo, int yo, int x, int y);
總函數 bool SceneGame::canMove(int moveid, int killid, int x, int y) { Stone *s=_s[moveid]; switch(s->getType()) { case Stone::JIANG: return canMoveJiang(moveid, killid, x, y);
將的移動 bool SceneGame::canMoveJiang(int moveid, int killid, int x, int y) {
if(killid!=-1){Stone* skill = _s[killid];if(skill->getType() == Stone::JIANG){return canMoveChe(moveid, x, y);}}//can only walk one step and can not walk out the lattic also can kill the kingStone *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 x, 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;
相的移動 bool SceneGame::canMoveXiang(int moveid, int x, 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 x, int y)
{Stone *s=_s[moveid];int xo=s->getX();int yo=s->getY();if(getStoneCount(xo,yo,x,y)!=0)return false;return true;
}bool SceneGame::canMoveMa(int moveid, int x, 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 killid, int x, int y) { Stone* s = _s[moveid]; int xo = s->getX(); int yo = s->getY();
if(killid != -1 && this->getStoneCount(xo, yo, x, y) == 1){return true;}else if(killid==-1){return canMoveChe(moveid,x,y);}return false;}
兵的移動
bool SceneGame::canMoveBing(int moveid, int x, 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;
}