1、游戏的总体方案设计
规则设计内容:
(1)棋盘大小、落子规则、胜利条件等。(总体游戏流程如下图)
image.png
用户界面设计:
(1)字体显示:通过STM32的内部Flash存放字库文件,字库信息结构体用来保存字库基本信息(地址和字体大小等,字体大小分为12、16、24),字库结构体需要包含显示更新进度、更新指定字库,更新全部字库、初始化字库的流程,通过字符指针寻找开始字符串的开始地址、GBK码,再设置函数用于获取某个汉字的点阵数据,这些数据用于显示一个指定大小、位置、宽度的汉字或字符串在图形屏幕上。
(2)设计游戏界面:将设定背景色为青色,清空屏幕并填充青色背景,以确保画布是干净的。定义一个变量x1,表示绘制文本的起始横坐标,设定画笔颜色为红色,在坐标(x1,48)处绘制字符串 “五”,字号为 24,字体风格为普通,依次按照这个步骤来绘制字符串“子”、“棋”颜色分别为白色和棕色,在指定的区域内绘制一个矩形框,用于表示"双人对战"选项,在指定的区域内绘制另一个矩形框,用于表示"人机对战"选项,矩形框颜色为白色,在两个矩形框内的坐标分别绘制字符串“双人对战”、“人机对战”颜色均为黑色。最后设定背景色为青色,这是为了绘制完成后整体界面更加美观。(效果图如下)
image.png
(3)棋盘显示(15x15的棋盘布局)、落子操作、游戏信息展示等,可以使用图形界面或者命令行界面。
(4)游戏逻辑实现:编写游戏的逻辑代码,实现落子判定、胜负判定功能,可以采用面向对象的方式组织代码,分离界面和逻辑。
对战模式设计:
(1) 双人对战设计:支持双人对战,确保输入输出时是对应的棋子,玩家交替输入。
(2)人机对战设计:支持人机对战,设计人与计算机之间的竞技对决:开发并实施先进的算法策略,允许计算机执行策略性的移动。
2、系统硬件结构
(1)STM32微控制器
选择STM32微控制器STM32f103zet6(v2)型号作为核心处理器单元,该微控制器应具备足够的性能来处理游戏逻辑和用户界面。 原理图可看下图。
image.png image.png
(2)显示屏
连接液晶显示屏到STM32开发板的相应引脚,确保电源和信号线连接正确。确保开发板上的时钟配置正确,以便与液晶屏正常通信。使用标准库函数初始化液晶显示屏,设置参数如屏幕分辨率、像素格式等。集成到一个显示屏(LCD或OLED)用于展示游戏界面和棋盘界面。如下图。
image.png image.png
(3)电源管理
考虑电源管理模块,以满足整个系统的供电需求,采用总共有 2 个稳压芯片:U10 和U11,DC_IN 用于外部直流电源输入,范围是DC6~15V, 输入电压经过 U11 DC-DC 芯片转换为 5V 电源输出,其中 VD1是防反接二极管,避免外部直流电源极性搞错的时候,烧坏开发板。K1为开发板的总电源开关,F1为1000ma自恢复保险丝,用于保护 USB。U10 为 3.3V 稳压芯片,给开发板提供 3.3V 电源。 并确保低功耗设计以延长电池寿命。如下图。
image.png
3、系统软件设计
(1)控制游戏基本功能:
1)开始游戏:通过启动游戏界面初始化游戏,这可能包括设置各种参数、初始化外设,玩家选择对战模式其中含有双人对战或人机对战,确认后初始化游戏棋盘状态,准备开始下棋。
2)下棋:先定义一个函数,用于落子。函数接受两个参数,即落子的行坐标 x1 和列坐标 y1,检查输入的行列坐标是否为 -1,如果是,则返回 0,表示无效的落子,玩家通过交互界面选择棋盘位置进行下棋,系统检测判断是否符合规则并进行棋子放置,然后轮到另一方下棋,同时判断是否为player1,是则绘制黑色棋子,反之为白色棋子。
3)结束游戏:提供结束当前游戏的选项,玩家通过按下复位键后游戏返回初始界面。
4)游戏结束:在游戏结束时,显示游戏胜负结果,并提供重新开始或返回主菜单的选项。
5)重新游戏:初始化游戏状态和棋盘,重新开始一局新游戏。如下图所示。
image.png
这些基本指令可以通过按钮输入、触摸屏输入或者其他交互方式来实现,本次项目主要使用触摸屏来实现操作。在基于STM32的五子棋游戏设计中,这些指令的实现需要考虑到硬件设备的控制、游戏逻辑的处理以及用户交互的反馈等方面。
(2)悔棋功能
1)在部分情况下,允许玩家悔棋,即撤销上一步操作。这段代码实现了一个悔棋功能,其基本逻辑如下:
首先通过判断 chess_num 的值是否大于等于2来确保棋局中至少有两步棋,以便执行悔棋操作。
2)如果棋局中有至少两步棋,则执行以下操作:
获取最后一步棋的坐标 (x1, y1),将该位置的棋子状态设置为无棋子,并从LCD屏幕上清除该位置的棋子显示,棋局中的棋子数减一,再度获取倒数第二步棋的坐标,执行相同的操作,将黑棋和白棋的剩余时间都设置为当前时间,相当于重新计时。
(3)双人对战的基本逻辑
1)初始化模块
游戏设置为黑棋先手,功能设计主要包括设置初始化参数(如设置棋盘尺寸、棋盘初始数据、先手玩家)和绘制棋盘。如下图。
image.png
2)游戏控制模块
游戏执行过程中,通过触摸LCD屏幕获取坐标,当坐标有效时触发对应的功能(落子、悔棋),当形成五子连珠时,提示本局游戏结束,弹出提示对话框。
3)检查模块
在游戏过程中,当玩家一方落子后,随即进行检查判断是否五子连珠,如果五子连珠则游戏结束,否则继续等待获取坐标(落子、悔棋)。
4)逻辑设计
设置Chess_piece函数:
函数接受两个参数x1和y1,表示落子的位置坐标。
首先判断如果x1或y1为-1,则返回0,这表示选择了无效的位置。
调用judge函数判断落子位置是否合法,如果合法则进行以下操作:
根据当前玩家(player)是p1还是p2,在棋盘上绘制相应颜色的棋子(黑子或白子)。
在棋盘数据结构中记录该位置的落子信息。
将该棋子的坐标位置存储到数组a和b中,并增加chess_num计数。
调用judge_win函数判断当前玩家是否获胜,如果获胜则延迟1秒后重新开始游戏。
调用changeplayer函数交换当前玩家。更新显示玩家剩余时间。
设置changeplayer函数
changeplayer函数用于交换当前玩家,根据当前player的值(p1或p2),通过简单的算术运算将player切换为另一位玩家,这样可以实现黑白双方在游戏中轮流落子的效果。
这两个函数的设置实现了五子棋游戏中落子和玩家交换的逻辑,同时还实现了判断胜负、显示时间等功能,是五子棋游戏逻辑中重要的一部分。
image.png
4、游戏系统功能测试
(1)游戏编译
基于keil 5来设计程序,编写好五子棋的游戏代码后,编译所写的程序,编译成功后通过ST-LINK连接开发板进行程序烧入。
image.png
(2)开始游戏
主界面是显示游戏模式,主要展示对玩家提供两种游戏模式:双人对战、人机对战,玩家可以根据自己的需要选择相应的游戏玩法。
image.png
(3)游戏界面
提供了一个15x15的棋盘,玩家可以在无子的棋盘坐标上进行落子,界面显示了棋局形式、回合倒计时、悔棋的功能。
image.png
(4)悔棋功能
当棋盘上出现大于等于两个棋子时可以点击悔棋所在的坐标进行悔棋操作,完成悔棋操作后回合倒计时将会重新计数。
image.png
(5)回合倒计时功能
当其中一方在规定的30s回合倒计时内未输入有效坐标(如落子),则自动判对方胜出,显示游戏结果。
image.png