首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scratch制作五子棋人机对战版(高阶)

一、游戏概述

我们曾经在《电脑报》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

编辑|张毅

审核|吴新

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O4pVxhP6J37Kft5o8Np8bicw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券