2020年科协招新须要出训练题,让新生了解一下单片机,因此我这边打算出一道游戏机的题,让新生用单片机实现一个游戏机,共3个游戏可选,分别为:贪吃蛇,打地鼠和推箱子,因为是针对于0基础新生,因此在指标上不作过多要求,只要实现出效果就行。
我负责的是贪吃蛇和推箱子
编程
参考博客
(单片机原理与应用)大液晶屏的游戏设计(推箱子)
基于stm3二、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
ide
推箱子
推箱子顾名思义就是控制游戏里的人将全部箱子所有推到指定位置就算通关,这个游戏在之前的手机上都挺常见的。本次题目主要是要求新生本身找到一些推箱子的地图,并将地图里的要素显示在选择的屏幕上,而后经过按键/摇杆来控制游戏里的人移动,并完成关卡,关卡数作的越多,给分越高,5个封顶。性能
基本设计思路
OLED屏幕
用单片机制做游戏机最大的难点就在于屏幕,你要经过单片机来控制题目显示地图中的种种要素,好比推箱子的箱子,墙壁,人物等,所以根据本身想要实现游戏先对屏幕进行选型,而后熟悉本身的屏幕是很是重要的
在我本身实现方案的时候,我选择的是经常使用的OLED屏幕,OLED屏幕对于显示一些简单信息是很是方便的,建议必定要学会如何使用,不少时候一些设计用OLED屏幕就足够了。
学习
OLED控制
在某宝上买到的OLED通常是SSD1306,通讯方式通常是SPI或IIC,哪种均可以,我用IO口模拟IIC和SPI的时候,SPI的速度会更快些,还有并口的控制方式,这个就是通讯相对方便,但占用的IO口较少。若是想玩更高级的话,能够去买正点原子的OLED屏幕,那个虽然贵了点,可是性能更好,还有多种控制方式。
关于单片机如何控制OLED,在这里不作详述,网上的资料很是齐全,讲的也很清楚,主要的流程以下,跟着这个思路去一步步实现就行:
spa
地图尺寸设计
常见的OLED屏幕的分辨率是128*64,分辨率就能够理解为一个个点,每一个点都是一个小LED,对这个小LED写1,他就点亮了,写0就熄灭了,对这些一个个点进行设计就能够实现显示字符,汉字等经常使用的信息。熟悉OLED控制的人就会知道OLED是一次写8个点(一列),因此地图的要素设计为8的倍数会比较方便操做,所以屏幕显示的设计以下:
下面是实际在OLED上显示的画面(以第一关为例):
.net
其中地图中的要素能够本身去绘制8*8的像素图案,也能够直接使用我在参考连接中这位做者给出的方案,我是直接使用的这个图案:
那么如何将这些要素显示在OLED屏幕上呢?最简单的方法就是用电脑的画图软件对图片取模,这个方法在这里也不作详述,在网上搜一下学习一下便可(能够去看原子或杜洋工做室的教程)
通过试验,这几张图片不能直接用画图软件直接保存,因此建议直接在取模软件上画图,反正只是64像素点的图,蛮好画的
如下是我本身画的一些图,仅供参考:
总之,获得这几个点阵的数据就能够在OLED上显示了,这样界面就没有啥问题了
设计
地图显示
因为咱们设计每一个地图要素都是8*8的,在OLED上面显示很是方便,本身参考一下别人的地图或者本身设计地图便可,我贴的参考文章里面的就能够,选几张作一下:
显示在OLED上:
3d
基本信息显示
在屏幕右边咱们要显示一些基本信息,好比如今的关卡数,已经走过的步数等等。这里能够本身自由设计,做为发挥指标,好比搞些已经有几个箱子就位的信息等。视频
*欢迎界面显示(非必须)
在进入游戏以前,能够显示一个欢迎界面,显示是什么游戏,有开始游戏的提示,这也能够做为发挥指标,由本身自由设计blog
以上就是在屏幕上咱们要作的事,也是最主要的事,完成了这些,剩下的就很是简单了。
控制
在本次题目中,须要一个东西来对游戏中的人物进行上下左右移动控制,在这里给出两种方案,可是方案不作限定,想用其余方案也能够,好比在手机上本身作一个控制界面,而后让手机和单片机进行通讯(用蓝牙模块)等等
键盘
最简单的键盘由轻触按键构成,因为新生们刚刚上手电子设计,对一些基本操做还不是很熟悉,因此选择键盘的同窗必须本身焊接出一个键盘,好比这种形式:
我随便焊的,因此焊的特别丑,大佬勿喷,大家认真作的话确定焊的比我好
总之,引出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仍是点阵
下面是我本身作的成品,仅供参考,大佬勿喷: