cocos2dx实现象棋之运动

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, 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);

要实现象棋的运动,首先要确定选中的目标,再其次确定选中的位置,再确定选择的位置是否有对方棋子

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 killid, int x, 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, killid, _s[moveid]->getX(),_s[moveid]->getY(), x, 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 killid, int x, int y)
{
Stone *s=_s[moveid];
switch(s->getType())
{
case Stone::JIANG:
return canMoveJiang(moveid, killid, x, y);

    case Stone::SHI:
        return canMoveShi(moveid, x, y);

    case Stone::XIANG:
        return canMoveXiang(moveid, x, y);

    case Stone::CHE:
        return canMoveChe(moveid, x, y);

    case Stone::MA:
        return canMoveMa(moveid, x, y);

    case Stone::PAO:
        return canMovePao(moveid, killid, x, y);

    case Stone::BING:
        return canMoveBing(moveid, x, y);
    }

    return false;
}

将的移动
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 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 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;

    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 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;
}
原文地址:https://www.cnblogs.com/jjx2013/p/6223763.html