一、游戏概述
我们曾经在《电脑报》2021年第3期和2022年第42期介绍过用Scratc制作五子棋游戏,当时我们确定了绘制棋盘、限制光标移动、实现落子功能、判断棋盘状态、判断五子连珠和实现人机对下等目标。通过那两篇文章的学习,我们已经实现了前五项设计目标,今天我们要实现和AI对下五子棋的最终目标。而且我们还希望能够通过合适的AI算法,创建一个能战胜人类玩家的五子棋AI。
二、游戏规则
五子棋是一款简单的策略游戏,玩家通过在15×15的棋盘上轮流落子,试图使自己的五颗棋子横、竖或对角线连成一条线,即为胜利。游戏采用回合制,黑方先手,然后交替进行。本程序中没有考虑禁手。
三、程序流程图
通过流程图,可知我们的重点在于广播算法阻挡
四、程序逻辑与算法
1.棋盘绘制
初始化数据,并绘制棋盘。棋盘为15行×1 5列的196个小正方形组成的棋盘,棋盘间距为23,棋盘绘制是从舞台X轴-161.Y轴161开始绘制。
2.光标限制
鼠标在棋盘内光标跟随鼠标指针,在棋盘外不跟随。
实现算法:鼠X标坐标大于-161与鼠标X坐标小于161
鼠Y标坐标大于-161与鼠标Y坐标小于161
3.计算行列与作用
Y储存列的值:行=鼠标的Y坐标+161/间距
X储存行的值:列=鼠标的X坐标+161/间距
行列作用于计算落子点;记录落子点状态;落子点米字型方向计算。
计算落子点:X坐标=列×间距-161;Y坐标=行×间距-161。
落子点状态:列表储存落子点状态,0为空状态,1为棋手状态;2为AI棋手状态。
4.五子棋连珠方向:
落子点右上方向:列+1,行+1
落子点右下方向:列+1,行-1
落子点向上方向:列+0,行+1
落子点向左方向:列+1,行+0
反方向:乘以-1(得到8个方向:米字型)
5.落子坐标计算:
坐标号的作用是用于记录每一个落子点的编号,每一个编号储存棋点的状态,0为空状态,1为棋手状态(黑棋);2为AI棋手状态(白棋)。
6.棋手落子功能(黑棋)
角色光标接收到游戏开始,每按下鼠标一次,广播落子消息一次,棋子接收到落子实现落子(黑棋),光标发送消息判断五子连珠一次。
7.机器AI落子(白棋)
按下鼠标落子成功之后判断连珠,连珠成立停止所有程序,不成立广播算法消息,算法OK之后实现机器人落子。
8.判断输赢
原理:
(1)判断五子连珠首先要知道五子棋的连珠规则,以最近一个棋子落下为原点,横竖斜等八个方向有5颗同色棋子连成一条线代表此方胜利。
(2)创建绘制新的角色“判断”。鼠标在棋盘内移动,注意行列的变量,你会发现方向变化的规律,总结出往八个方向每走一格数据的变化:
(3)正方向,向上走X增加0、Y增加1;斜上走X增加1、 Y增加1;右走X增加1、Y增加0。依次方向连续5次造型编号相同,说明连珠成功
9.AI算法阻挡进攻落子
算法原理:在Scratch中,可以使用“控制”模块中的“重复”模块和“条件”模块来实现搜索算法。
搜索算法通常包括搜索空间的生成、状态评估、剪枝等步骤。在实现搜索算法时,需要根据五子棋的规则和特点,设计合适的搜索空间和评估函数。当一方连成五子后,需要计算其胜利点的周围八个位置将阻挡对方落子。
阻挡范围的计算方法如下:对于横向或竖向的五子连成一线,阻挡范围为上下左右四个方向各一个格子。例如,当黑方在水平方向上连成五子时,白方不能在黑方胜利点的上下两个格子落子。对于对角线上的五子连成一线,阻挡范围为左右两个格子。例如,当黑方在对角线上连成五子时,白方不能在黑方胜利点的左右两个格子落子。
实际阻挡落子在计算出阻挡范围后,需要将实际的阻挡效果应用到游戏界面上。我们可以通过修改对应格子的属性来实现这一功能。列表组成黑.2.3.4.5与列表组成白.2.3.4.5用于储存黑白方连珠方向的落子点记录。棋手落子加入下棋记录后,根据下棋记录计算AI防守与进攻坐标计算,利用条件如果组成黑2计算进攻坐标计算,黑3防守坐标计算。
条件判断列表组成黑2与组成白2返回进攻落子点坐标,组成黑3与组成白2返回防守落子点坐标,白3黑2返回进攻落子点坐标,根据棋手先后顺序依次类推列表组成黑白的逻辑关系。根据黑棋落子点,计算棋盘落子点0状态,如果连续计算一个方向都是0状态,确定最终落子坐标。根据黑棋坐标进行函数进攻防守,函数排序,广播计算完毕消息AI落子。
10.变量和列表的功能简介
行:储存行
列:储存列
Winner:黑白棋控制
个数:储存棋数
返回值:落子点状态
落子坐标:棋盘ID号
坐标:所有的坐标ID号,起始值为1,最终值为256.
列表判定结果:空,有棋黑和白
列表黑:记录黑棋状态
列表白:记录白棋状态
列表:组成白2345分别代表连珠12345
列表:组成黑2345分别代表连珠12345
列表候选落子:可选落子点
列表最终候选:最终落子点
列表进攻防守:进攻与防守落子坐标
11.小结
本项目参加了重庆科协组织的科技竞赛,并获奖。通过本项目的编程学习不仅培养了我们的编程和AI开发能力,还增强了我们对策略游戏的认知和理解。在未来的版本中,我们可以进一步优化成神经网络的结构和强化学习算法的参数,加入三三或三四禁手的判断,提升AI的性能。此外,我们还可以添加更多的玩法模式和功能,以满足不同玩家的需求。
本文源代码在“壹零社”公众号编程相关中下载202338.zip
编辑|张毅
审核|吴新
领取专属 10元无门槛券
私享最新 技术干货