首页 技术 正文
技术 2022年11月21日
0 收藏 430 点赞 2,873 浏览 4050 个字

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;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,557
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898