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. Alpha阶段个人总结

    一. 工作总结 第一次接触通信和服务端框架,在前期准备阶段学习了很多不同的技术,也相应花费了很多时间去尝试.刚开始时还不知道框架这种东西,准备自己写,于是学习并尝试了一些简单的HTTP通信,比较麻烦, ...

  2. HDU #3333

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Descript ...

  3. MongoDB的增删改查 转

    MongoDB的增删改查 (黎明你好原创作品,转载请注明) MongoDB中数据的基本单元叫做文档,采用json的键-值的方式.多个键及其关联的值有序的存放在一起变是文档.类似于编程语言中的键值关系. ...

  4. 初学Hibernate之Query扩展

    1.hql参数化查询,不明确值类型的用setParameter方法:明确查询结果为一条记录的用uniqueResult方法查询 注意,参数化查询中方法setString 或 setParameter如 ...

  5. 初学structs2,表单验证简单补充

    一.使用注解方式,跳过验证某个方法 由于在开发中,我们不需在请求每一个action类中的方法时都要走validate方法,那么我们可以在这些不需要验证的方法上加上@SkipValidation注解即可 ...

  6. mysql cluster (mysql 集群)安装配置方案(转)

    一.准备 1.准备服务器 计划建立有5个节点的MySQL CLuster体系,需要用到5台服务器,但是我们做实验时没有这么多机器,可以只用2台,我就是一台本机,一台虚拟机搭建了有5个节点的MySQL ...

  7. C++中map的概念,与简单操作

     来源:http://blog.csdn.net/wallwind/article/details/6876892 C++map学习   map<Key, Data, Compare, Allo ...

  8. ExtJS学习之路第八步:Window组件

    一个专门Panel用作程序窗口.默认的,Window可以是浮动的(floated).可缩放(resizable)以及可拖动的(draggable).Window能够被最大化适应可视窗口,(restor ...

  9. 第18章 使用MariaDB数据库管理系统

    章节概述: MYSQL数据库管理系统被Oracle公司收购后从开源换向到了封闭,导致包括红帽在内的许多Linux发行版选择了MariaDB. 本章节将教会您使用mariaDB数据库管理工具来管理数据库 ...

  10. 获取IOS 设备基本信息

    原地址:http://www.cnblogs.com/U-tansuo/p/ios_basis_info.html 1.获取设备类型  (Iphone/ipad 几?) #import "s ...