Cocos2d-X开发中国象棋《八》走棋
在上一节中实现了新局,至此中国象棋的准备工作差点儿相同都完毕了,在接下来的博客中将介绍玩家的走棋和一些游戏属性的设置,今天先介绍走棋和走棋规则
老规则,先看走棋的效果图,然后依据效果图一步一步分析游戏逻辑,最后会贴出代码
走棋分为两个步骤:
第一步选棋:通过点击棋子实现选棋子,当选中某个棋子的时候,选择框会套在选中的棋子上
第二步走棋:通过点击棋盘上的位置能够实现棋子的移动,当点击的位置是同意棋子移动的位置时,棋子会移动到点击的位置
走棋的实现思路
1、游戏走棋时採用红先黑后原则,红棋和黑棋轮流走
2、通过点击选择须要走的棋子
3、当点击的位置上有棋子的时候,棋子上显示选择框,而且记录点击了一次
4、当点击的位置上没有棋子的时候,推断上次是否点击了棋子,假设上一次点击了棋子,则将棋子移动到第二次点中的位置上
5、游戏走棋时採用红先黑后原则,红棋和黑棋轮流走
实现代码
首先在SceneGame.h中声明一个ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)函数,然后在SceneGame.cpp中定义ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
//通过点击选择棋子,走棋子
bool SceneGame::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
{
CCObject* obj = (CCObject*)pTouch; //获取触摸点的窗体坐标
CCPoint ptInWin = pTouch->getLocation(); //当触摸到了游戏结果框
if(sprite->boundingBox().containsPoint(ptInWin) && visible == true)
{
//隐藏结果
HideResult(sprite, obj);
}
else if(sprite1->boundingBox().containsPoint(ptInWin) && visible == true)
{
//隐藏结果
HideResult(sprite1, obj);
} int x, y;//保存触摸点的棋盘坐标 //通过触摸点的窗体坐标获取棋盘的x坐标和y坐标
if(!getClickPos(ptInWin, x, y))
{
return false;
} //通过触摸点在棋盘中的坐标获取选中的棋子的id
int clickid = getStone(x, y);
//当触摸点的位置上有棋子的时候,clickid为选中的棋子的id,表示玩家在选棋
//当触摸点的位置上没有棋子的时候,clickid为-1,表示玩家在走棋 //-1 == _selectid表示没有选中棋子
if(-1 == _selectid)
{
setSelectId(clickid);
}
else
{
//移动棋子
//第一个參数:移动的棋子的id
//第二个參数:通过触摸点的位置推断触摸点上是否有棋子
//第三个參数:触摸点的x坐标
//第四个參数:触摸点的y坐标
//moveStone运行了两个步骤选棋和走棋
//选棋子:当_selectid == clickid时,表示选定了id为_selectid的棋子
//走棋子:当selectid != clickid时, 表示将id为_selectid的棋子移动到(x,y)所在的位置上
moveStone(_selectid, clickid, x, y);
} // CCLog("_selectid=%d, clickid=%d", _selectid, clickid);
//CCLog("x=%d, y=%d", x, y); return true;
}
在SceneGame.h中声明一个成员函数MoveStone()实现移动棋子
//移动棋子
//第一个參数:移动的棋子的id
//第二个參数:通过触摸点的位置推断触摸点上是否有棋子
//第三个參数:触摸点的x坐标
//第四个參数:触摸点的y坐标
void SceneGame::moveStone(int moveId, int killId, int x, int y)
{
//killId != -1表示触摸点的位置上有一个棋子
//_s[moveId]->getRed() == _s[killId]->getRed()表示触摸点上
//的棋子和走棋的棋子的颜色同样
if(killId != -1 && _s[moveId]->getRed() == _s[killId]->getRed())
{
//更换选择框
setSelectId(killId); return;
} //CCLog("killId=%d, moveId=%d", killId, moveId);
//CCLog("_s[moveId]->getRed()=%d", _s[moveId]->getRed()); //走棋规则
bool bCanMove = canMove(moveId, killId, x, y); //假设bCanMove为false
//不能走棋
if(false == bCanMove)
{
return;
} //走棋之前记录棋子的信息
//第一个參数:须要移动的棋子的id
//第二个參数:通过触摸点的位置推断触摸点上是否有棋子
//第三个參数:棋子当前的位置的x坐标
//第四个參数:棋子当前的位置的y坐标
//第五个參数:棋子移动后的位置的x坐标
//第六个參数:棋子移动后的位置的y坐标
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));
//SetRealPos(_s[moveId]); //设置移动棋子时的动作
CCMoveTo* move = CCMoveTo::create(.5f, getStonePos(x, y)); //动作回调
CCCallFuncND* call = CCCallFuncND::create(this,
callfuncND_selector(SceneGame::moveComplete),
(void*)(intptr_t)killId); //设置动作的运行顺序(先移动棋子,后调用回调函数)
CCSequence* seq = CCSequence::create(move, call, NULL); //设置移动的棋子的优先级
_s[moveId]->setZOrder(_s[moveId]->getZOrder() + 1); //运行棋子移动的动作
_s[moveId]->runAction(seq);
}
Cocos2d-X开发中国象棋《八》走棋的更多相关文章
- Cocos2d-X开发中国象棋《二》project文件概述
我在上一篇博客中介绍了象棋的功能.在接下来的博客中将向大家介绍使用Cocos2d-X怎样一步一步开发中国象棋 开发工具: Cocos2d-X2.2.3 VS2012 项目的文件夹: Classes:存 ...
- Cocos2d-X开发中国象棋《九》走棋规则
在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...
- Cocos2d-X开发中国象棋《三》開始场景的实现
在前面两节(第一节.第二节)中介绍了中国象棋的功能和project文件.在这篇博客中将介绍中国象棋的開始场景的实现 在写代码前先理清一下实现開始场景的思路: 1.打开游戏后进入開始场景,场景上显示一个 ...
- Python开发中国象棋实战(附源码)
Pygame 做的中国象棋,一直以来喜欢下象棋,写了 python 就拿来做一个试试,水平有限,电脑走法水平低,需要在下次版本中更新电脑走法,希望源码能帮助大家更好的学习 python.总共分 ...
- Cocos2d-X开发中国象棋《四》设计游戏场景
设计完開始界面后就要设计游戏界面了 为了理清设计思路先看一张游戏界面效果图 游戏界面设计思路: 1.在窗体上放一张桌子 2.在桌子上放一个棋盘 3.在棋盘右边加入新局button,暂不实现详细的功能 ...
- cocos2d-x游戏开发系列教程-中国象棋00-前言
象棋描述 在说代码之前,我们先让象棋效果登场,以方便大家对代码的理解 欢迎界面 中国象棋程序,运行起来的第一个界面是一个欢迎界面,该欢迎界面在停留一秒后进入游戏界面 游戏主界面 新局:所有棋子归位,状 ...
- JavaScript中国象棋程序(3) - 电脑自动走棋
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第3节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- 中国象棋游戏Chess(3) - 实现走棋规则
棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...
- 中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...
随机推荐
- BZOJ 1572 贪心(priority_queue)
思路: 维护两个堆 一个按时间 (从后到前)的 另一个是按价值(从大到小)的 从时间的堆向价值的堆倒 每回(合法状态下)取当前的堆顶 判一判 //By SiriusRen #include <q ...
- API集合开发文档
百度翻译api https://www.cnblogs.com/DevilX5/p/7079470.html 实现QQ第三方登录.网站接入 http://blog.csdn.net/u01067894 ...
- OpenCV —— 图像局部与分割(二)
分水岭算法 将图像中的边缘转化成“山脉”,将均匀区域转化为“山谷” 分水岭算法首先计算灰度图像的梯度,这对山谷或没有纹理的盆地(亮度值低的点)的形成有效,也对山头或图像中没有主导线段的山脉(山脊对应的 ...
- Codefroces Educational Round 27 845G Shortest Path Problem?
Shortest Path Problem? You are given an undirected graph with weighted edges. The length of some pat ...
- spring webSocket The HTTP response from the server [200] did not permit the HTTP upgrade to WebSocket
在springboot 1.5.9版本 WebSocketConfig配置 registry.addEndpoint("/webSocket").withSockJS();在加了. ...
- HDU 1576 A/B 数论水题
http://acm.hdu.edu.cn/showproblem.php?pid=1576 写了个ex_gcd的模板...太蠢导致推了很久的公式 这里推导一下: 因为 1 = BX + 9973Y ...
- 今日题解------codeforce 893d
题意:给你一个数列,小于零表示表示信用卡里取出钱,大于零表示信用卡里存钱,等于零表示要查询信用卡, 如果被查到信用卡里的钱小于零,那你就GG,或者在任何时候你的信用卡里的钱大于d的话(不需要找ai等于 ...
- 让checkbox不选中
今天在做项目的时候.遇到一个问题.须要把选中的checkbox置空,即将选中的checkbox不选中. 最后,发现一个方法非常好使,特此记录. $("input[type='checkbox ...
- Oracle Sqlplus中上下键出现^[[A乱码问题
安装rlwrap 下载:http://utopia.knoware.nl/~hlub/uck/rlwrap/ 或者 百度云盘:http://pan.baidu.com/s/1ntM8YXr 须要先安 ...
- 购买VPS时机房的选择
购买VPS时机房的选择 对于配置差不多的VPS,距离越近的一般网速越快,所以有必要使用谷歌地图,查看城市的所在位置 比如ChicagoVPS,不时有邮件销售它的VPS,虽然说不上怎么好,但是一般的使用 ...