用51单片机做贪吃蛇游戏掌机
游戏掌机是一种很普及的娱乐工具,价格低廉、携带方便、趣味性强是其闪光点。有很多创客尝试做游戏掌机,有的用Arduino去模拟电视信号进行游戏界面的显示,有的通过对树莓派进行修改而模拟FC。它们的效果,身为中学生的我看着觉得很爽,但是受能力所限,无法实现。所以我就打算用这几年的编程经验和手头上已有的硬件来个“老物新玩”,用自己琢磨出的算法实现程序编写,做一台贪吃蛇游戏掌机。
我将介绍我对于框架式游戏编程的思考与实现方案,同时也想展现一下独立探索与创造的精神。
贪吃蛇游戏的优点在于硬件要求极低,没有华丽的动画,编程难度较低,制作周期也短,游戏容易上手而且有趣。所以,我的游戏掌机就先选择运行贪吃蛇游戏。
硬件使用了40脚51单片机、8×8LED点阵屏、6个微动开关(见图1),我先用面包板和杜邦线验证了电路(见图2),然后用洞洞板焊接了电路(见图3)。为了便携,可以带上一块锂电池与充电控制板。为了以后便于扩展支持其他游戏,还可以添加蜂鸣器电路,这里可以简单地用三极管进行驱动。引出下载用的接口,最后用胶带缠上固定。成品如图4所示。
图1?6个微动开关的布局、用途与连接的接口
图2?用面包板和杜邦线搭建的实验电路
图3?制作过程
图4?成品
现在我来讲讲最有趣,也最有技术含量的代码部分,主要是我对贪吃蛇显示画面的一种处理算法,它也可用于其他游戏,可能有很多不足,但是简单易懂,大家可以根据自己的想法去编写自己的代码。
由于我是在计算机上编程,用控制台写小游戏,输出字符是“打印”的原理,所以显示画面没必要时刻刷新屏幕(可以减少资源浪费)。而且我们可以利用这一显示特性进行“静态显示”,从而消除屏幕闪烁问题。所谓“静态显示”就是每次显示时,调整光标到初始位置,进行覆盖式输出,这样就抵消了消除屏幕的操作,速度更快而且没有闪烁。这种方法同样还适合有显示残留的外接屏幕。图5、图6所示是我在课余时间用C++编写的控制台小游戏范例。下面给出我的贪吃蛇游戏源码,它适用于Windows下的G++/GCC编译器。
图5控制台游戏:打飞机图6控制台游戏:
做了这么多尝试,现在来完成我们手头的项目。我在这个项目里用的方法可能适用面并不广,对于部分游戏需要略作调整。考虑到单线程编程要做到“多线程”的效果,我采用了一种“时间线”方法,即编程之初已经设定好一个计算周期,在一个周期结束后,进行条件判断,计算好下一步的状态,最后刷新显示数组。
显示数组(其数据结构为二维数组)的功能是缓存屏幕显示状态,屏幕需要输出时,按照显示数组逐位或逐行点亮屏幕。由于这里用的是单色屏,所以只要元素的值不是0,屏幕的对应位置就会点亮,如图7所示。
图7显示数组与屏幕显示对应关系示意图
在一个时间周期内,不需要进行计算,只用来输出(刷新屏幕)就可以了。这里一个周期可以调用系统时钟函数,或者自己另行编写一个累加器,累加达到一定值清零即可。这样就可以简单、快速地实现游戏的效果。同样,这种方案也可用于其他大多数游戏。
在贪吃蛇游戏的逻辑设计上,我定义了蛇头和蛇尾。蛇头相当于一个“画笔”;蛇尾相当于一个“笔擦”,用于擦除蛇头走过的轨迹,即形成蛇身效果。蛇头所经过的地方,就在数组对应位置上留下此时蛇头的朝向,可以用1、2、3、4表示。当蛇尾到达这个位置时,就知道了下一步应该向哪个方向继续擦除。如果蛇头踩在了“果实”上,比如“果实”用数字6表示,那么将此格改为蛇头方向,并延滞蛇尾一步,就加长了蛇身的长度。
在编写程序之前,先简单画出流程图,可以保证思路清晰,也可以提高程序编写速度并降低错误率,做到“thinktwice,codeonce”。
希望我的这个思路能被大家所采纳、分析和点评,同样还请各位读者能够分享一些更好的方案。
预览时标签不可点收录于合集#个上一篇下一篇