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

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

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

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

走棋的实现思路

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;}//通过触摸点在棋盘中的坐标获取选中的棋子的idint 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);
}


转载于:https://www.cnblogs.com/gcczhongduan/p/4216150.html

Cocos2d-X开发中国象棋《八》走棋相关推荐

  1. Unity和C#开发 - 中国象棋+源代码工程

    Unity和C#开发 - 中国象棋+高清视频指导+源代码工程 https://item.taobao.com/item.htm?ft=t&id=650971483074

  2. 使用Qt开发中国象棋(三):走棋着法列表

    在一个完整的中国象棋游戏中,一般界面上都显示了中文着法,为了简单起见,我开发的这个用了两个着法列表,红方一个,黑方一个,其实用一个就够了,只是感觉那样稍微会麻烦些.着法列表显示了每一步的走棋.下图是着 ...

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

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

  4. Java游戏开发——中国象棋联机版

    游戏介绍: 中国象棋是起源于中国的一种棋戏,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于规则简单,趣味性强,成为流行极为广泛的棋类游戏. 中国象棋使用方形格状棋盘及红黑二色圆形棋子进行对弈,棋 ...

  5. 使用Qt开发中国象棋(一):概述

    最近看了一些关于中国象棋的实现书籍,里面讲述了如何开发一个完整的中国象棋游戏,看了里面的内容,感觉里面的内容特别巧妙的,比如书中提到了用位棋盘来表示中国象棋的棋盘以及一些精妙的走棋算法.基于这些,自己 ...

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

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

  7. 用VS软件开发“中国象棋“游戏

    1.很直观地去看这个中国象棋的界面,数一下它有多少行和多少列. 10行,9列:要注意这里数的是安放象棋的位置,有10行9列 这里我们首先想到的必然是二维数组,每一个行列交叉的点都设置成二维数组a[i] ...

  8. 用VS软件开发“中国象棋“游戏<笔记摘录>

    整体架构如上 1.很直观地去看这个中国象棋的界面,数一下它有多少行和多少列. 10行,9列:要注意这里数的是安放象棋的位置,有10行9列 这里我们首先想到的必然是二维数组,每一个行列交叉的点都设置成二 ...

  9. 街头一小伙子C++开发中国象棋,智能走法巧妙,让人拍手叫好!

    象棋是一种古老的智力游戏,人们往往通过对弈来参透一些人生的一些哲理,来提高自己的觉悟能力.思维能力和生活乐趣. 小编今天用C++ 中国象棋人机对弈程序源代码,支持人机对弈.人人对弈等多种方式,提供多种 ...

  10. 使用Qt开发中国象棋(六):将军和死棋检测

    下棋的过程中,某一方主帅被对方攻击就是将军,如果不能解除危险,就是死棋.在这个游戏中实现了将军的判断和死棋的检测.具体如下: (1)每走一步棋时,先要判断自己能不能这样走,当然除了走法是否合乎规则,比 ...

最新文章

  1. visual C++如何查看汇编代码
  2. Linux(Ubuntu)常用命令(二)
  3. HBNIS-crypto
  4. Chrome 控制台的console用法收集
  5. 扫盲丨关于区块链你需要了解的所有概念
  6. “用户、组或角色'XXX'在当前数据库中已存在”问题
  7. python3.6,--登录知乎
  8. 201671010430 司昕劼 实验十四 课程学习总结
  9. 在PGConf.Asia-主论坛,纵览腾讯云PostgreSQL技术演进
  10. 爬取影评python_爬虫 | 战狼2 影评爬取及分析
  11. 2020年12月31日flash禁用后网页如何播放rtmp视频流
  12. 微信砍价 php,GitHub - YInJunWen/bcwx: vue2+thinkPHP5.1 前后端分离的微信砍价
  13. 基于Java、JSP电费管理系统
  14. 如何避免拼多多售后?拼多多售后有哪些规则?
  15. cmstop在列表页或者文章页调用自动摘要的办法
  16. 联想超融合服务器安装系统,联想AIO超融合产品介绍.pdf
  17. 反转字符串、反转字符串中的元音字母、两个数组的交集,springboot工作原理面试
  18. 用友账套和报表服务器显示不同,用友T6不同账套中报表汇总
  19. 螺旋测微器b类不确定度_螺旋测微器b类不确定度_物理实验直测量不确定度评估.ppt...
  20. 【Shell】3万字图文讲解带你快速掌握shell脚本编程

热门文章

  1. 联想键盘F1-F12的切换
  2. K8S学习--Kubeadm-3-dashboard部署和升级
  3. 【教程】Edraw Max使用教程:创建一个基本流程图
  4. 《Android框架揭秘》——导读
  5. “程序员的理财计划”-待完善
  6. 对计算机病毒防治最科学的方法是,计算机病毒防治(复习-3
  7. CAN FD:测量和重编程
  8. vc2013 调用大漠插件例子
  9. 博弈论学习笔记(六)纳什均衡之约会游戏与古诺模型
  10. vs2015 professional 密钥