所用器件: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. SpringCloud----服务注册中心Eureka

    Eureka是Netflix开源的一个RESTful服务,主要用于服务的注册发现.Eureka由两个组件组成:Eureka服务器和Eureka客户端.Eureka服务器用作服务注册服务器.Eureka ...

  2. UML-GRASP后4种模式

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

  3. 201771010123汪慧和《面向对象程序设计Java》第十周实验总结

    一.理论部分 1.泛型:也称参数化类型.就是定义类.接口和方法时,通过类型参数指示将要处理的对象类型. 2.泛型程序设计:编写代码可以被很多不同类型的对象所重用. 3.泛型方法: a.除了泛型类外,还 ...

  4. UIWindow statusBar消失

    1.新建UIWindow 程序崩溃 报无根控制器错误 Xcode7环境下,新建UIWindow需添加rootViewController 2.新建UIWindow后 statusBar消失 Info. ...

  5. 【leetcode困难】968. 监控二叉树

    968. 监控二叉树 瞎**分析评论区Rui大佬的答案,这题想直接递归return min还是有坑的,分计数和状态.有个状态转换的思想

  6. Spring DATA Neo4J(一)

    Spring DATA Neo4J——简介 Spring Framework提供了一下模块来处理基于Java的应用程序的DAO层 Spring JDBC Spring ORM Spring DATA ...

  7. Bug(1)

    程序要求:内网之间客户端截屏(.bmp)并传送给服务端. server: #include <winsock2.h> // 为了使用Winsock API函数 #include <s ...

  8. RAC,ReactiveSwift

    1.创建信号 // 1.通过信号发生器创建(冷信号) let producer = SignalProducer<String, NoError>.init { (observer, _) ...

  9. python thrift demo

    简介Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Hask ...

  10. 产品对话 | 愿云原生不再只有Kubernete

    从2013年,云原生(Cloud Native)的概念由 Pivotal 的 MattStine 首次提出,到现在,其技术细节不断得到社区的完善.云原生逐渐演变出包括 DevOps.持续交付.微服务. ...