目录

1:选择下棋的棋子:

2:尝试着下棋:

3:移动棋子:

4.规则

1.将:

2.士:

3.象:

4.马:

5.车:

6.炮:

7.兵:


1:选择下棋的棋子:

    void Board::trySelectStone(int id){if(id == -1)return;if(!canSelect(id)) return;_selectid = id;update();}

2:尝试着下棋:

分为两种情况,第一种情况是点击的是自己的棋子,这个时候转移下棋的棋子,第二种情况是点击的不是自己的棋子,这个时候就要判断能不能移动过去,_selectid是当前选定的棋子的id,killid代表的是用鼠标第二次点击的要去的位置的id,刚才说的瞻前顾后就是在这里进行判断的,killid如果不等于-1,代表的是当前的位置有棋子,如果两个棋子的颜色相同的话,就转移操作的棋子,

这里的canMove()函数里面包含了我们在下棋的时候的各种规则,关于这个规则我将会在下面进行展示。当我们判断完能够下棋之后就是下棋了,我们下棋的时候只需要把原来的位置的棋子给删去,然后把这个棋子移动到我们的目标位置就行了。

 void Board::tryMoveStone(int killid, int row, int col){if(killid != -1 && sameColor(killid, _selectid)){trySelectStone(killid);return;}bool ret = canMove(_selectid, row, col ,killid);if(ret){moveStone(_selectid, row, col ,killid);_selectid = -1;update();}}

3:移动棋子:

移动棋子的时候要瞻前顾后,既要把这个棋子给走过去,同时又要把原来位置上面的棋子给删去,这样才能保证棋盘的正确性。

首先是删除原来位置的棋子:使用killStone()函数

void Board::killStone(int id){if(id==-1) return;_s[id]._dead = true;}

然后就是把这个棋子给移动过去,使用的是moveStone(int moveid,int row,int col)函数

void Board::moveStone(int moveid, int row, int col){_s[moveid]._row = row;_s[moveid]._col = col;_bRedTurn = !_bRedTurn;}

这里出现了_bRedTurn = !_bRedTurn;它的作用是改变下棋方

4.规则

1.将:

将只能在九宫格内上下左右移动,那么我们只需要判断边界就行了。

bool Board::canMove1(int moveid,int row,int col,int killid){//将if(_s[moveid]._id==5&&_s[killid]._id==21||_s[moveid]._id==21&&_s[killid]._id==5){if(getCountAtLine(_s[moveid]._row,_s[moveid]._col,_s[killid]._row,_s[killid]._col)==0){//现在代表的是打照面了,当前位置的棋子直接胜利。return true;}}//对于棋盘来说,上红下黑的话进行类型的判断if(_s[moveid]._red){if(row>2) return false;}else{if(row<7) return false;}if(col<3) return false;if(col>5) return false;//判断好了九宫格,接下来要进行计算的就是是否每次移动一个位置的格子的棋子int rr=_s[moveid]._col-col;int rc=_s[moveid]._row-row;//移动一个单位的棋子,那么横竖肯定有一个是0,并且另一个应该是1或者-1//那么使用绝对值进行操作的时候,可以简化判断的过程.int number=abs(rc)*10+abs(rr);if(number==1||number==10)return true;return false;}

2.士:

士只能斜着在九宫格里面移动,跟前面的将的判断方法类似,我们只需要计算士的位置和鼠标点击位置的横坐标的绝对值乘以10加上纵坐标的绝对值,并判断这个数是不是11就好了。

bool Board::canMove2(int moveid,int row,int col,int killid){//士//对于棋盘来说,上红下黑的话进行类型的判断if(_s[moveid]._red){if(row>2) return false;}else{if(row<7) return false;}if(col<3) return false;if(col>5) return false;//判断好了九宫格,接下来要进行计算的就是是否每次移动一个位置的格子的棋子int rr=_s[moveid]._col-col;int rc=_s[moveid]._row-row;//移动一个单位的棋子,那么横竖肯定有一个是0,并且另一个应该是1或者-1//那么使用绝对值进行操作的时候,可以简化判断的过程.int number=abs(rr)*10+abs(rc);if(number==11)return true;return false;}

3.象:

象只能在以河界为分割线的自己的这一边走田,并且在移动的时候田的中间如果有棋子的话象是过不去的。

这里的判断同上,不过这里的值应该是22,相较于前面的来说,这一步多了一个判断是否过河的条件。

bool Board::canMove3(int moveid,int row,int col,int killid){//象getrowcol(row1,col1,moveid);int number=relation(row1,col1,row,col);if(number!=22) return false;int halfrow=(row1+row)/2;int halfcol=(col1+col)/2;if(getStone(halfrow,halfcol)!=-1) return false;//判断不能过河if(isBottomSide(moveid))//代表颜色方向{if(row>5) return false;}else{if(row<4) return false;}return true;}

4.马:

在象棋里面,马走日,按照前面的方法,我们计算的值应该是21或者12,不过对于马来说,我们还要考虑蹩马腿的情况。

也就是说当前的马的位置是(x1,y1),鼠标点击的位置是(x2,y2)(已经满足计算的值为12或者21了),那么我们只需分别在值为12和21的基础上判断是否蹩马腿就行了,首先分析12这种情况,12代表的是向右边走两格,这个时候蹩马腿位置的横坐标与马的横坐标相同,纵坐标为两个棋子的纵坐标的和的一半,就下来分析21这种情况,21代表的是向右边走一格棋子,这个时候蹩马腿位置的纵坐标与马的横坐标相同,横坐标为两个棋子的纵坐标的和的一半。

bool Board::canMove4(int moveid,int row,int col,int killid){//马getrowcol(row1,col1,moveid);int ret=relation(row1,col1,row,col);if(ret!=12&&ret!=21) return false;if(ret==12){if(getStone(row1,(col1+col)/2)!=-1){return false;}}else if(ret==21){if(getStone((row1+row)/2,col1)!=-1){return false;}}return true;}

5.车:

车只能走直线,并且不能跳子,那么我们只需要计算原本的车的位置和鼠标点击的位置之间的棋子的个数就行了。

bool Board::canMove5(int moveid,int row,int col,int killid){//车//判断是否在同一条直线上getrowcol(row1,col1,moveid);int ret=0;ret=getCountAtLine(row1,col1,row,col);if(ret==0)return true;elsereturn false;}

6.炮:

炮走棋分为两种情况

1:跳棋,这个时候需要吃棋。

2:不跳棋,这个时候只能移动,不能吃棋,这个时候就可以当车来处理。

bool Board::canMove6(int moveid,int row,int col,int killid){//炮getrowcol(row1,col1,moveid);int ret=getCountAtLine(row1, col1, row, col);if(killid!=-1){if(ret==1){if(getStone(row1,col1)!=-1)return true;elsefalse;}}else{if(ret==0)return true;}return false;}

7.兵:

在玩象棋的时候,我们都知道兵在没有过河界的时候只能往前走,而当兵过了河界之后不但能够往后走,而且还能左右走,现在我们需要判断的是兵是否过河和兵是否向前走或者左右走,并且一次只能走一格。

bool Board::canMove7(int moveid,int row,int col,int killid){//兵getrowcol(row1,col1,moveid);int number=relation(row1,col1,row,col);if(number!=1&&number!=10) return false;if(!isBottomSide(moveid)){if(row1<row) return false;if(row1>=5&&row1==row) return false;}else{if(row1>row) return false;if(row1<=4&&row1==row) return false;}return true;}

C++ QT开发人机象棋(棋子走法)相关推荐

  1. C++与Qt开发人机象棋(第二部分)

    C++与Qt开发人机象棋(第二部分) 项目目录 文件名->(包含)类名1->(包含)类名2 ChessBy ChessBy.pro Headers Board.h – – – Source ...

  2. C++ QT开发人机象棋(大纲)

    目录 1 系统需求分析: 1.1游戏简介: 1.2机器下棋史: 1.3研究内容: 1.4编译环境:QT 2 总体设计 2.1系统功能分析: 1.界面表示 2.鼠标点击 3.棋子走法 4.评估函数 5. ...

  3. C++ QT开发人机象棋(搜索算法)

    使用极大极小值算法,在满足电脑下棋的时候自己的局势能够获得最大权值的情况下判断在当前局势下的玩家的最小的权值,这样能够保证算法最优. 先从一个故事说起,比如说现在有有一个小偷偷了一些物品,小明看到后跟 ...

  4. C++ QT开发人机象棋(界面表示)

    目录 1.1界面表示: 1.1.1棋盘表示: 1.1.2.棋子表示: 2.1界面表示: 2.1.1棋盘绘制 一:作用 二:执行时间 2.1.2棋子绘制 1.1界面表示: 1.1.1棋盘表示: 使用十条 ...

  5. C++ QT开发人机象棋(鼠标点击)

    鼠标点击棋子,棋子能够进行相应的操作. mouseReleaseEvent(QMouseEvent *ev) 鼠标点击了以后,我们要知道鼠标点击的这个棋子的横纵坐标和这一点的棋子的id,这个时候需要调 ...

  6. C++ QT开发人机象棋(评估函数)

     每个棋子在当前点的所有可能走的情况用一个容器存储起来,根据搜索的层数输出相应的权值. 在搜索到最底层的时候进行权值的判断,判断的最终结果为棋盘上面的黑棋的棋子分减去棋盘上面的红棋的棋子分. long ...

  7. C++ 与Qt开发人机象棋(第一部分)

    MyWidget.h //Hearders #include <QWidget> #include "MyWidget.h" #include <QPushbut ...

  8. C++ QT开发人机象棋(剪枝算法)

    改变singleGame()里面的_level的值为5的话,程序就会崩溃,很显然由于最大值最小值算法遍历整个棋盘几层的话时间复杂度十分的高,为了优化程序我们就应该减少程序的运行量,那么也就有了剪枝算法 ...

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

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

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

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

最新文章

  1. CSS中一个font缩写的实例
  2. 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败 的解决方法(转)
  3. mysql行锁还需要乐观锁吗_mysql行锁、表锁。乐观锁,悲观锁
  4. html导航栏模板代码生成器,关于代码生成器的html页面模板支持更多类型的问题...
  5. deque(双向队列)
  6. ios开发证书reset原理分析以及解决方案
  7. 1059 Prime Factors (25 分)质因子 易错题
  8. c语言程序设计的例题,C语言程序设计例题与习题--详细介绍
  9. Pycharm安装与汉化教程
  10. python中数据结构的基本定义
  11. 哈佛php公开课,哈佛公开课
  12. 华为防火墙配置(双机热备)
  13. ios 隔空投安装ipa_ios打ipa包安装到真机进行测试
  14. 【Professional English】Words Summary
  15. Array Shrinking(CodeForces - 1312E )
  16. xdocreport根据模板生成合同(docx/pdf)神器:(三)如何制作报告模板并根据它生成docx或者ppt
  17. Neo4j:一、CQL语句
  18. 天田AMADA数控折弯机触摸屏维修RGM21003主机电路板维修
  19. 【洛谷P3651】展翅翱翔之时
  20. 欧拉回路,欧拉路径,欧拉图详解

热门文章

  1. 作业 - 加密解密和CA
  2. 机器人视觉硬件方案设计对比
  3. FAR花菜一个前所未有的机遇
  4. linux系统安装视频播放器,Linux操作系统上安装Mplayer播放器的方法
  5. python与excel教程_Python对Excel操作教程
  6. Python链接数据库
  7. 夜幕下的区块链:揭露区块链评级的猫腻
  8. 李宏毅自然语言处理——GPT3简介
  9. 供应链金融产品业务全揭秘
  10. java gui 文本框_【Java GUI】文本框和文本区