2020年科协招新需要出训练题,让新生了解一下单片机,所以我这边打算出一道游戏机的题,让新生用单片机实现一个游戏机,共3个游戏可选,分别为:贪吃蛇,打地鼠和推箱子,由于是针对于0基础新生,所以在指标上不做过多要求,只要实现出效果就行。
我负责的是贪吃蛇和推箱子
参考博客
(单片机原理与应用)大液晶屏的游戏设计(推箱子)
基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
推箱子
推箱子顾名思义就是控制游戏里的人将所有箱子全部推到指定位置就算通关,这个游戏在以前的手机上都挺常见的。本次题目主要是要求新生自己找到一些推箱子的地图,并将地图里的要素显示在选择的屏幕上,然后通过按键/摇杆来控制游戏里的人移动,并完成关卡,关卡数做的越多,给分越高,5个封顶。
基本设计思路
OLED屏幕
用单片机制作游戏机最大的难点就在于屏幕,你要通过单片机来控制题目显示地图中的种种要素,比如推箱子的箱子,墙壁,人物等,因此根据自己想要实现游戏先对屏幕进行选型,然后熟悉自己的屏幕是非常重要的
在我自己实现方案的时候,我选择的是常用的OLED屏幕,OLED屏幕对于显示一些简单信息是非常方便的,建议一定要学会如何使用,很多时候一些设计用OLED屏幕就足够了。
OLED控制
在某宝上买到的OLED一般是SSD1306,通信方式一般是SPI或IIC,哪一种都可以,我用IO口模拟IIC和SPI的时候,SPI的速度会更快些,还有并口的控制方式,这个就是通信相对方便,但占用的IO口较少。如果想玩更高级的话,可以去买正点原子的OLED屏幕,那个虽然贵了点,但是性能更好,还有多种控制方式。
关于单片机如何控制OLED,在这里不做详述,网上的资料非常齐全,讲的也很清楚,主要的流程如下,跟着这个思路去一步步实现就行:
地图尺寸设计
常见的OLED屏幕的分辨率是128*64,分辨率就可以理解为一个个点,每个点都是一个小LED,对这个小LED写1,他就点亮了,写0就熄灭了,对这些一个个点进行设计就可以实现显示字符,汉字等常用的信息。熟悉OLED控制的人就会知道OLED是一次写8个点(一列),所以地图的要素设计为8的倍数会比较方便操作,因此屏幕显示的设计如下:
下面是实际在OLED上显示的画面(以第一关为例):
其中地图中的要素可以自己去绘制8*8的像素图案,也可以直接使用我在参考链接中这位作者给出的方案,我是直接使用的这个图案:
那么如何将这些要素显示在OLED屏幕上呢?最简单的方法就是用电脑的画图软件对图片取模,这个方法在这里也不做详述,在网上搜一下学习一下即可(可以去看原子或杜洋工作室的教程)
经过试验,这几张图片不能直接用画图软件直接保存,所以建议直接在取模软件上画图,反正只是64像素点的图,蛮好画的
以下是我自己画的一些图,仅供参考:
总之,得到这几个点阵的数据就可以在OLED上显示了,这样界面就没有啥问题了
地图显示
由于我们设计每个地图要素都是8*8的,在OLED上面显示非常方便,自己参考一下别人的地图或者自己设计地图即可,我贴的参考文章里面的就可以,选几张做一下:
显示在OLED上:
基本信息显示
在屏幕右边我们要显示一些基本信息,比如现在的关卡数,已经走过的步数等等。这里可以自己自由设计,作为发挥指标,比如搞些已经有几个箱子就位的信息等。
*欢迎界面显示(非必须)
在进入游戏之前,可以显示一个欢迎界面,显示是什么游戏,有开始游戏的提示,这也可以作为发挥指标,由自己自由设计
以上就是在屏幕上我们要做的事,也是最主要的事,完成了这些,剩下的就非常简单了。
控制
在本次题目中,需要一个东西来对游戏中的人物进行上下左右移动控制,在这里给出两种方案,但是方案不做限定,想用其他方案也可以,比如在手机上自己做一个控制界面,然后让手机和单片机进行通信(用蓝牙模块)等等
键盘
最简单的键盘由轻触按键构成,由于新生们刚刚上手电子设计,对一些基本操作还不是很熟悉,所以选择键盘的同学必须自己焊接出一个键盘,比如这种形式:
我随便焊的,所以焊的特别丑,大佬勿喷,你们认真做的话肯定焊的比我好
总之,引出4个轻触按键来控制上下左右四个方向即可,还有你把键盘搞定,很多游戏都不用在搞了,在上面做就行,比如贪吃蛇
摇杆模块
一般使用的摇杆模块如下图所示,某宝上很容易买到:
这个模块的具体使用方法在这里不做详述,留给新生们自己探索,使用这个模块可以让东西看着更有游戏感,而且可以加分
以上就是控制的方案
使用的单片机
使用的单片机没有什么限制,我是在STM32上实现自己的方案的,使用51也可以完成,因为我参考的一些资料都是用51来做的
如果是那种以前根本没有了解过单片机的萌新,建议从51开始学起,不急于一时,学习51会让你对单片机以及单片机如何编程有一定了解,这样的话学习STM32会更加容易理解,但是学习51也没必要深入,看郭天祥老师的书学习其实学到串口通信就差不多可以了,然后就可以试着转STM32了
成品展示
下面就是我自己做的成品,稍微展示一下效果
贪吃蛇
经过上面推箱子的学习,其实贪吃蛇在制作方面就比较简单了,主要还是看你的c语言程序写的咋样,因为OLED,键盘之类的控制已经很熟悉了,下面只给出一些设计思路,其他的不做详述
有条件的同学可以试一下在自己的电脑上用c语言实现一个贪吃蛇,参考一下网上的代码,这样的话就比较好在单片机上写了,你所要考虑的唯一的事就在于如何将你用c语言当中用到的一些东西和你的硬件结合起来,比如OLED
地图与蛇身设计
大家都知道,以前在诺基亚玩过的那种贪吃蛇的地图都是有很多种的,所以在实现游戏之前必须先想好地图如何设计,我采用的是最简单的地图,即那种一个大矩形边框的形式
除了地图之外,还要设计一下蛇身,大家知道,一块常见的OLED屏幕,分辨率只有12864,因此如果你的蛇身设计的是11的,在屏幕上就很难看清,所以用OLED的同学最好将蛇身设计为2*2或者其他的
在本文最上面提供的参考文章中,就是做的这样的效果,大家可以参考一下:
由于我只是将方案验证一下,且我的程序是我以前写的c语言程序移植而来,在这里我就选用最简单的方案了
其他方案
可能有的同学是新手,以前没有接触过单片机,不能熟练的掌握OLED,在这里我就给出一种更加简单的方案:点阵
点阵的使用和数码管类似,方便控制,而且容易分辨,操作简单
如果想使用点阵的同学,可以参考如下视频:
【51单片机】自制贪吃蛇游戏机
单片机驱动点阵屏贪食蛇游戏8051
上面这两位的作品就是用点阵来做的,相对于OLED,这种方案会更加简单,唯一要注意的就是点阵的使用,这玩意使用起来是有坑的,我在讲题的时候会说一下
成品展示
贪吃蛇比推箱子简单很多,在这里对于程序我就不做赘述了,大家学过一点点c语言去参考一下网上的一些代码应该能搞出来,还是那句话,注意与硬件的配合,无论你用的是OLED还是点阵
下面是我自己做的成品,仅供参考,大佬勿喷:
转载:https://blog.csdn.net/zyhdaun/article/details/109086429