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;
}

cocos2dx实现象棋之运动的更多相关文章

  1. Cocos2d-x加速度计实例:运动的小球

    下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计.该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置. 下面我们再看看具 ...

  2. Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋

    在博客上,以实现创建的游戏场景.而一些button,因为button落实到事件作出详细答复,需要使用一些功能摆棋.为此我特意button上的背面的具体实施, 在摆棋前先理清一下摆棋的思路: 1.创建一 ...

  3. Cocos2dx实现象棋之布局

    开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGa ...

  4. 关于Cocos2d-x中让主角运动的方法

    比如要让角色跳起来 1.如果是用到物理引擎,那么在物理世界中,可以用 hero->getPhysicsBody()->setVelocity(Vec2(0, 400));  //给主角一个 ...

  5. Cocos2d-x中由sprite来驱动Box2D的body运动(用来制作平台游戏中多变的机关)

    好久都没写文章了,就来一篇吧.这种方法是在制作<胖鸟大冒险>时用到的.<胖鸟大冒险>中使用Box2D来进行物理模拟和碰撞检測,因此对每一个机关须要创建一个b2body.然后&l ...

  6. cocos2dx 运动+旋转动画 CCSequence CCAnimation CCAnimate CCMoveTo CCCallFuncN

    cocos2dx 动画是个非常奇妙的东西~~. 这里看到的是一个物体,在运动的过程中会不断地翻转的过程. 两个动画一起来~~ 以下的代码中涉及到:CCAnimation(补间动画 )  CCAnima ...

  7. cocos2d-x游戏开发系列教程-中国象棋06-游戏规则

    前情回顾 上一个博文我们提到象棋运动的函数dealWithChess,但是只是说该函数完成了棋子的选择和移动功能 其实在这个函数里,在移动棋子之前,是要对棋子的移动是否合法进行判断的,我们一起来看看如 ...

  8. cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

    之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...

  9. cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述

    上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...

随机推荐

  1. hdu 2085 核反应堆

    看完题,想到用结构体存储高质点和低质点,然后打表存储<33的质点数量. #include<stdio.h> struct hilo { long long hi,lo; }; int ...

  2. 锋利的jQuery-7--$.extend()

    $.extend()主要有两个功能: 1.扩展jQuery对象 jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, }) ...

  3. html表单验证程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Mongodb c#增删改查

    写在前面 最近项目需要,就研究了下mongodb,也是为了快速上手,就自己弄了一个简单的例子,这里记录一下. Mongodb 传统的关系数据库一般由数据库(database).表(table).记录( ...

  5. Linux中用st_mode判断文件类型

    Linux中用st_mode判断文件类型 2012-12-11 12:41 14214人阅读 评论(4) 收藏 举报  分类: Linux(8)  C/C++(20)  版权声明:本文为博主原创文章, ...

  6. JSON做下拉表格

    主页面,5-18j.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  7. java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程

    用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. ...

  8. tomcat配置文件之Server.xml

    Server.xml包含的元素有<Server>.<Service>.<Connector>.<Engine>.<Host>.<Con ...

  9. HTML快速入门2

    三.版面风格控制 1. 字体控制 A. 字体大小 用 <font Size=#> 和 </font> 表示,#为字号: 1 - 7 ,缺省为 3 ,可用 <basefon ...

  10. Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】

    Laravel 5 系列入门教程(一)[最适合中国人的 Laravel 教程] 分享⋅ johnlui⋅ 于 2年前 ⋅ 最后回复由 skys215于 11个月前 ⋅ 17543 阅读   原文发表在 ...