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

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

走棋分为两个步骤:

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

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

走棋的实现思路

1、游戏走棋时採用红先黑后原则,红棋和黑棋轮流走

2、通过点击选择须要走的棋子

3、当点击的位置上有棋子的时候,棋子上显示选择框,而且记录点击了一次

4、当点击的位置上没有棋子的时候,推断上次是否点击了棋子,假设上一次点击了棋子,则将棋子移动到第二次点中的位置上

5、游戏走棋时採用红先黑后原则,红棋和黑棋轮流走

实现代码

首先在SceneGame.h中声明一个ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)函数,然后在SceneGame.cpp中定义ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)

  1. //通过点击选择棋子,走棋子
  2. bool SceneGame::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
  3. {
  4. CCObject* obj = (CCObject*)pTouch;
  5.  
  6. //获取触摸点的窗体坐标
  7. CCPoint ptInWin = pTouch->getLocation();
  8.  
  9. //当触摸到了游戏结果框
  10. if(sprite->boundingBox().containsPoint(ptInWin) && visible == true)
  11. {
  12. //隐藏结果
  13. HideResult(sprite, obj);
  14. }
  15. else if(sprite1->boundingBox().containsPoint(ptInWin) && visible == true)
  16. {
  17. //隐藏结果
  18. HideResult(sprite1, obj);
  19. }
  20.  
  21. int x, y;//保存触摸点的棋盘坐标
  22.  
  23. //通过触摸点的窗体坐标获取棋盘的x坐标和y坐标
  24. if(!getClickPos(ptInWin, x, y))
  25. {
  26. return false;
  27. }
  28.  
  29. //通过触摸点在棋盘中的坐标获取选中的棋子的id
  30. int clickid = getStone(x, y);
  31. //当触摸点的位置上有棋子的时候,clickid为选中的棋子的id,表示玩家在选棋
  32. //当触摸点的位置上没有棋子的时候,clickid为-1,表示玩家在走棋
  33.  
  34. //-1 == _selectid表示没有选中棋子
  35. if(-1 == _selectid)
  36. {
  37. setSelectId(clickid);
  38. }
  39. else
  40. {
  41. //移动棋子
  42. //第一个參数:移动的棋子的id
  43. //第二个參数:通过触摸点的位置推断触摸点上是否有棋子
  44. //第三个參数:触摸点的x坐标
  45. //第四个參数:触摸点的y坐标
  46. //moveStone运行了两个步骤选棋和走棋
  47. //选棋子:当_selectid == clickid时,表示选定了id为_selectid的棋子
  48. //走棋子:当selectid != clickid时, 表示将id为_selectid的棋子移动到(x,y)所在的位置上
  49. moveStone(_selectid, clickid, x, y);
  50. }
  51.  
  52. // CCLog("_selectid=%d, clickid=%d", _selectid, clickid);
  53. //CCLog("x=%d, y=%d", x, y);
  54.  
  55. return true;
  56. }

在SceneGame.h中声明一个成员函数MoveStone()实现移动棋子

  1. //移动棋子
  2. //第一个參数:移动的棋子的id
  3. //第二个參数:通过触摸点的位置推断触摸点上是否有棋子
  4. //第三个參数:触摸点的x坐标
  5. //第四个參数:触摸点的y坐标
  6. void SceneGame::moveStone(int moveId, int killId, int x, int y)
  7. {
  8. //killId != -1表示触摸点的位置上有一个棋子
  9. //_s[moveId]->getRed() == _s[killId]->getRed()表示触摸点上
  10. //的棋子和走棋的棋子的颜色同样
  11. if(killId != -1 && _s[moveId]->getRed() == _s[killId]->getRed())
  12. {
  13. //更换选择框
  14. setSelectId(killId);
  15.  
  16. return;
  17. }
  18.  
  19. //CCLog("killId=%d, moveId=%d", killId, moveId);
  20. //CCLog("_s[moveId]->getRed()=%d", _s[moveId]->getRed());
  21.  
  22. //走棋规则
  23. bool bCanMove = canMove(moveId, killId, x, y);
  24.  
  25. //假设bCanMove为false
  26. //不能走棋
  27. if(false == bCanMove)
  28. {
  29. return;
  30. }
  31.  
  32. //走棋之前记录棋子的信息
  33. //第一个參数:须要移动的棋子的id
  34. //第二个參数:通过触摸点的位置推断触摸点上是否有棋子
  35. //第三个參数:棋子当前的位置的x坐标
  36. //第四个參数:棋子当前的位置的y坐标
  37. //第五个參数:棋子移动后的位置的x坐标
  38. //第六个參数:棋子移动后的位置的y坐标
  39. Step* step = Step::create(moveId, killId, _s[moveId]->getX(), _s[moveId]->getY(), x, y);
  40.  
  41. //将棋子的信息加入到数组中
  42. _steps->addObject(step);
  43.  
  44. //设置棋子的坐标(移动棋子)
  45. _s[moveId]->setX(x);
  46. _s[moveId]->setY(y);
  47.  
  48. //_s[moveId]->setPosition(getStonePos(x,y));
  49. //SetRealPos(_s[moveId]);
  50.  
  51. //设置移动棋子时的动作
  52. CCMoveTo* move = CCMoveTo::create(.5f, getStonePos(x, y));
  53.  
  54. //动作回调
  55. CCCallFuncND* call = CCCallFuncND::create(this,
  56. callfuncND_selector(SceneGame::moveComplete),
  57. (void*)(intptr_t)killId);
  58.  
  59. //设置动作的运行顺序(先移动棋子,后调用回调函数)
  60. CCSequence* seq = CCSequence::create(move, call, NULL);
  61.  
  62. //设置移动的棋子的优先级
  63. _s[moveId]->setZOrder(_s[moveId]->getZOrder() + 1);
  64.  
  65. //运行棋子移动的动作
  66. _s[moveId]->runAction(seq);
  67. }



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. POJ 3170 线段树优化DP

    题意: 思路: 先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费) f[i]表示取区间[M,i)的代价 易得f[i]=min(f[k]+w,f[i]);T1<=k ...

  2. Fragment-Transaction 源码分析

    概述 这篇文章的简要分析了Activity中的Transaction和add,replace等操作以及backstack的工作原理. 分析transaction源码的原因是因为我在写一个测试代码的时候 ...

  3. pwconv---pwunconv 密码投影

    pwconv命令用来开启用户的投影密码.Linux系统里的用户和群组密码,分别存放在名称为passwd和group的文件中, 这两个文件位于/etc目录下.因系统运作所需,任何人都得以读取它们,造成安 ...

  4. 如何通过使用fiddler对Android系统设备抓包总结

    http://www.open-open.com/lib/view/open1427509907668.html

  5. Install Docker Mac OS X

    检查 Mac OS version 要求必须是 OS X 10.6 Snow Leopard or newer to run Boot2Docker 安装 Boot2Docker 列表内容 下载地址: ...

  6. startActivityForResult()的用法

    举例说我想要做的一个事情是,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Act ...

  7. 自定义控件学习——下拉刷新ListView

    效果 开始用Android Studio写了,还有挺多不明白这IDE用法的地方....蛋疼 主要思路 1. 添加了自定义的头布局    2. 默认让头布局隐藏setPadding.设置 -自身的高度  ...

  8. 洛谷P1852 奇怪的字符串

    题目描述 输入两个01串,输出它们的最长公共子序列的长度 输入输出格式 输入格式: 一行,两个01串 输出格式: 最长公共子序列的长度 输入输出样例 输入样例#1: 复制 01010101010 00 ...

  9. Vue的学习--遇到的一些问题和解决方法

    包括: 1.Missing space before function parentheses 2.如何给.vue文件的页面添加css 3.如何给.vue文件页面里的元素添加监听器 4.如何为每一个页 ...

  10. 用vue.js的v-for,v-if,computed写一个分页样式

    在学Vue,总想写个分页,先写了一个样式. 主要看思路: 思路简单,得到总页数,判断总页数,循环. 先判断总页数是否需要分页,总页数==1页就不分了. 再判断总页数<11就不用--. 总页数&g ...