五子棋AI:实现逻辑与相关背景探讨(上)
绪论
本合集将详细讲述如何实现基于群只能遗传算法的五子棋AI,采用C++作为底层编程语言
本篇将简要讨论实现思路,并在后续的文中逐一展开
了解五子棋
五子棋规则
五子棋是一种经典的棋类游戏,规则简单却充满策略性。游戏在一个19×19的棋盘上进行(也可以使用13×13或15×15的棋盘)。游戏的目标是率先在棋盘上连成五个相同颜色的棋子(横向、纵向或斜向)。
基本规则:
- 棋子:游戏使用两种颜色的棋子,通常为黑白两色。
- 落子:玩家轮流在棋盘上放置自己的棋子。
- 胜利条件:第一个在直线上(横向、纵向或对角线)连成五个棋子的玩家获胜。
五子棋操作简单,规则易懂,但需要很高的策略和技巧才能赢得比赛。
人类玩家是如何下五子棋的?
以下是一些五子棋对决的思路:
控制中心区域
- 中心位置的重要性:棋盘中心的控制对游戏至关重要。控制中心区域可以给你更多的机会去创建和阻止对方的五子连线。
创建威胁
- 连线威胁:尽量让对方必须防守而不能专注于自己的进攻。
- 双活三:如果形成两个三子连线,并且这两个连线不会被对方轻易阻挡,就能够在几步内取得胜利。
防守对方的连线
- 观察对方的棋子布局:注意对方棋子的排列,尤其是对方试图形成的三子、四子连线。
- 及时阻挡:如果对方有连续的三子或四子的排列,应该优先阻挡对方的连线。
预判对方策略
- 猜测对方意图:了解对方的策略,预测对方的下一步棋,提前做出相应的防御或进攻。
AI应该如何模仿?
为了让AI棋手学会下五子棋,甚至超越人类玩家的水平,首先应当有以下步骤:
理解棋盘信息:将棋盘的状态转换为程序能够处理的格式。这通常包括将棋盘上每个位置的状态(如空白、黑子或白子)编码为特定的数据结构,以便程序可以进行分析和处理。
设定行为集合:定义AI可以执行的操作范围。在五子棋中,AI可以在棋盘上任意未被占据的位置落子。
设定决策模式:确定AI的决策方式。本例中,AI采用贪心策略,即在每一步中选择预期回报最高的行动。贪心策略通过评估每个可能的落子位置的即时收益,选择对当前局势最有利的行动。
理解棋盘信息
理论上来讲,能够给AI提供的信息越多,那么AI做出的决策质量就越高,对于棋盘信息可以以格子为单位,评估该格子对于己方、和敌方的价值。
举例来说,如果在此处落子,敌方可以构成五子连珠,那么对于地方而言这是非常高价值的格子,那么在己方回合,当务之急是在此处落子,阻止对方胜利,除非在其它位置落子己方可以胜出。
对此,我们可以对棋盘上每一个可行位置进行打分,评估其对于己方、敌方的价值。
如何定义该位置对己方的价值?
一枚棋子可以在四个方向上与其它棋子连成五子,即:水平、竖直、对角线、主对角线

可以采用如下方法判断在某一具体方向上的价值
- 在四个方向中选择某一方向
- 向正方向、负方向分别查找4格,如遇到空格或敌方棋子则提前停止
- 统计己方棋子个数,以及两端的被遮拦情况。
例如对于下图,在该处落子后,形成水平方向上的两子连珠,且一端有遮拦一端无遮拦

一共可能形成如下几种情形,我们可以依据经验公式评估其价值。
| 子数 | 1子 | 2子 | 3子 | 4子 | 5子 |
|---|---|---|---|---|---|
| 无遮拦 | ③ | ③ | ② | ① | MAX |
| 一端遮拦 | - | - | ③ | ② | ① |
| 两端遮拦 | - | - | - | - | ① |
'-' 表明该位置在该方向上具有的价值较低,不予考虑。然而,如果其他方向上的情况更有利,那么该位置的价值仍然可能非常高。。
接下来,我们可以讨论棋子在多个方向上的价值,一般来说,仅需要考虑最高价值的两个方向。
这是因为两个活三(无遮拦的三子连珠)足以致胜,三个活三并没有明显优势。
| 价值 | 最优方向 | 次优方向 |
|---|---|---|
| Lv1 | MAX | ? |
| Lv1 | ① | ? |
| Lv2 | ② | ② |
| Lv3 | ② | ③ |
| Lv3 | ② | - |
| Lv4 | ③ | ③ |
| Lv4 | ③ | - |
| Lv4 | - | - |
“?” 指代任意情况,例如(MAX-?)对应了(MAX-MAX)、(MAX-①)、(MAX-②)、(MAX-③)、(MAX-'-')
该定义方式将行为的优先级分为了四个等级
- Lv1:下子直接取胜,或在一回合内取胜。
- Lv2:下在大概率在若干回合内取胜。
- Lv3:能够迫使对方一直防御。
- Lv4:收益较低。
如何综合攻防?
若要综合攻防,必须将具体位置对敌方的价值考虑进去。倘若某一位置对敌方来说是高价值的,那我们在此处落子可以破坏敌方阵型,削弱敌方价值,同样我们可以给出如下价值表
| 综合价值排序 | 己方价值 | 敌方价值 | 对应的奖励数值 |
|---|---|---|---|
| 1 | Lv1 | ? | \(2^{20}\) |
| 2 | ? | Lv1 | \(2^{16}\) |
| 3 | Lv2 | ? | \(2^{12}\) |
| 4 | ? | Lv2 | \(2^{8}\) |
| 5 | Lv3 | ? | \(2^{4}\) |
| 6 | Lv4 | ? | \(2^{0}\) |
“?” 指代任意情况,例如(Lv1-?)对应了(Lv1-Lv1)、(Lv1-Lv2)、(Lv1-Lv3)、(Lv1-Lv4)
在进行判断时,应当从上往下逐一判断。
这里给出的奖励数值仅供参考。
总结
在本小节中,我们精心构建了一种全新的综合评估方法,旨在全面衡量棋盘上的每个格子对于己方和敌方的战略价值。通过设计一系列精细的量化指标,我们赋予了AI/计算机深入解读棋盘格局的能力,使其能够准确判断每个格子的具体价值。这一方法为AI/计算机制定决策提供了坚实的数据支撑。
行为集规定与决策制定
为了使AI做出高效的决策,我们首先需要定义一套合适且简洁的行为集合。这意味着AI在做出选择时,不必每次都逐一考虑棋盘上的所有位置。在此基础上,我们需要开发一种策略,帮助AI从众多可能的决策中筛选出最为恰当的一个。通过这种方式,AI能够在复杂的环境中迅速而准确地做出最佳决策。
ROI 感兴趣区域
倘若上一轮你在棋盘中心落子,那么下一轮你不应当在棋盘的最角落落子。
一般来说,在落子时,只有与已有棋子(无论是己方还是敌方)邻接的位子才具有价值,首先我们定义邻接。
考虑棋盘上只有一子的情形,规划出与其具有高价值“联动”的区域如下:

可以给出更具体的定义:
倘若一个格子位于另一格子的水平、竖直、主对角线或副对角线方向上,并且两格子距离小于等于2,那么称这两个格子为邻接关系。进一步的,称距离为1为强邻接,距离为2为弱邻接。
进一步的,我们定义感兴趣区域如下:
满足以下要求之一的空格子为感兴趣区域:
- 该格子是棋盘正中心。
- 该格子与至少一个己方棋子所处格子存在邻接关系。
- 该格子与至少一个敌方棋子所处格子存在强邻接关系。
下图给出了己方落子ROI区域的示例,其中红色为己方棋子,蓝色为对方棋子,灰色表示感兴趣区域。

决策进行
在进行决策前,我们可以评估感兴趣区域中所有格子的价值,假定ROI中格子的个数是\(N\),格子的价值分别是\(x_0, x_1, ..., x_{N-1}\),我们可以采用下述两种方法选择决策
硬最大值 hardmax
选择奖励最大的决策,即
\]
软最大值 hardmax
不同于硬最大值,软最大值以一定几率接受非最优解,其包含一个常量\(K\),常量K越大表示对低价值决策的接受程度越大,当常量\(K\to 0\)时,软最大值退化为硬最大值;当常量\(K\to +\infty\)时,软最大值退化为随机抽取。
\]
结语
下一篇中我们将继续讨论如何训练AI。
五子棋AI:实现逻辑与相关背景探讨(上)的更多相关文章
- .NET同步与异步之相关背景知识(六)
在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...
- 五子棋AI清月连珠开源
经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...
- 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)
五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...
- 五子棋AI大战OC实现
Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...
- 五子棋AI教程
https://github.com/Chuck-Ai/gobang 我写了非常详细的中文教程,教你如何一步步编写自己的五子棋AI: 五子棋AI设计教程第二版一:前言 五子棋AI设计教程第二版二:博弈 ...
- 【五子棋AI循序渐进】——开局库
首先,对前面几篇当中未修复的BUG致歉,在使用代码时请万分小心…………尤其是前面关于VCF\VCT的一些代码和思考,有一些错误.虽然现在基本都修正了,但是我的程序还没有经过非常大量的对局,在这之前,不 ...
- {前端CSS} 语法 Css的几种引入方式 css选择器 选择器的优先级 CSS属性相关 背景属性 边框 CSS盒子模型 清除浮动 overflow溢出属性 定位(position)z-index
前端CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 当浏览器读到一个样式表,它就会按照这个样式表来对文 ...
- 【五子棋AI循序渐进】——多线程搜索
关于多线程搜索,有很多方法来实现,很多文章推荐基于MTD(F)的方式.好处不言而喻,不过我的程序中采用的是基于PVS的多线程搜索.实现起来主要是这几个方面问题需要解决: 1.置换表的互斥访问. 2.局 ...
- 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码
前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...
- 人机ai五子棋 ——五子棋AI算法之Java实现
人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...
随机推荐
- yb课堂 vue里面的状态管理vuex 《四十》
文档:https://vuex.vuejs.org/zh/ 在store/下index.js import Vue from 'vue' import Vuex from 'vuex' Vue.use ...
- Mybatis 一级缓存
Mybatis一级缓存介绍 什么是缓存 程序经常要调用的对象存在内容中,方法其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能 Mybatis一级缓存 简介:一级缓存的作用域 ...
- QAnything AI开源的企业级本地知识库问答解决方案,致力于支持任意格式文件或数据库的问答
QAnything AI简介 QAnything ai是一个本地知识库问答系统,旨在支持多种文件格式和数据库,允许离线安装和使用.您可以简单地删除任何格式的任何本地存储文件,并获得准确.快速和可靠的答 ...
- 面试官:Dubbo一次RPC请求经历哪些环节?
大家好,我是三友~~ 今天继续探秘系列,扒一扒一次RPC请求在Dubbo中经历的核心流程. 本文是基于Dubbo3.x版本进行讲解 一个简单的Demo 这里还是老样子,为了保证文章的完整性和连贯性,方 ...
- Django DRF @action 装饰器
@action 装饰器在Django REST Framework (DRF) 中非常有用,它可以帮助你在ViewSet中创建自定义的动作,而不仅仅是依赖标准的CRUD操作(Create, Read, ...
- [oeasy]python0106 七段数码管_显示字母_BP机
七位数码管进化 回忆上次内容 上次回顾了 7-seg 七位数码管 可以显示数字 甚至是十六进制数字 添加图片注释,不超过 140 字(可选) 能否让 七位数码管 将26个字母 全部都显 ...
- 强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay
在软件开发和测试过程中,我们经常需要对应用程序的网络请求进行录制和回放,以便进行性能分析.压力测试或者模拟复杂的网络环境.今天,我要向大家推荐一款简单易用的 HTTP 请求流量录制回放工具:Gorep ...
- 使用JavaScript编写vue指令v-model,v-model原理实现
首先先要知道的是v-model的作用是实现数据的双向绑定,即: 数据在视图层的双向响应. 实现思路主要分为两步: 第一步:数据层到视图层的响应 将数据响应到视图层的方式,在vue2使用的是Object ...
- Kubernetes 存储概念之Volumes介绍
Volumes 默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,第一:当容器挂掉,K8S重启它时,文件将会丢失:第二:当Pod中同时运行多个容器,容器之间需要共享文件时 ...
- Linux 基于flock命令实现多进程并发读写文件控制
基于flock命令实现多进程并发读写文件控制 需求描述 实际项目中,需要在Linux下通过shell脚本并发读写同一个文件,但是希望同一时刻,只有一个进程可以在读.写目标文件. 解决方案 使用floc ...