游戏概述
我们曾在《电脑报》2021年第3期和2022年第42期中介绍了使用Scratch制作五子棋游戏。在之前的文章中,我们设定了绘制棋盘、限制光标移动、实现落子功能、判断状态、判断五子连珠和实现人机对下等目标。通过这两篇文章的学习,我们已经实现了前五项设计目标。现在,我们将专注于实现与AI对下的最终目标,并希望通过合适的AI算法,创建一个能够战胜人类玩家的五子棋AI。
本文的重点在于算法思路,如果对其他基本功能的实现代码有疑问,可以在“壹零社”公众号中找到前两篇文章的详细代码。
游戏规则
五子棋是一款简单的策略游戏,玩家在15×15的棋盘上轮流落子,试图使自己的五颗棋子横、竖或对角线连成一条线,即为胜利。游戏采用回合制,黑方先手,然后交替进行。本程序没有考虑禁手规则。
程序流程图
通过流程图,我们可以清晰地看到我们的工作重点——广播算法阻挡。
程序逻辑与算法
-
棋盘绘制:初始化数据并绘制棋盘。棋盘由15行×15列的196个小正方形组成,棋盘间距为23,绘制从舞台X轴-161、Y轴161开始。
-
光标限制:鼠标在棋盘内时光标跟随鼠标指针,在棋盘外则不跟随。实现算法为:鼠标X坐标在-161到161之间,Y坐标也在-161到161之间。
-
计算行列与作用:储存列的值(行=鼠标Y坐标+161/间距),储存行的值(列=鼠标X坐标+161/间距)。这些值用于计算落子点、记录状态以及落子点米字型方向的判断。
-
五子棋连珠方向:包括右上、右下、向上、向左等八个方向。每个方向都可以通过乘以-1得到反方向,形成米字型八个方向。
-
落子坐标计算:用于记录每一个落子点的编号,每个编号储存棋点的状态(0为空状态,1为棋手状态,2为AI棋手状态)。
-
棋手落子功能(黑棋):角色光标接收到游戏开始信号后,每按下鼠标一次,广播落子消息一次,实现黑棋落子,并发送消息判断是否有连珠。
-
机器AI落子(白棋):在成功落子后判断连珠,如果连珠成立则停止所有程序;如果不成立则广播算法消息,待算法确认后实现机器人落子。
-
判断输赢:根据五子棋的连珠规则,以最近一个棋子落下为原点,判断横、竖、斜等八个方向是否有五颗同色棋子连成一线。通过总结方向变化的规律,可以判断连珠是否成功。
-
AI算法阻挡进攻落子:使用Scratch中的“控制”模块和“重复”、“条件”模块实现搜索算法。根据五子棋的规则和特点,设计合适的搜索空间和评估函数。当一方连成五子后,需要计算其胜利点的周围八个位置的阻挡范围。例如,对于横向或竖向的五子连成一线,阻挡范围为上下左右四个方向各一个格子;对于对角线上的五子连成一线,阻挡范围为左右两个格子。
-
变量和列表的功能简介:包括储存行、列、黑白棋控制、棋数、落子点状态、棋盘ID号等。还有用于记录黑白方连珠方向的列表、判定结果列表、候选落子列表等。
小结
本项目曾参加重庆科协组织的科技竞赛并获奖。通过本项目的编程学习,我们不仅提高了编程和AI开发能力,还加深了对策略游戏的认知和理解。在未来的版本中,我们可以进一步优化神经网络结构和强化学习算法的参数,加入三三或三四禁手的判断以提升AI性能。此外,还可以添加更多的玩法模式和功能以满足不同玩家的需求。本文的源代码可以在“壹零社”公众号编程相关部分下载(202338.zip)。