基于单片机的贪吃蛇游戏的实现

2020-09-10 07:22吴尚茗杨丽燕刘亚荣
科技尚品 2020年6期
关键词:STM32单片机

吴尚茗 杨丽燕 刘亚荣

摘 要:文章是基于ALIENTEK精英STM32开发板,在μC/OS-II嵌入式操作系统下,用C语言进行的简单贪吃蛇游戏设计。本游戏设计主要利用触屏显示模块、LED测试模块和RTC时钟模块来控制游戏运行。利用LCD触摸屏实现四个轻触按键,将按键信息发送至邮箱,控制上下左右,实现贪吃蛇的简单吃豆、计数和整个游戏界面显示等相应功能。

关键词:贪吃蛇游戏;STM32单片机;μC/OS-II嵌入式操作系统

中图分类号:TP368.12 文献标识码:A

手机游戏的历史已经超过十年,其是现代生活的一种娱乐方式。贪吃蛇游戏作为早期的嵌入式开发游戏,虽然游戏内容和画面都很简单,但在手机游戏出现的早期,其是一款相当经典的游戏[1]。

1 总体方案设计

本次设计的主要硬件模块,选择使用ALIENTEK精英STM32开发板。基于开发板的Cotrex-M3内核,及μC/OS-II嵌入式操作系统,将μC/OS-II嵌入式操作系统移植到ALIENTEK精英STM32开发板上。在μC/OS-II嵌入式操作系统下,利用单片机的内设LED显示灯模块以及RTC系统时钟等两个模块相互配合,并结合STM32搭载外设4.3寸TFTLCD液晶显示屏的显示和触摸功能,来实现贪吃蛇游戏的简单吃豆、计数以及整个游戏界面显示等相应功能。系统总体设计框图如图1所示。

2 游戏的软件设计

2.1 系统总程序设计

本游戏从游戏开始后进行难度选择,通过选择难度确定蛇运动的速度,由此开始游戏。开始游戏时,蛇首先向指定方向运动,再通过按键控制蛇的运动方向以及游戏的暂停与开始。如果蛇吃到食物,则蛇身增长;如果蛇碰到自身和墻壁,则游戏结束,通过触屏按键重新开始游戏。游戏的总流程图如图2所示。

2.2 优先级任务设计

在μC/OS-II嵌入式操作系统下,软件设计要分不同任务进行设计,且每个任务按各自优先级高低顺序执行,任务之间通过信号量及消息邮箱进行通信。

此次设计主要创建三个不同优先级别的任务:LED任务(led_task)、触摸屏任务(touch_tesk)、贪吃蛇任务(snake_task)。优先级的顺序为touch_tesk>snake_task>led_tesk。即开始游戏就执行贪吃蛇任务,如果屏幕扫描到有触摸按键按下,就发送触摸事件消息到邮箱;此时,游戏任务从邮箱中获取消息,开始执行游戏任务。

优先级任务设计流程图如图3所示。

2.3 游戏显示任务设计

设计的主要思路为,将屏幕界面分为按键控制模块和游戏界面模块,初始页面使用LCD的画键盘功能设计游戏等级,选择等级后清屏进入游戏界面。游戏界面将屏幕分成720个小方块,即地图上有720个点,每个点的数值代表0位空地,大于0为蛇身,-1为食物。一开始设定所有的点都为0,利用RTC时钟随机将一个点的数值设为-1,再将连续3个点分别置1、2、3代表蛇身,这就是贪吃蛇的初始长度,之后蛇身数值增长,因此蛇身的数值都是大于1的。

2.4 蛇身运动设计

根据输入的键位值来确定蛇的方向。蛇的运动方式为柔体传动,即蛇身的位置不变,蛇头向相应的方向前进,蛇尾相对于上一次响应减少一个方块,而不是输入某一个方向后整体向同一个方向移动。

因此,在设计时要定义一个数组map[i],用来储存蛇身的数据,用LCD写入颜色的功能将这个数组涂上贪吃蛇的颜色。定义蛇尾为1,蛇头每前进一步,len增长,map值自加,向前的格子涂上蛇身颜色。同时,通过坐标检测确定蛇并没有吃到食物,此时使用len自减。这样,贪吃蛇的总长度就没有发生变化。将map=1的格子涂上白色,即去掉蛇尾,再将map自减,完成蛇的一次向前运动。同理,如果蛇吃到了食物,则将食物涂为蛇身颜色,此时len增长,map增长,且将不做自减。此时,蛇再进行向前运动。

具体实现细节如下。

2.4.1 判断蛇的移动方向

初始时将cl定义为蛇的运动方向,当触屏任务将发送指令时,蛇头向相应位置的坐标增加,即蛇向相应的方向移动。在运动过程中,如果输入的运动方向与贪吃蛇正在运动的运动方向相反,则会发生反向运动。为了避免反向运动造成程序运行错误,需要判定运动方向不为指令方向的反方向。

2.4.2 判断蛇是否吃到食物

根据蛇头的坐标与食物的坐标是否相等,来判断蛇是否吃到食物。如果吃到食物,则蛇的长度和游戏分数均加1,并执行RTC时钟指令,出现下一个食物。吃掉食物后,蛇的关节数加1,并根据蛇的移动重新画出蛇的身体。

2.5 结束任务设计

根据设定的游戏区域范围,如果蛇头的坐标超过该范围,即相当于蛇撞墙死掉,游戏结束;当蛇长超过3的时候,就有可能与自身相撞,判断当蛇头的坐标与蛇身体的任一坐标相等时,蛇就死掉,游戏结束。判断如果蛇的sh.x和sh.y在设定的区域外或map[sh.y * 30 + sh.x]大于1,则说明蛇死掉,就触发游戏结束。

蛇死掉后,游戏任务触发信号量,开启时钟延时。此时,游戏结束任务获取信号量,开始执行游戏结束任务,即在LCD显示屏上显示“GAME OVER!”和“RESET”按键。点击“RESET”按键,可以重新回到游戏页面。

3 结语

本次设计实现了贪吃蛇游戏的基本功能:游戏开始时,通过方向键控制贪吃蛇的运动方向;当贪吃蛇吃到随机出现的食物时蛇身增长,当蛇碰到墙壁或者自身时,蛇死亡,游戏结束。并且在按键、吃到食物以及贪吃蛇死亡时配合不同音效,同时游戏有三个可调节的难度供选择

参考文献

[1] 刘晓峥.浅析基于J2ME平台的贪吃蛇游戏开发[J].科技视界,2013(17):38-39.

猜你喜欢
STM32单片机
基于STM32单片机的脉冲信号参数高精度测试仪
基于STM32芯片的移动机器人的避障研究
基于STM32的两轮自平衡遥控小车设计
基于STM32单片机的数码相框显示系统设计
基于STM32的中老年人跌倒监测装置研究
基于STM32的智能电风扇设计