上一节中实现了新局,至此中国象棋的准备工作差点儿相同都完毕了,在接下来的博客中将介绍玩家的走棋和一些游戏属性的设置,今天先介绍走棋和走棋规则

老规则,先看走棋的效果图,然后依据效果图一步一步分析游戏逻辑,最后会贴出代码

走棋分为两个步骤:

第一步选棋:通过点击棋子实现选棋子,当选中某个棋子的时候,选择框会套在选中的棋子上

第二步走棋:通过点击棋盘上的位置能够实现棋子的移动,当点击的位置是同意棋子移动的位置时,棋子会移动到点击的位置

走棋的实现思路

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开发中国象棋《八》走棋的更多相关文章

  1. Cocos2d-X开发中国象棋《二》project文件概述

    我在上一篇博客中介绍了象棋的功能.在接下来的博客中将向大家介绍使用Cocos2d-X怎样一步一步开发中国象棋 开发工具: Cocos2d-X2.2.3 VS2012 项目的文件夹: Classes:存 ...

  2. Cocos2d-X开发中国象棋《九》走棋规则

    在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...

  3. Cocos2d-X开发中国象棋《三》開始场景的实现

    在前面两节(第一节.第二节)中介绍了中国象棋的功能和project文件.在这篇博客中将介绍中国象棋的開始场景的实现 在写代码前先理清一下实现開始场景的思路: 1.打开游戏后进入開始场景,场景上显示一个 ...

  4. Python开发中国象棋实战(附源码)

        Pygame 做的中国象棋,一直以来喜欢下象棋,写了 python 就拿来做一个试试,水平有限,电脑走法水平低,需要在下次版本中更新电脑走法,希望源码能帮助大家更好的学习 python.总共分 ...

  5. Cocos2d-X开发中国象棋《四》设计游戏场景

    设计完開始界面后就要设计游戏界面了 为了理清设计思路先看一张游戏界面效果图 游戏界面设计思路: 1.在窗体上放一张桌子 2.在桌子上放一个棋盘 3.在棋盘右边加入新局button,暂不实现详细的功能 ...

  6. cocos2d-x游戏开发系列教程-中国象棋00-前言

    象棋描述 在说代码之前,我们先让象棋效果登场,以方便大家对代码的理解 欢迎界面 中国象棋程序,运行起来的第一个界面是一个欢迎界面,该欢迎界面在停留一秒后进入游戏界面 游戏主界面 新局:所有棋子归位,状 ...

  7. JavaScript中国象棋程序(3) - 电脑自动走棋

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第3节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  8. 中国象棋游戏Chess(3) - 实现走棋规则

    棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...

  9. 中国象棋游戏Chess(2) - 走棋

    之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...

随机推荐

  1. BZOJ 1572 贪心(priority_queue)

    思路: 维护两个堆 一个按时间 (从后到前)的 另一个是按价值(从大到小)的 从时间的堆向价值的堆倒 每回(合法状态下)取当前的堆顶 判一判 //By SiriusRen #include <q ...

  2. API集合开发文档

    百度翻译api https://www.cnblogs.com/DevilX5/p/7079470.html 实现QQ第三方登录.网站接入 http://blog.csdn.net/u01067894 ...

  3. OpenCV —— 图像局部与分割(二)

    分水岭算法 将图像中的边缘转化成“山脉”,将均匀区域转化为“山谷” 分水岭算法首先计算灰度图像的梯度,这对山谷或没有纹理的盆地(亮度值低的点)的形成有效,也对山头或图像中没有主导线段的山脉(山脊对应的 ...

  4. 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 ...

  5. 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();在加了. ...

  6. HDU 1576 A/B 数论水题

    http://acm.hdu.edu.cn/showproblem.php?pid=1576 写了个ex_gcd的模板...太蠢导致推了很久的公式 这里推导一下: 因为 1 = BX + 9973Y ...

  7. 今日题解------codeforce 893d

    题意:给你一个数列,小于零表示表示信用卡里取出钱,大于零表示信用卡里存钱,等于零表示要查询信用卡, 如果被查到信用卡里的钱小于零,那你就GG,或者在任何时候你的信用卡里的钱大于d的话(不需要找ai等于 ...

  8. 让checkbox不选中

    今天在做项目的时候.遇到一个问题.须要把选中的checkbox置空,即将选中的checkbox不选中. 最后,发现一个方法非常好使,特此记录. $("input[type='checkbox ...

  9. Oracle Sqlplus中上下键出现^[[A乱码问题

    安装rlwrap  下载:http://utopia.knoware.nl/~hlub/uck/rlwrap/ 或者 百度云盘:http://pan.baidu.com/s/1ntM8YXr 须要先安 ...

  10. 购买VPS时机房的选择

    购买VPS时机房的选择 对于配置差不多的VPS,距离越近的一般网速越快,所以有必要使用谷歌地图,查看城市的所在位置 比如ChicagoVPS,不时有邮件销售它的VPS,虽然说不上怎么好,但是一般的使用 ...