所用器件:STC89C516,矩阵键盘,LCD1602,16*16点阵,74HC595,无源蜂鸣器,晶振为11.0592MHZ

使用说明:

  开机(复位)进入启动界面,1602显示Welcome。500ms后进入菜单界面,1602显示SnakesSubsonic(贪吃蛇)。此时S1按键为上翻,S3按键为下翻,S2按键为确认。共有三种游戏选择,按顺序为SnakesSubsonic、FallingDiamonds(类似于钢琴块)、ElectronicOrgan(电子琴)。上翻下翻可循环选项。

               

  进入贪吃蛇界面后,点阵显示初始化界面,同时1602显示Press any key to continue..

                     

按下任意按键开始游戏。S2按键为上,S10按键为下,S5按键为左,S7按键为右,S6按键为暂停,S16按键为退出。开始游戏后,1602显示分数,点阵显示游戏界面。按下暂停后游戏界面保持,同时1602显示Press any key to continue..等待按键继续游戏。游戏规则和普通贪吃蛇一样,吃到自己或者撞墙就会结束游戏,此时点阵熄灭,1602保持最后的分数,按任意键结束游戏,返回菜单界面。按下退出和自然结束的结果一样。

  

  进入钢琴块界面后,点阵下落方块,1602显示分数。S1-S4对应下落的四列,S6为暂停,S16为退出。暂停和退出的现象和贪吃蛇相同。游戏规则为在钢琴块快下落到底部时按键有效,且越接近底部得分越高,过早按键会结束游戏。按键顺序即消除顺序必须要与下落顺序一致,否则结束游戏。按下S1-S4时,对应的一列最下方会短暂点亮,增加游戏体验,同时消除对应方块。游戏结束和贪吃蛇一样。

  

  进入电子琴界面后,1602显示Let it be,含义为演奏你想要的音乐。S1按键按下后自动播放一段音乐,点阵显示循环动态图。S2-S4对应低音So、La、Si。S5-S11对应中音Do、Re、Mi、Fa、So、La、Si。S12-S15对应高音Do、Re、Mi、Fa。一共可演奏14个音。S16为退出,直接返回菜单。按下S1后,长按任意键可手动退出播放,或者等播放结束自动退出播放,退出播放后返回演奏模式。演奏时,按下按键即可发声,长按长响,短按短响。根据不同音调的频率设置定时器进而控制蜂鸣器,所以音准很好,可以无瑕疵演奏简单音乐。因图片无法体现该部分,故补贴图,详细情况请见源码。

功能实现:

  菜单功能通过外层死循环显示选项并通过内层死循环等待按键。通过变量保存选项。按键按下后切换选项或者调用游戏控制函数。核心代码如下:

 while ()
{
MenusLcd1602(function);
while ()
{
keyvalue = KeyScan_Up();
if (keyvalue > && keyvalue < )
{
if (keyvalue == ) //上翻
{
if (function == )
function = ;
else
--function;
}
else if (keyvalue == ) //下翻
{
if (function == )
function = ;
else
++function;
}
else //确认
{
switch (function)
{
case : Snakes_Subsonic(); break;
case : Falling_Diamonds(); break;
case : Electronic_Organ(); break;
}
}
break;
}
}
}

  不同游戏的实现不同,在此不赘述。值得一提的是,有些C语言版本的贪吃蛇会使用链表保存蛇身,使用递归产生食物,但在51中无法这样。malloc函数可能会在ram中产生内存碎片,产生不正常的结果。在51中基本不会使用递归,需要使用循环代替。钢琴块中,本来使用随机下落的方法,但是这样的体验很差,没有自己写下落方块的体验感好。电子琴的实现比较简单,其中点阵动态图其实是12帧图片的循环播放,而且那12帧图片是我花了整整一下午描点描出来的...

反思总结:

  这次作品的基本功能都已经实现,并采取分文件编写,一个模块一个文件,一个游戏一个文件。提高了我对于单片机的控制能力,以及代码的架构能力。整个作品完成后,我也深深感到所学的不足。比如有许多地方涉及到多任务管理,而我采取的方法是大循环内一次调用不同任务。虽然这种伪多任务基本可以满足需求,但是对于游戏体验来说还是存在影响。并且如果任务继续增加,那么这种伪多任务的方法肯定就会产生问题。所以下一步改进可能会使用RTX51这种实时系统的框架实现作品。

源码链接:https://pan.baidu.com/s/19O0d92iTBRRgMoPU3UIYMw 密码:eu9m

基于STC89C516的多游戏实现的更多相关文章

  1. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  2. 基于HTML5的SLG游戏开发(序)

          2012年前后,HTML5游戏凭借跨平台.易移植.部署简单.节省成本等优点被炒的火热,经过一两年的快速发展,市场出现了一些成功地HTML5游戏产品,像磊友的<修仙三国>,神奇时 ...

  3. [置顶] 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面

    [Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...

  4. 转: Orz是一个基于Ogre思想的游戏开发架构

    Orz是一个基于Ogre思想的游戏开发架构,好的结构可以带来更多的功能.Orz和其他的商业以及非商业游戏开发架构不同.Orz更专著于开发者的感受,简化开发者工作.Orz可以用于集成其他Ogre3D之外 ...

  5. 基于jQuery经典扫雷游戏源码

    分享一款基于jQuery经典扫雷游戏源码.这是一款网页版扫雷小游戏特效代码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <center> <h1>j ...

  6. Android研究之为基于 x86 的 Android* 游戏选择合适的引擎具体解释

     摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90% ...

  7. 基于第二次数独游戏,添加GUI界面

    高级软件工程第三次作业:基于第二次数独游戏,添加GUI界面.GUI界面代码如下: package firstGui; import java.awt.*; import java.awt.event. ...

  8. 基于java的雷电游戏

    基于java的雷电游戏基本功能包括:敌方飞机随机飞行.我方飞机手动控制飞行,射击比拼,游戏闯关等.本系统结构如下: (1)雷电游戏状态调整功能: 在游戏启动时,游戏会自动进行初始化的验证. 若初始化成 ...

  9. 基于cocos2d-x的Android游戏中使用fmod音频引擎

    cocos2d-x的音频引擎是cocosDenshion, 它的Android版比较弱, 只能播放一个背景音乐和些许音效, 如果要实现稍微复杂一点的音频播放, 比如同时播放几个音轨就不能了. 这一点远 ...

随机推荐

  1. Java固定资产管理系统 源码 jsp ssh

    固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括:对固定资产的购进.接触.销毁,对物品的使用状态.借出状态.库存状态等进行标识,对各类物品进行编号,根据编号进行查询,根据名称进行查询 ...

  2. .NET微信开发 配置微信公众号基本配置的几种方法

    自己最近搞了公众号,记录一下. 目的就是为了在微信公众号里启用服务器配置. 微信文档 其实微信文档已经写得很清楚了,也很简单.(微信的目的就是它发送一个get请求,希望我们能接受一下,然后给微信回个数 ...

  3. Python语言基础与应用 (P23)上机练习:容器类型操作(未完待续)

    上机练习:容器类型操作〉 列表.元组基本操作+, *, len(), [], in Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 ...

  4. UML-GRASP后4种模式

    1.多态 1).什么是多态 问题:if-else耦合度过高 解决: 方法1:接口 方法2:超类里需多态的方法前加上{abstract} 2).相关模式 防止异变 大量GoF,如适配器(Adapter) ...

  5. Spring Data JPA简单查询接口方法速查

    下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.(1)先按照功能进行分类 ...

  6. C语言-数组的深入学习

    深入学习一下数组1.从内存角度来讲:数组变量就是一次分配多个变量,而且这些变量的地址是连续的,也就是存放这些变量的存储单元是依次相连接的.而且这多个变量必须单独访问,不可以一起访问的.因为他们的地址彼 ...

  7. CSS3-选中的锚链接改变指定样式

    1.css样式 主角就是:target <a> 标签的 target 属性规定在何处打开链接文档,连接文档也可以是一个样式. 如果在一个 <a> 标签内包含一个 target ...

  8. 图论中TSP问题的LINGO求解与应用

    巡回旅行商问题(Traveling Salesman Problem,TSP),也称为货郎担问题.该问题可简单描述为走遍n个城市的最短路.几十年来,出现了很多近似优化算法.如近邻法.贪心算法.最近插入 ...

  9. 记一次Java面试问题点总结

    引言 昨日接了一个阿里外包的电话面试,问了一些技术问题感觉到自己是真的菜,接触Java开发已经也有一段时间,技术方面说来惭愧,一直以来只是局限于框架工具的用法,也没有进行了解其实现的原理,更重要的是一 ...

  10. Tensorflow函数——tf.set_random_seed(seed)

    设置图级随机seed. 依赖于随机seed的操作实际上从两个seed中获取:图级和操作级seed. 这将设置图级别的seed. 其与操作级seed的相互作用如下: 1.如果没有设置图形级别和操作see ...