基于STC89C516的多游戏实现
所用器件: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的多游戏实现的更多相关文章
- Pomelo:网易开源基于 Node.js 的游戏服务端框架
Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese
- 基于HTML5的SLG游戏开发(序)
2012年前后,HTML5游戏凭借跨平台.易移植.部署简单.节省成本等优点被炒的火热,经过一两年的快速发展,市场出现了一些成功地HTML5游戏产品,像磊友的<修仙三国>,神奇时 ...
- [置顶] 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...
- 转: Orz是一个基于Ogre思想的游戏开发架构
Orz是一个基于Ogre思想的游戏开发架构,好的结构可以带来更多的功能.Orz和其他的商业以及非商业游戏开发架构不同.Orz更专著于开发者的感受,简化开发者工作.Orz可以用于集成其他Ogre3D之外 ...
- 基于jQuery经典扫雷游戏源码
分享一款基于jQuery经典扫雷游戏源码.这是一款网页版扫雷小游戏特效代码下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <center> <h1>j ...
- Android研究之为基于 x86 的 Android* 游戏选择合适的引擎具体解释
摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90% ...
- 基于第二次数独游戏,添加GUI界面
高级软件工程第三次作业:基于第二次数独游戏,添加GUI界面.GUI界面代码如下: package firstGui; import java.awt.*; import java.awt.event. ...
- 基于java的雷电游戏
基于java的雷电游戏基本功能包括:敌方飞机随机飞行.我方飞机手动控制飞行,射击比拼,游戏闯关等.本系统结构如下: (1)雷电游戏状态调整功能: 在游戏启动时,游戏会自动进行初始化的验证. 若初始化成 ...
- 基于cocos2d-x的Android游戏中使用fmod音频引擎
cocos2d-x的音频引擎是cocosDenshion, 它的Android版比较弱, 只能播放一个背景音乐和些许音效, 如果要实现稍微复杂一点的音频播放, 比如同时播放几个音轨就不能了. 这一点远 ...
随机推荐
- UVA 11584 入门DP
一开始把它当成暴力来做了,即,从终点开始,枚举其最长的回文串,一旦是最长的,马上就ans++,再计算另外的部分...结果WA了 事实证明就是一个简单DP,算出两个两个点组成的线段是否为回文,再用LCS ...
- idea 2018.3.4 破解
我的idea_home=C:\Program Files\\IntelliJ IDEA 2018.3.4\ 1.下载破解文件 链接:https://pan.baidu.com/s/1I2APmk-pj ...
- java笔记-手写
- openlayers基础用例
http://weilin.me/ol3-primer/ch03/03-01.html#http://weilin.me/ol3-primer/ //地址http://openlayers.org/ ...
- 导入的Java Web项目提示找不到javax.servlet.http.*包
在网上下载了个Java web项目,导入到eclipse发现以下错误 解决办法: 1.右击项目,进入Configure Build Path 2.在Libraries标签下点击Add Library. ...
- DOCKER 学习笔记6 WINDOWS版尝鲜
前言 经过前两节的学习,我们已经可以在Dokcer 环境下部署基本的主流环境有: Springboot 后端 MYSQL 持久化数据 以及Nginx 作为反向代理 虽说服务器上面的也没啥不好,但是毕竟 ...
- AES学习小结
AES是基于数据块的加密方式,即每次处理的数据是一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度. AES支持五种模式:CBC,C ...
- L0,L1,L2正则化浅析
在机器学习的概念中,我们经常听到L0,L1,L2正则化,本文对这几种正则化做简单总结. 1.概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数 ...
- PAT Vocabulary
数字 单词 词性 中文意 常用 音标 non-negative 非负数 non-negative number Positive 正整数 Positive integer Negative 负数 Ne ...
- Python筛法求素数
l=[2]m,n=input().split()m=int(m)n=int(n) for i in range(m,n): flag=True for j in l: if i%j==0:#如果当前值 ...