第18篇 Qt实现简单五子棋游戏(二)算法说明

  • 5.算法说明
    • 5.1.画棋盘: void drawChessboard();
    • 5.2.画棋子:void drawChess();
    • 5.3.鼠标点击响应:void mousePressEvent(QMouseEvent* mevent);
    • 5.4.处理棋子:void handleChess(int current_x,int current_y);
    • 5.5.判断是否赢了:bool isWin(int x,int y,int chesscolor);
    • 5.6.获取电脑落子位置:bool getLocation(int& x,int& y,int chesscolor);
    • 5.7.拦截:bool centreIntercept(int& x,int& y,int max,int color);
    • 5.8.判断是否拦截:bool interceptJudgment(int max);
    • 5.9.破解三角阵:bool breakTriangle(int &x,int &y,int color);
    • 5.10.九宫格:bool jiuGongge(int& x,int& y,int no_color);

5.算法说明

5.1.画棋盘: void drawChessboard();

绘制棋盘横线、竖线。
因为在绘制之前,我们已经初始化了棋盘,即我们可以知道棋盘的起点在哪,有多少行多少列,且线与线之间的距离多大,数据都有,获取之后可进行绘制。

竖线,获取一条线的x = this->chessBoard->getStart_x(),若其还在范围之内,则进行绘制,起点和终点的横坐标都为x,起点纵坐标为this->chessBoard->getStart_y(),终点纵坐标为his->chessBoard->getStart_y() + linespace * (row – 1);

横线,竖线,获取一条线的y = this->chessBoard->getStart_y(),若其还在范围之内,则进行绘制,起点和终点的纵坐标都为y,起点横坐标为this->chessBoard->getStart_x(),终点横坐标为his->chessBoard->getStart_x() + linespace * (col – 1);

5.2.画棋子:void drawChess();

绘制棋子。
遍历表示棋盘的数组(标记位置是否落子),计算其对应界面棋盘的位置(注意横坐标在上层循环计算,避免不必要的计算),若该位置有棋子,则绘制对应颜色的棋子。

5.3.鼠标点击响应:void mousePressEvent(QMouseEvent* mevent);

获取点击位置,计算最近的落子点,判断是否可落子,可落子则落入棋子,否则退出,若为人机模式,且玩家已经落子,则获取人机落子位置,每次落子后判断输赢。

首先判断是否在可点击的范围内,若不在范围内则不作任何响应,即点击的是棋盘才会响应。

在点击范围则先判断是否有棋子已经赢了,若赢了则提示,不执行之后的操作,退出当前函数。

没有以上情况则计算离点击位置最近的落子位,若该位置没有落子,则落子。

若为人机模式,则获取电脑落子位置,落子。

5.4.处理棋子:void handleChess(int current_x,int current_y);

把棋子添加到指定数组中,并标记棋盘对应位置为已经落子。

获取当前棋方颜色,标记当前位置已经落子。改变this->isblack的值。保存当前棋子,重绘界面,判断输赢。

5.5.判断是否赢了:bool isWin(int x,int y,int chesscolor);

从四个方向判断是否有五子连串,即以当前位置为出发点,若南-北、东-西、西北-东南、西南-东北,这四个方向有一个或多个存在五子连串,则判为赢。

因为原理和拦截的一样,所以使用拦截涉及到的函数去判断即可。

5.6.获取电脑落子位置:bool getLocation(int& x,int& y,int chesscolor);

按优先级获取最佳落子位置。
//优先级1--------五缺一
//优先级2--------对手五缺一
//优先级3--------四缺一
//优先级4--------对手四缺一
//优先级5--------三角阵
//优先级6--------对手三角阵
//优先级7--------三缺一
//优先级8--------九宫格
//优先级9-------随机

5.7.拦截:bool centreIntercept(int& x,int& y,int max,int color);

拦截头部或尾部或者中间位置,用于阻止或者进攻。

遍历棋盘数组,若当前位置没有落子,则对其进行四个方向的检索,若存在五子连珠的情况,则记录当前位置,并返回真。否则返回假。

5.8.判断是否拦截:bool interceptJudgment(int max);

因为在电脑落子位置获取时,可以检索是否为5,4,3子连珠,因此需进行一定的判断,若果是五子连珠,则直接返回真,若是四子,则判断头部或尾部没有落子,才可返回真,否则返回假,若是三子,则头部和尾部都为真才行。

南北走向检索:bool centreIntercept_SN(int x,int y,int max,int color);
先以当前位置向北检索,若存在当前颜色的棋子,则统计count++,若不存在则退出循环,以当前位置向南检索,若存在当前颜色的棋子,则统计count++,若不存在则退出循环,若count>=max(max是你想要检索的值,判断输赢时传进来的是4,因为判断输赢时当前位置是已经有一颗棋子了,只要以它为中心找出4子即可)。

以下三个都是差不多。

东西走向检索:bool centreIntercept_EW(int x,int y,int max,int color);
西南东北走向检索:bool centreIntercept_WS_EN(int x,int y,int max,int color);
东南西北走向检索:bool centreIntercept_ES_WN(int x,int y,int max,int color);

5.9.破解三角阵:bool breakTriangle(int &x,int &y,int color);

南北走向检索:void breakTriangle_SN(int x, int y, int& count, int color);

int xi = x, yi = y;int k = 1;if ((yi - 1) >= 0 && this->chessBoard->getLocationColor(xi,yi - 1) == 0) {k++;}yi++;while (yi >= 0 && yi < this->chessBoard->getCol() && this->chessBoard->getLocationColor(xi,yi) == color) {k++;yi++;}if (yi < this->chessBoard->getCol() && this->chessBoard->getLocationColor(xi,yi) == 0) {k++;}if (k >= 5) {count++;

}
看这一段代码,因为是三角,所以不用考虑一条线上的(三角的优先级在后面,一条线的早就已经先判断了)。
K的作用是统计是否存在五子连珠的危险,若存在则记录该位置,返回真。
首先检查该位置的上一个是否是空位,是空位则记录k++,然后进行该位置下面是否存在当前颜色的棋子,若存在则记录k++,否则退出循环,退出之后再判断yi位置是否为空,是则记录k++。
若k大于等于5,则统计这个方向存在危险。
再判断其他位置。
东西走向检索:void breakTriangle_EW(int x, int y, int& count, int color);
西南东北走向检索:void breakTriangle_WN_WS(int x, int y, int& count, int color);
东南西北走向检索:void breakTriangle_EN_ES(int x, int y, int& count, int color);
若八个方向有至少两个位置存在危险,则存在三角,需要破解,记录该位置,返回真。

5.10.九宫格:bool jiuGongge(int& x,int& y,int no_color);

以某一颗棋子为中心,判断四周是否可以落子,并有落子最佳位置。

第18篇 Qt实现简单五子棋游戏(二)算法说明相关推荐

  1. 第33篇 Android Studio实现五子棋游戏(四)棋子类和主类

    第33篇 Android Studio实现五子棋游戏(四)棋子类和主类 1.棋子类 2.主类 2.1.变量 2.2.重写方法 2.3.代码 3.效果 3.1.进去界面 3.2.赢棋 3.3.提示 3. ...

  2. 第30篇 Android Studio实现五子棋游戏(一)杂记

    第30篇 Android Studio实现五子棋游戏(一) 1.需求分析 1.1.判断胜负 1.2.AI拦截及获取落子位 2.界面 2.1.布局 2.2.名称和资源图片 3.接口联系 1.需求分析 五 ...

  3. 编写五子棋的完整python代码_python制作简单五子棋游戏

    本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 '" 矩阵做棋盘 16*16 "+" 打印棋盘 for for 游戏是否结束 开 ...

  4. python写游戏棋牌游戏_使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...

  5. python简单网格五子棋_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  6. 用c语言做一个五子棋程序,C语言制作简单五子棋游戏

    原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...

  7. linux qt5.7下打地鼠源程序,QT实现简单打地鼠游戏

    本文实例为大家分享了QT实现简单打地鼠游戏的具体代码,供大家参考,具体内容如下 开发工具:VS2017,qt5.9.8 开发语言:c++ 实现功能: 有若干地鼠洞,每次出现一只地鼠,当击中地鼠后,分数 ...

  8. python五子棋算法_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  9. python制作五子棋_python制作简单五子棋游戏

    python制作简单五子棋游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python制作简单五子棋游戏.txt ] (友情提示:右键点上行txt文档名->目标另存 ...

最新文章

  1. 120万公里「真」无人商用里程如何炼成?出租车物流车车车无人,香港乌鲁木齐城城自动...
  2. 科大星云诗社动态20210501
  3. POJ - 1026 Cipher(置换群的幂)
  4. Spring,SpringMvc初始化监听配置
  5. android 崩溃日志捕获,安卓Java崩溃的捕获和日志记录
  6. WinRAR 曝出代码执行漏洞,你的官方中文无广告版该升级了
  7. 奇妙的数字 小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?
  8. mac java环境变量验证_Mac系统 JAVA环境变量配置
  9. groovy 变量和字符串
  10. 用while输出1到100的偶数python_用while语句,求1到100的偶数之和
  11. 2、基因树 与物种树的关系及建树
  12. 计算机改考408的学校,2020考研 河北工业大学计算机改考408
  13. 落花已去,相思成冢。十月的杜鹃雨,下得纷纷扬扬。我走在花瓣雨下,回忆我们曾经的甜蜜温馨,一回首,一抬头,仿佛你就在灯火阑珊处。那些掉落在地上的杜鹃,成了相思的墓,也许是为了祭奠我们曾经的美好。 杜鹃
  14. 【前端笔记】Ant Design Form组件 resetFields() 与 setFieldsValue() 之比较
  15. 【ARM汇编】stmfd sp!, {r0-r3, lr}
  16. 线性差分方程及其通解的一般求法
  17. 响铃:“消费茧房”才是拼多多最像今日头条的地方
  18. [华为机试真题]69.姓名的夫妻相
  19. 【HiFlow】腾讯云新一代自动化助手,我用它完成了企业疫情提示(无代码)
  20. 什么是缺陷密度?计算的公式及示例

热门文章

  1. 解决Windows 下git官网下载很慢
  2. DataBinding原理----单向数据绑定(3)
  3. 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
  4. python本地安装pip命令的终极教程
  5. Windows定时开关机
  6. 全国省份、地级市数据库
  7. 闪乱神乐台服显示连接不上服务器,忍者大师 闪乱神乐无法连接服务器是什么原因...
  8. 海康 综合安防管理平台 对接
  9. 如何监控Redis性能指标
  10. 刷脸支付缴费成了某些医院学校的新宠