cocos2dx实现象棋之运动

cocos2dx实现象棋之运动,第1张

概述1、头文件 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 1、头文件
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实现象棋之运动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1077863.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存