基于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版比较弱, 只能播放一个背景音乐和些许音效, 如果要实现稍微复杂一点的音频播放, 比如同时播放几个音轨就不能了. 这一点远 ...
随机推荐
- SPOJ 423 Assignments 状态DP
这个题目搁置了这么久,终于搞完了. 给n个人分配n个课程,已经告诉了你n个人对哪几门感兴趣,问最多有多少种分配方式 我刚开始都没找到这怎么还可以状态dp,哪来的状态转移,想用暴力DFS,果断TLE的妥 ...
- 解决 springweb Filter 读取request body miss body
package com.lb.demo.listener; import java.io.BufferedReader; import java.io.ByteArrayInputStream; im ...
- 条款02:尽量以const,enum,inline替换#define
目录 1. 总结 2. 使用const常量或enum替换宏常量 class外部的常量指针 class专属常量 1. 总结 对于单纯常量,最好以const常量或enum替换#define 对于宏代码段, ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- 二、提高期(Upping the Ante)
二.提高期(Upping the Ante) Upping the Ante?这可是第四阶段的词.没办法,Greg Thomson用这个词代表第二阶段,看着喜欢,继续沿用. 经过两三个月的“图象+声音 ...
- 垃圾windows10更新遇到的问题
缘由 1.win10现在必须更新,不更新不给你用,关闭自动更新的方法都失效了,如果有人知道有效的方法还请私信指教一下.. 一个延迟几天的笨方法:当出现更新并关机或更新并重启时,把电源键设置成关机. 就 ...
- node 第三方库总结
app.post("/todo/add", (request, response) => { request.body //如何拿到前端ajax传来的JSON数据 }) 需要 ...
- Java远程调用Linux脚本
参考:http://blog.csdn.net/xiao_jun_0820/article/details/26254813 http://blog.csdn.net/a19881029/artic ...
- 学会用Python操作Mongodb
在linux下,用pip导包. pip install pymongo python操作基本步骤: 导包 建立连接,建立客户端. 获取数据库 获取集合 对数据操作 import pymongo #建立 ...
- 微信小程序生成海报保存图片到相册小测试
test.wxml <canvas style="width:{{imageWidth}}px;height:{{imageHeight}}px;" canvas-id=&q ...