当前位置: 首页 > news >正文

暑假复习篇之五子棋③【人机对战篇1】

人机五子棋算法:从每个空位开始出发,八个方位分析连子情况,把每个方向的连子对应的分数累加在空位上

一、分析棋盘情况

活连:两端都是空位

        ①010           10

        ②0110        100

        ③01110       1000

        ④011110       5000

        ⑤020             11

        ⑥0220             110

        ⑦02220           1100

        ⑧022220          5500

眠连:一边是空位,一边不可以下棋

        ①01           6

        ②011        60

        ③0111      600

        ④01111      5000

        ⑤02             7

        ⑥022            70

        ⑦0222           700

        ⑧02222          5500     

算分示例:

007:它的周围有七个点可以落子,在它左边落子会形成一个两连给10分,在它的下面和左上角右下角落子皆是如此,在它左下角落子则会形成一个三连给100分,在它的右边落子与001/003/005形成一个四连则是1000分然后与007形成一个二连就是10,加起来就是1010,在它上面落子分别与005/003/007形成二连,三个10相加就是30

其他棋子的算分与007保持一致

二、哈希表:HashMap

1、存储的数据:key value

2、可以通过key 查找值 value

3、所有的key不允许重复

4、使用方式:HashMap<key的数据类型,value的数据类型>map = new HashMap<>;

5、存储上面的连子情况与对照分数 可以使用HashMap

        HashMap<String , Integer> scoreMap = new HashMap<>();

      存储数据:scoreMap.put(" 010 " , 10);

三、向左查找棋子的代码实例

package daytoday.lfx250706;import java.util.HashMap;public class AI {int ROW = 16;int COL = 16;HashMap<String, Integer> scoreMap = new HashMap<>();public AI() {//关于棋子评分的哈希表scoreMap.put("010", 10);scoreMap.put("0110", 100);scoreMap.put("01110", 1000);scoreMap.put("011110", 5000);scoreMap.put("020", 11);scoreMap.put("0220", 110);scoreMap.put("02220", 1100);scoreMap.put("022220", 5500);scoreMap.put("01", 6);scoreMap.put("011", 60);scoreMap.put("0111", 600);scoreMap.put("01111", 5000);scoreMap.put("02", 7);scoreMap.put("022", 70);scoreMap.put("0222", 700);scoreMap.put("02222", 5500);}public static void main(String[] args) {//测试棋盘二维数组int[][] chessArr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},};System.out.println(chessArr.length);System.out.println(chessArr[0].length);AI ai = new AI();ai.getAIScore(chessArr);}int[][] scoreArr;public void getAIScore(int[][] chessArr) {scoreArr = new int[ROW][COL];//遍历所有的空位,计算每个空位的分数for(int i=0;i< ROW;i++){for(int j=0;j<COL;j++){int cnum = chessArr[i][j];if (cnum == 0){//向八个方位查找连子情况,统计分数累加到空位上toLeft(chessArr,i,j);//toRight(chessArr,i,j);}}}}private void toLeft(int[][] chessArr, int r, int c) {//rc是空位置的坐标//向左边找if (c == 0) {//左边没有位置return;}int cn1 = chessArr[r][c - 1];if (cn1 == 0) {//左边有位置但是没有棋子return;}String codeStr = "0" + cn1;for (int i = c - 2; i >= 0; i--) {if (cn1 == chessArr[r][i]) {//左边第2 - n颗棋子是否与第一颗颜色相等codeStr = codeStr + cn1;} else {if (chessArr[r][i] == 0) {//左边第2 - n颗棋子是否为空codeStr = codeStr + "0";break;} else {break;}}}System.out.println("向左统计:" + codeStr);}
}

四、算分+打印评分位置棋盘

package daytoday;import java.util.HashMap;
//250706public class AI {int ROW = 16;int COL = 16;HashMap<String, Integer> scoreMap = new HashMap<>();public AI() {scoreMap.put("010", 10);scoreMap.put("0110", 100);scoreMap.put("01110", 1000);scoreMap.put("011110", 5000);scoreMap.put("020", 11);scoreMap.put("0220", 110);scoreMap.put("02220", 1100);scoreMap.put("022220", 5500);scoreMap.put("01", 6);scoreMap.put("011", 60);scoreMap.put("0111", 600);scoreMap.put("01111", 5000);scoreMap.put("02", 7);scoreMap.put("022", 70);scoreMap.put("0222", 700);scoreMap.put("02222", 5500);}public static void main(String[] args) {//测试棋盘二维数组int[][] chessArr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},};System.out.println(chessArr.length);System.out.println(chessArr[0].length);AI ai = new AI();ai.getAIScore(chessArr);}int[][] scoreArr;public void getAIScore(int[][] chessArr) {scoreArr = new int[ROW][COL];//遍历所有的空位,计算每个空位的分数for(int i=0;i< ROW;i++){for(int j=0;j<COL;j++){int cnum = chessArr[i][j];if (cnum == 0){//向八个方位查找连子情况,统计分数累加到空位上toLeft(chessArr,i,j);toRight(chessArr,i,j);}}}System.out.println("分数数组:");for (int i=0;i< ROW;i++){for (int j=0;j<COL;j++){System.out.print(scoreArr[i][j] + " \t");}System.out.println();}}private void toLeft(int[][] chessArr, int r, int c) {//rc是空位置的坐标//向左边找if (c == 0) {//左边没有位置return;}int cn1 = chessArr[r][c - 1];if (cn1 == 0) {//左边有位置但是没有棋子return;}String codeStr = "0" + cn1;for (int i = c - 2; i >= 0; i--) {if (cn1 == chessArr[r][i]) {//左边第2 - n颗棋子是否与第一颗颜色相等codeStr = codeStr + cn1;} else {if (chessArr[r][i] == 0) {//左边第2 - n颗棋子是否为空codeStr = codeStr + "0";break;} else {break;}}}int score = scoreMap.get(codeStr);System.out.println("向左统计:" + codeStr + "--- 分数:" + score);scoreArr[r][c] += score;}public void toRight(int[][] chessArr, int r, int c) {// 向右找if (c == COL - 1) {// 空位在最右边return;}int cn1 = chessArr[r][c + 1];if (cn1 == 0) {// 右边第一颗就是空位return;}String codeStr = "0" + cn1;for (int i = c + 2; i < COL; i++) {if (cn1 == chessArr[r][i]) {codeStr += cn1;} else {if (chessArr[r][i] == 0) {codeStr += "0";}break;}}int score = scoreMap.get(codeStr);System.out.println("向右统计:" + codeStr + "--- 分数:" + score);scoreArr[r][c] += score;}
}

http://www.xdnf.cn/news/1083943.html

相关文章:

  • Oracle使用SQL一次性向表中插入多行数据
  • 数据可视化中常用的图表类型 及其适用场景,涵盖基础到高级,帮助你根据数据类型和展示目标选择合适的图表:
  • 【论文笔记】【强化微调】Pixel Reasoner:早期 tool call 的调用
  • react当中的this指向
  • 【从0-1的CSS】第3篇:盒子模型与弹性布局
  • 《前端路由重构:解锁多语言交互的底层逻辑》
  • 3. lvgl 9.3 vscode 模拟环境搭建 lv_port_pc_vscode-release-v9.3
  • Paimon索引概述
  • vue3.4中的v-model的用法~
  • 支持向量机(SVM)在肝脏CT/MRI图像分类(肝癌检测)中的应用及实现
  • 从源码到思想:OneCode框架模块化设计如何解决前端大型应用痛点
  • Application的onLowMemory从Android API 34开始系统不再触发,从API 35开始废弃
  • 【BTC】协议(共识机制)
  • 自定义指令
  • java+vue+SpringBoo职业生涯规划系统(程序+数据库+报告+部署教程+答辩指导)
  • 【AI大模型】Spring AI 基于mysql实现对话持久存储详解
  • 多模态大语言模型arxiv论文略读(149)
  • 【网络协议安全】任务13:ACL访问控制列表
  • 深度学习图像分类数据集—蘑菇可食性识别分类
  • 使用Python将PDF转换成word、PPT
  • 量子计算机技术(第二节,到底什么是量子)
  • 【CSS-15】深入理解CSS transition-duration:掌握过渡动画的时长控制
  • 高速信号眼图
  • ASP.NET代码审计 Web Forms框架 SQL注入漏洞
  • 【Python】使用读取到的文件
  • 零成本搭建浏览器远程Linux桌面:Ubuntu/Debian方案全解析
  • MySQL数据库主从复制
  • python-if结构、三目运算符
  • 善用关系网络:开源AI大模型、AI智能名片与S2B2C商城小程序赋能下的成功新路径
  • 知识文档管理系统选型指南(中小企业专用)