zoukankan      html  css  js  c++  java
  • 基于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后,长按任意键可手动退出播放,或者等播放结束自动退出播放,退出播放后返回演奏模式。演奏时,按下按键即可发声,长按长响,短按短响。根据不同音调的频率设置定时器进而控制蜂鸣器,所以音准很好,可以无瑕疵演奏简单音乐。因图片无法体现该部分,故补贴图,详细情况请见源码。

    功能实现:

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

     1 while (1)
     2     {
     3         MenusLcd1602(function);
     4         while (1)
     5         {
     6             keyvalue = KeyScan_Up();
     7             if (keyvalue > 0 && keyvalue < 4)
     8             {
     9                 if (keyvalue == 1) //上翻
    10                 {
    11                     if (function == 0)
    12                         function = 2;
    13                     else
    14                         --function;
    15                 }
    16                 else if (keyvalue == 3) //下翻
    17                 {
    18                     if (function == 2)
    19                         function = 0;
    20                     else
    21                         ++function;
    22                 }
    23                 else //确认
    24                 {
    25                     switch (function)
    26                     {
    27                         case 0 : Snakes_Subsonic(); break;
    28                         case 1 : Falling_Diamonds(); break;
    29                         case 2 : Electronic_Organ(); break;
    30                     }
    31                 }
    32                 break;
    33             }
    34         }
    35     }

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

    反思总结:

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

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

  • 相关阅读:
    stanford nlp 3.8.0 parser输出的问题
    stanford nlp 3.8.0 parse中通过java程序获取root节点
    spring boot 项目中hanlp的配置(可增加自定义词典)
    springmvc jsonp 跨域调用的例子
    滚动字幕Marquee
    table-列组
    限时抢购-倒计时
    canvas基础绘制-绚丽时钟
    canvas基础绘制-绚丽倒计时
    JS进阶-闭包的几种常见形式
  • 原文地址:https://www.cnblogs.com/yxsrt/p/9650987.html
Copyright © 2011-2022 走看看