文章目录

  • 1. 人机对战
    • 1.1 演示
    • 1.2 评分表
    • 1.3 算法思路
    • 1.4 具体代码
      • 1.4.1 评分表方法
      • 1.4.2 横向得分方法
      • 1.4.3 纵向得分方法
      • 1.4.4 左斜得分方法
      • 1.4.5 右斜得分方法
      • 1.4.6 落子总得分方法
      • 1.4.7 确认落子位置的方法

1. 人机对战

要增添一个人机对战的模块, 最大的难点就是如何让人机知道下在什么位置是最好的, 不仅要具备进攻的能力, 还需要具备防守的能力.

这里当人机第一次走的时候, 采用标准开局, 下子在最中间.
当玩家走了之后, 人机就需要去判定下在什么位置合理.

这里采用的是评分表的方法来计算落子在每一个位置的分数, 根据最高分数来进行下子.

1.1 演示

1.2 评分表

分析棋形的几种情况.
例如, 自己是黑子.
"_" 代表 没有子, "1" 代表 黑子 , "0" 代表 白子

当落子只有一颗子的情况
_ 1 _
_ 1 0
0 1 _
0 1 0

当落子有两颗子的情况
_ 1 1 _
_ 1 1 0
0 1 1 _
0 1 1 0

当落子有三颗子的情况
_ 1 1 1 _
_ 1 1 1 0
0 1 1 1 _
0 1 1 1 0

当落子有四颗子的情况
_ 1 1 1 1 _
_ 1 1 1 1 0
0 1 1 1 1 _
0 1 1 1 1 0

当落子有五颗子的情况
_ 1 1 1 1 1 _
_ 1 1 1 1 1 0
0 1 1 1 1 1 _
0 1 1 1 1 1 0

这里大概的情况分为这几种, 分别对这几种情况进行一个分数的设定, 让机器人根据分数的高低优先去处理某种情况.

这里设计一种分数表

一子情况

二子情况

三子情况

四子情况

五子情况

1.3 算法思路

使用暴力搜索的方法, 将棋盘中每个空格的子, 当下子的时候, 去判定下子之后, 横向得分情况, 竖向得分情况, 左斜得分情况, 右斜的得分情况.

例如, 下子是黑子.
 
横向, 去看左边有多少个黑子, 多少白子, 去看右边有多少个黑子, 多少白子. 然后根据评分表, 算得分数.
 
纵向, 去看上方有多少黑子, 多少白子, 再去下方看有多少个黑子, 多少白子, 然后根据评分表, 算得分数.
 
左斜, 去左下方看有多少黑子, 多少白子, 再去右上方看有多少黑子, 多少白子, 然后根据评分表, 算得分数.
 
右斜. 去左上方看有多少黑子,多少白子, 再去右下方看有多少黑子, 多少白子, 然后根据评分表, 算得分数.

将四个方向的得分加起来, 算得分数, 进行下子.

这里这种算法, 只具备了进攻, 不具备防守的能力. 要想人机下棋具备防守的能力, 还需要让人机对玩家落子的分数进行评估, 如果玩家落子得分更高, 就需要考虑去防守了.

这里就让, 对每个位置, 机器人落子, 和玩家落子, 算得机器人落子的得分, 和玩家落子的得分, 对分数进行相加, 然后再去比较, 当前是最大的得分情况, 就去当前位置落子.

这里进行测试的时候, 发现出现四子的时候, 会出现不进攻 或者不防守的情况. 所以在判定的时候, 如果出现了五子连珠的情况, 首先进攻. 如果对方有四子, 自己没法五子, 首先防守.

1.4 具体代码

1.4.1 评分表方法

根据评分表来分配分数, my表示我下的棋子, his表示他下的棋子

public int score(int my,int his){if(my > 5) return 200000;if(my == 5 && his == 0) return 200000;if(my == 5 && his == 1) return 200000;if(my == 5 && his == 2) return 200000;if(my == 4 && his == 1) return 3000;if(my == 4 && his == 0) return 50000;if(my == 4 && his == 2) return 1000;if(my == 3 && his == 0) return 3000;if(my == 3 && his == 1) return 1000;if(my == 3 && his == 2) return 500;if(my == 2 && his == 0) return 500;if(my == 2 && his == 1) return 200;if(my == 2 && his == 2) return 100;if(my == 1 && his == 0) return 100;if(my == 1 && his == 1) return 50;if(my == 1 && his == 2) return 30;return 0;}

1.4.2 横向得分方法

算得横向自己棋子数, 和他的棋子数
如果遇到空格就不计算了, 遇到别人的棋子也不计算了

public int getXScore(int x,int y, int chess){int my = 1;int his = 0;for(int i = x-1; i >= 0; i--){if(chess == board[i][y]){my++;}else if(board[i][y] == 0){break;}else{his++;break;}}for(int i = x+1; i<board.length; i++) {if(chess == board[i][y]){my++;}else if(board[i][y] == 0){break;}else{his++;break;}}return score(my,his);}

1.4.3 纵向得分方法

算得纵向自己棋子数, 和他的棋子数
如果遇到空格就不计算了, 遇到别人的棋子也不计算了

    private int getYScore(int x, int y, int chess) {int my = 1;int his = 0;for(int i = y-1; i >= 0; i--){if(chess == board[x][i]){my++;}else if(board[x][i] == 0){break;}else{his++;break;}}for(int i = y+1; i < board.length; i++){if(chess == board[x][i]){my++;}else if(board[x][i] == 0){break;}else{his++;break;}}return score(my,his);}

1.4.4 左斜得分方法

算得左斜向自己棋子数, 和他的棋子数
如果遇到空格就不计算了, 遇到别人的棋子也不计算了

    private int getSkewScore2(int x, int y, int chess) {int my = 1;int his = 0;for(int i = x+1,j=y-1; i<board.length && j >=0; i++,j--){if(chess == board[i][j]){my++;}else if(board[i][j] == 0){break;}else{his++;break;}}for(int i = x-1,j=y+1; i>=0 && j<board.length; i--,j++){if(chess == board[i][j]){my++;}else if(board[i][j] == 0){break;}else{his++;break;}}return score(my,his);}

1.4.5 右斜得分方法

算得右斜向自己棋子数, 和他的棋子数
如果遇到空格就不计算了, 遇到别人的棋子也不计算了

 private int getSkewScore1(int x, int y, int chess) {int my = 1;int his = 0;for(int i = x-1,j =y-1; i >=0 && j>=0; i--,j--){if(chess == board[i][j]){my++;}else if(board[i][j] == 0){break;}else{his++;break;}}for(int i = x+1,j=y+1; j<board.length && i < board.length; i++,j++){if(chess == board[i][j]){my++;}else if(board[i][j] == 0){break;}else{his++;break;}}return score(my,his);}

1.4.6 落子总得分方法

这里如果自己下的子可以优先五子连珠就直接下棋.
如果没有这种情况, 再去判定是否他可以五子连珠, 如果有直接堵住
其他就计算总分数

    public int getScore(int x,int y) {int numX1 = getXScore(x,y,1);int numX2 = getXScore(x,y,2);int numY1 = getYScore(x,y,1);int numY2 = getYScore(x,y,2);int skew1 = getSkewScore1(x,y,1);int skew2 = getSkewScore1(x,y,2);int skew3 = getSkewScore2(x,y,1);int skew4 = getSkewScore2(x,y,2);if(numX2 >= 200000 || numY2 >= 200000 || skew2 >= 200000 || skew4 >= 200000) {return Integer.MAX_VALUE;}if(numX1 >= 200000 || numY1 >= 200000 || skew1 >= 200000 || skew3 >= 200000){return Integer.MAX_VALUE;}int xScore = getXScore(x,y,1)+getXScore(x,y,2);int yScore = getYScore(x,y,1)+getYScore(x,y,2);int skewScore1 = getSkewScore1(x,y,1)+getSkewScore1(x,y,2);int skewScore2 = getSkewScore2(x,y,1)+getSkewScore2(x,y,2);return xScore + yScore + skewScore1 + skewScore2;}

1.4.7 确认落子位置的方法

 public int[] concluate() {int[] res = new int[2];int max = 0;for(int i = 0; i < Constant.ROW; i++) {for(int j = 0; j < Constant.COL; j++) {if(board[i][j] != 0) {continue;}int num = getScore(i,j);if(num == 200000){res[0] = i;res[1] = j;return res;}if(num > max) {max = num;res[0] = i;res[1] = j;}}}return res;}

在线五子棋对战 --- 人机对战的实现相关推荐

  1. 【QT项目】简易五子棋游戏(人机对战)— 完整源码

    文章目录 前言 一.游戏实现效果 二.需求分析 三.解决方案 四.核心步骤 1.插入棋盘图 2.双方落子 3.输赢判定 4.重新开始 五.完整源码 1.main.cpp 2.chessboard.h ...

  2. JAVA五子棋AI(人机对战 颜色选择 悔棋等 可直接使用)

    五子棋是全国智力运动会竞技项目之一,容易上手,老少皆宜,而且趣味横生,引人入胜,不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.当然,用 JAVA 语言编写五子棋 AI 小游戏也是一件非常 ...

  3. 基于FPGA(basys3)的双人对战人机对战五子棋(vivado)课程设计项目

    目录 主界面显示与选择模式 双人对战 人机对战 胜利界面显示 部分源码 主界面显示与选择模式 VGA显示器显示图片,显示图片利用Block Memory Generator将图片像素点储存在RAM里面 ...

  4. java人际对战五子棋_系统框图如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输...

    展开全部 一.实验题目 五子棋游戏e69da5e6ba9062616964757a686964616f31333365633835. 二.问题分析 五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策 ...

  5. Qt学习之使用QTableWiget实现简易五子棋游戏(人机对战)

    目录 一.前言 二.游戏效果展示 三.需求分析 四.代码实现 1.新建一个类five_in_a_row继承于QWidget 2.头文件(five_in_a_row.h) 3.构造函数(初始化棋盘) 4 ...

  6. 用html+js实现五子棋游戏(人机对战)【建议收藏】

    在前端如何创建一个五子棋盘,并实现人机对战,不要小瞧人机,你可能还赢不了,不信你来试试 1.效果展示 2.代码分享 <!DOCTYPE html> <html lang=" ...

  7. C语言 五子棋 图形界面 人机对战

    项目仓库:https://gitee.com/siwenzhi/gobang 内容 直接放当时的答辩PPT吧 其实每个页面都是一个小视频 代码 #include<graphics.h> # ...

  8. java五子棋游戏人工智能_基于java的五子棋游戏(人机对战)

    [实例简介] 我毕业设计自己做的基于java的五子棋游戏软件,获得优秀论文,功能在单纯的人机对战上算比较齐全,也比较好玩!希望为毕业设计做游戏的同学提供些查考! 软件的基本功能 软件的基本功能介绍如下 ...

  9. java五子棋AI算法人机对战(春物彩羽版可下载试玩PC端)

    五子棋AI算法 前言: 坐标西安,写于疫情封城期间.改进了之前写的基于极大极小值策略AI五子棋游戏,是用java实现的,采用了java老旧的jframe窗体和绘图类.写好之后整理成了这篇博客. 游戏采 ...

最新文章

  1. 面试官问: 如何保证 MQ消息是有序的?
  2. c语言猜拳游戏中出现的关键词,C语言猜拳游戏代码及分析
  3. NEU 1040 Count
  4. C# 多线程之Thread类
  5. flask第二十四篇——模板【6】自定义过滤器
  6. 亚马逊评价抓取插件_亚马逊运营必备插件
  7. Spring Boot CMI 使用笔记
  8. Tr A HDU1575
  9. 【渝粤题库】国家开放大学2021春1375Matlab语言及其应用题目
  10. 前端学习(527):等分布局第二种方案
  11. 架构设计 例子和实践
  12. 分享一下10个常用jquery片段
  13. mysql数据生产数据分析_基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程...
  14. python打开autocad软件_python 使用pyautocad操作AutoCAD
  15. java 异步处理数据格式_spring mvc对异步请求的处理
  16. 图片水印工具类java
  17. 大学计算机信息技术实验与测试教程第2版,大学信息技术实验指导
  18. 在Linux中修复U盘
  19. 芒果文件服务器,芒果服务器
  20. 王道计算机网络学习笔记

热门文章

  1. 【个人作品】企业级财务报表可视化——资产负债表
  2. 某电商网站Java面试题-2(高级开发,架构级别)
  3. Contiki-NG在GD32F310的移植
  4. 怎么设置计算机硬盘密码,移动硬盘如何设置密码【操作步骤】
  5. You have to use a classifier to attach supplemental artifacts to the project instead of replacing th
  6. 电路中滤波电容和退耦电容_电容在电路中究竟有多少种应用?
  7. Android集成bilibili播放器以及弹幕
  8. python在教育领域的应用课题_研究型案例在Python教学方法中应用
  9. JavaScript自写逻辑思维导图(非常详细)
  10. 基于arduino的火焰报警蜂鸣器播放音乐(外部中断)实验