人机对弈之前,计算机首先需要具备能够判断双方所走的步骤是否合法的功能,这里使用棋盘类GameBoard来实现相关的功能。

首先将对弈的棋盘看成是一个8*8的二维数组,每一个单元格对应一个数组下标,并且单元格中存储该单元格中棋子的颜色。棋盘模型如图所示:

棋盘类的总体代码:

package gameboard;public class GameBoard {public final static int BLACK = -1;public final static int WHITE = 1;public final static int EMPTY = 0;private int[][] gameBoard = new int[8][8];private int blackNum,whiteNum;public GameBoard(){blackNum = 0;whiteNum = 0;for(int i = 0; i < gameBoard.length; i++){for(int j = 0; j < gameBoard[0].length; j++){gameBoard[i][j] = EMPTY;}}}//将棋盘指定格子设置成指定颜色public void setBoard(int x, int y, int color){gameBoard[x][y] = color;if(color == BLACK && blackNum < 10){blackNum++;}else if(color == WHITE && whiteNum < 10){whiteNum++;}}public int getGameBoard(int hIndex, int vIndex){return gameBoard[hIndex][vIndex];}//判断步骤是否合法public boolean isLeagleMove(int hIndex, int vIndex, int color){boolean isLeagle = true;//与该棋子(x,y)相邻棋子的个数int adjacentNumber = 0;int adjacentHIndex = -1;int adjacentVIndex = -1;//查看位置是否被占用以及黑白的goal areaif(gameBoard[hIndex][vIndex] != 0 || (color == WHITE && (vIndex == 0 || vIndex == 7)) || (color == BLACK && (hIndex == 0 || hIndex ==7)) ||(hIndex == 0 && vIndex == 0) ||(hIndex == 7 && vIndex == 0) ||(hIndex == 0 && vIndex == 7) ||(hIndex == 7 && vIndex == 7)){isLeagle = false;//判断将要放的位置是否有相邻的棋子,如果有相邻两个以上的棋子则位置不合法,若只有一个相邻的棋子,则继续判断,若没有相邻棋子,则位置合法}else{gameBoard[hIndex][vIndex] = color;//internal areaif(hIndex != 0 && vIndex != 0 && hIndex != 7 && vIndex != 7){for(int x = hIndex - 1; x <= hIndex + 1; x++){if(gameBoard[x][vIndex - 1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){//在返回前 ,将棋盘还原gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = x;adjacentVIndex = vIndex - 1;}if(gameBoard[x][vIndex + 1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = x;adjacentVIndex = vIndex + 1;}}if(gameBoard[hIndex - 1][vIndex] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = hIndex - 1;adjacentVIndex = vIndex;}if(gameBoard[hIndex + 1][vIndex] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = hIndex + 1;adjacentVIndex = vIndex;}//white left goal area}else if(hIndex == 0){for(int y = vIndex - 1; y <= vIndex + 1; y++){if(gameBoard[1][y] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = 1;adjacentVIndex = y;}}if(gameBoard[0][vIndex - 1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = 0;adjacentVIndex = vIndex - 1;}if(gameBoard[0][vIndex + 1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = 0;adjacentVIndex = vIndex + 1;}//white right goal area}else if(hIndex == 7){for(int y = vIndex - 1; y <= vIndex + 1; y++){if(gameBoard[6][y] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = 6;adjacentVIndex = y;}}if(gameBoard[7][vIndex - 1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = 7;adjacentVIndex = vIndex - 1;}if(gameBoard[7][vIndex + 1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = 7;adjacentVIndex = vIndex + 1;}//black top goal area}else if(vIndex == 0){for(int x = hIndex - 1; x <= hIndex + 1; x++){if(gameBoard[x][1] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = x;adjacentVIndex = 1;}}if(gameBoard[hIndex - 1][0] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = hIndex - 1;adjacentVIndex = 0;}if(gameBoard[hIndex + 1][0] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = hIndex + 1;adjacentVIndex = 0;}//black bottom goal area}else if(vIndex == 7){for(int x = hIndex - 1; x <= hIndex + 1; x++){if(gameBoard[x][6] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = x;adjacentVIndex = 6;}}if(gameBoard[hIndex - 1][7] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = hIndex - 1;adjacentVIndex = 7;}if(gameBoard[hIndex + 1][7] == gameBoard[hIndex][vIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}adjacentHIndex = hIndex + 1;adjacentVIndex = 7;}}}//check the adjacent node to see whether it has two adjacent nodeif(adjacentHIndex != -1){adjacentNumber = 0;if(adjacentHIndex != 0 && adjacentVIndex != 0 && adjacentHIndex != 7 && adjacentVIndex != 7){for(int x = adjacentHIndex - 1; x <= adjacentHIndex + 1; x++){if(gameBoard[x][adjacentVIndex - 1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}if(gameBoard[x][adjacentVIndex + 1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}}if(gameBoard[adjacentHIndex - 1][adjacentVIndex] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}if(gameBoard[adjacentHIndex + 1][adjacentVIndex] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}//white left goal area}else if(adjacentHIndex == 0){for(int y = adjacentVIndex - 1; y <= adjacentVIndex + 1; y++){if(gameBoard[1][y] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}}if(gameBoard[0][adjacentVIndex - 1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}if(gameBoard[0][adjacentVIndex + 1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}//white right goal area}else if(adjacentHIndex == 7){for(int y = adjacentVIndex - 1; y <= adjacentVIndex + 1; y++){if(gameBoard[6][y] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}}if(gameBoard[7][adjacentVIndex - 1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}if(gameBoard[7][adjacentVIndex + 1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}//black top goal area}else if(adjacentVIndex == 0){for(int x = adjacentHIndex - 1; x <= adjacentHIndex + 1; x++){if(gameBoard[x][1] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}}if(gameBoard[adjacentHIndex - 1][0] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}if(gameBoard[adjacentHIndex + 1][0] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}//black bottom goal area}else if(adjacentVIndex == 7){for(int x = adjacentHIndex - 1; x <= adjacentHIndex + 1; x++){if(gameBoard[x][6] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}}if(gameBoard[adjacentHIndex - 1][7] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}if(gameBoard[adjacentHIndex + 1][7] == gameBoard[adjacentHIndex][adjacentVIndex]){adjacentNumber++;if(adjacentNumber >= 2){gameBoard[hIndex][vIndex] = EMPTY;return false;}}}}
//      gameBoard[hIndex][vIndex] = EMPTY;return isLeagle;}public int getBlackNum(){return blackNum;}public int getWhiteNum(){return whiteNum;}public void addWhiteNum(){whiteNum++;}public void addBlackNum(){blackNum++;}//将指定坐标点还原public void undo(int hIndex, int vIndex) {this.setBoard(hIndex, vIndex, EMPTY);}
}

这其中的核心方法是isLeagleMove(int hIndex,int vIndex, int color);其中hIndex与vIndex分别是将要放置的棋子位置的横纵坐标,color为棋子颜色。本人采用的策略是首先判断(hIndex,vIndex)处是否有其他棋子,以及(hIndex,vIndex)是否属于其中一方的老家,如是,则另一方不可以将棋子放在这里。最后还需要判断(hIndex,vIndex)是否是四个顶点,如果是四个顶点,不是合法步骤。这些都是在方法的第一个if语句中实现的。

这个方法的难点是判断将(hIndex,vIndex)放入color颜色棋子后会不会与棋盘上的其他棋子构成cluster(也就是(一)中的(6)规则)。这里分两种情况考虑,即(hIndex,vIndex)是边界点与非边界点两种情况。两种情况下遍历周围棋子的坐标不同,边界点情况下相邻单元格有5个,非边界点情况下相邻单元格有8个。采用adjacentNumber来记录相邻的棋子数,如果在遍历过程中发现adjacentNumber已经大于2,则此时已经构成了cluster,该步骤不合法。若遍历结束后发现adjacentNumber等于1,这说明有一个相邻节点,但此时不能确定是否构成了cluster,因为与(hIndex,vIndex)相邻的那个节点也有可能与其他节点构成cluster,这种情况如图红框所示,因此还需要继续判断与(hIndex,vIndex)相邻的那个单元格的adjacentNumber,如果它的adjacentNumber=2,则该步骤也不合法,若adjacentNumber=1,则合法。具体见代码实现。最后需要注意的是判断完成后需要把单元格还原。因为这里只是判断,并没有真正落下棋子。

“Network”游戏棋人机对弈的设计与实现(二)—判断步骤是否合法相关推荐

  1. java--五子棋人机大战--课程设计

    南京中医药大学 <Java 程序设计>课程设计 2020-2021 学年 二 学期 日期: 2021 年 5 月 30 日 人工智能与信息技术学院 项目名称: 五子棋 南京中医药大学 2 ...

  2. python五子棋双人对弈_PyQt5实现五子棋游戏(人机对弈)

    这篇博客主要是为了学习Python和PyQt,因为对棋类游戏比较热衷,所以从规则较简单的五子棋入手,利用PyQt5实现图形界面,做一个可以进行人机对弈的脚本,最后打包成应用程序.AI的算法打算用神经网 ...

  3. C实现三子棋 人机对弈

    C语言实现的三子棋,可以人和电脑一起下棋. 源码在最后面!!!!!! 先展示效果!!!! 这里是运行结果,不过这个不是人工智能,可能是人工智障,由于我的水平也就这里,所以也写不出来比较聪明的人机. 这 ...

  4. Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝)

    Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝) 一.问题描述 1.五子棋 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋的棋具与围棋通用,是一种传 ...

  5. C++毕业设计——基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏

    基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C+++EasyX+剪枝算法的能人机对弈的五子棋游戏设计与实现,文章末尾附有本毕业设 ...

  6. 基于强化学习开发人机对弈五子棋游戏

    强化学习主要包括状态空间.价值函数.状态转移三个部分,通过状态之间的转移来得到每个状态的价值,强化学习的目标是使得总价值达到最大.注意,与监督学习不同的是,监督学习通常需要大量的样本来获得有价值的信息 ...

  7. Python实现黑白棋人机对弈

    Python实现黑白棋人机对弈 简书:Python实现黑白棋人机对弈https://www.jianshu.com/p/37191dffbe07 规则 黑白棋的每颗棋子由黑白两色组成,一面白,一面黑. ...

  8. 黑白棋python代码框架_Python实现黑白棋人机对弈

    Python实现黑白棋人机对弈 规则 黑白棋的每颗棋子由黑白两色组成,一面白,一面黑.每次落子,把本方颜色的棋子放在棋盘的空格上,若在横.竖.斜八个方向的任一方向上有本方棋子,则被夹在中间的对手棋子全 ...

  9. Tic-Tac-Toe人机对弈程序(python实现)

    目录 1. 前言 2. 处理流程 3. 代码 4. 代码说明 4.1 棋盘显示 4.2 初始化 4.3 人类棋手的下一步 4.4 AI棋手的下一步 4.5 终局及胜负判断 5. 棋局示例 1. 前言 ...

  10. 简易人机对弈算法的五子棋程序

    要求的五子棋游戏应达到以下几方面的要求: (1)运行程序后即刻出现棋盘并可以开始下棋: (2)人机对弈时,先手为黑棋,后手为白棋:人为先手,计算机为后手: (3)程序能响应鼠标点击并在相应位置画出棋子 ...

最新文章

  1. 基于JSP实现人力资源管理系统
  2. eclipse项目转android studio详解
  3. 如何计算一年总共有多少周_美国计算机CS专业一年需要多少留学费用?
  4. 华南师大计算机学院团委,不忘初心 牢记使命|软件学院团委举行团建活动
  5. 【MCtalk活动推荐】IM快速搭建即时通讯实战
  6. [SecureCRT]通过SFTP方式上传本地文件到服务器
  7. 浅析如何在Nancy中生成API文档
  8. 【CCF】 201809-1 卖菜
  9. 一信通短信接口对接_实例分享:验证码短信接口如何对接?接口api哪个好用?...
  10. 《Shell 脚本学习指南 》 -- 背景知识与入门 [第一、二章]
  11. 计算机操作系统|汤小丹|第四版|习题答案(五)
  12. Ruby on Rails快速创新性能的终极指南
  13. Bundle-Adjustment并行求解器
  14. 精通Matlab数字图像处理与识别nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;
  15. 二手闲置物品交易获资本肯定,前景一片大好,普通人的商机在哪?
  16. 2022DASCTF Apr X FATE 防疫挑战赛 部分web复现
  17. Macbook Pro 外接显卡实现Tensorflow GPU运行之MacOS系统重装
  18. 微信小程序的校园二手物品交易平台系统 uniapp 小程序
  19. 织梦php时间调用,织梦DedeCms时间格式调用汇总
  20. ② ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 ws2812 三原色灯(spi方式 稳定灯光)】

热门文章

  1. 如何让Win10 新建txt文档, 默认格式UTF-8
  2. 偏微分方程数值解法python_微分方程数值方法和偏微分方程有什么区别吗?
  3. JAVA学习,你必读的5本JAVA书籍
  4. 大数据学长面试之华为面试题
  5. 华为java面试题目,含面试题+答案
  6. 机器码、序列号、认证码、注册码的生成算法(一)
  7. IP切换器哪个最好用?
  8. 潜力环保类元宇宙项目地球超人解析
  9. 飞机航线的获取、配准、制作与统计距离
  10. 在vue中使用echarts实现飞机航线 水滴图 词云图