查看: 4136|回复: 4

[原创] 新唐使用笔记 - M051 小游戏 (数字防御)

[复制链接]
  • TA的每日心情
    开心
    2021-12-10 15:56
  • 签到天数: 2675 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-4-13 11:57:38 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 slotg 于 2015-4-13 11:59 编辑

    上个星期用 NuTiny-SDK-M051 开发板外接 MAX7219 显示模块做了一个计时器的项目,编程的过程当中让我想起多年前在一个计算器上面看过的小游戏,这个小游戏已经忘了叫什么名字,我们姑且就叫做 - 数字防御。

    游戏的玩法如下:计算器上有12位数的液晶显示屏,最左边的位数为玩家可操作的"防守数字",按计算器上的切换键可以让这个防守数字从0至9循环变化,另一端从显示屏的最右边开始每隔一段时间会随机出现一个数字为敌方的"攻击数字",该数字会接续的往左边串成数字串,当攻击数字串往左碰到了玩家所控制的防守数字时游戏即告结束,而玩家防守的方法就是不断的切换防守数字,当防守数字与攻击数字串内的数字相同时可按下消除键,攻击数字串内相同的数字即被消除,为了增加游戏的挑战性,随着游戏的进行攻击数字的出现速度会逐步的加快。
    P01.JPG

    由于我们所使用的 MAX7219 显示模块只有8位数,因此游戏的攻击数字串最多就只能够做到7位数,游戏按键的安排如下:

    切换键,安排在 P3.2 管脚。
    消除键,安排在 P3.3 管脚。

    按键的按下侦测是程序中一个重要的功能,很多的例程都是将按键的侦测放在主回圈里面,由于主回圈里面还有其他的功能需要实现,因此当按键按住不放的时候是否会影响到其他功能的执行是一个需要考虑的问题!解决的方法有很多种,我们所使用的方法是在程序当中开启了 TIMER0 计时中断,每 10ms 中断一次,而按键的按下侦测就放在这个中断回圈里面处理,利用全局变量 u32KEY1 被设定为 TRUE 时表示切换键被按下,全局变量 u32KEY2 被设定为 TRUE 时表示消除键被按下。
    1. //  TIMER0 interrupt
    2. void TMR0_IRQHandler(void)
    3. {
    4.     static uint32_t u32KeyCnt1=0,u32KeyCnt2=0;

    5.     /* Clear Timer0 time-out interrupt flag */
    6.     TIMER_ClearIntFlag(TIMER0);
    7.    
    8.     u32Timer++;

    9.     /* SELECT key */
    10.     if(!P32)
    11.     {
    12.         if(++u32KeyCnt1 == 3)
    13.         {
    14.             u32KEY1 = TRUE;
    15.         }
    16.     }
    17.     else
    18.     {
    19.         u32KeyCnt1 = 0;
    20.     }
    21.    
    22.     /* CLEAR key */
    23.     if(!P33)
    24.     {
    25.         if(++u32KeyCnt2 == 3)
    26.         {
    27.             u32KEY2 = TRUE;
    28.         }
    29.     }
    30.     else
    31.     {
    32.         u32KeyCnt2 = 0;
    33.     }
    34. }
    复制代码
    攻击数字出现的周期一开始是1.5秒,随着游戏的进行每消除1个数字时 u32Score 得分加1,累积消除10个数字时速度就会加快0.1秒,而加速到最快的周期是0.7秒。
    1.         u32Duty = 150;      /* 1.5 sec */
    复制代码
    消除1个数字时:
    1.         u32Score++;
    2.         if(u32Score%10 == 0)
    3.         {
    4.             if(u32Duty > 70)            /* fast speed */
    5.             {
    6.                 u32Duty -= 10;          /* 0.1s */
    7.             }
    8.         }
    复制代码
    攻击数字的产生是呼叫 GenNumber() 函数返回一个 0至9 的随机数。
    1. /* Generate Number */
    2. uint32_t GenNumber(void)
    3. {
    4.     return rand()%10;
    5. }
    复制代码
    程序在运行之后先显示得分数,按下消除键后游戏开始,当攻击数字串往左碰到了防守数字时游戏结束,显示游戏得分并且闪烁3下。

    视频演示:
    http://v.youku.com/v_show/id_XOTMyNzY2ODMy.html


    工程文件,使用 KEIL 4.72 与 M051_Series_BSP_CMSIS_Rev3.00.002 库
    D005.rar (1.26 MB, 下载次数: 15)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-30 19:48
  • 签到天数: 981 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-4-13 12:45:32 | 显示全部楼层
    谢谢分享!!!!!!!!!!!!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-10-17 12:07
  • 签到天数: 306 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-4-13 13:10:47 | 显示全部楼层
    有点厉害。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-19 11:07
  • 签到天数: 226 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2015-4-25 08:08:14 | 显示全部楼层
    谢谢共享资料,学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-8-17 15:49
  • 签到天数: 46 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-5-19 11:51:50 | 显示全部楼层
    不错,谢谢分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 21:28 , Processed in 0.146396 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.