社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 5493|回复: 33

[原创] RAW-OS上的小游戏---你玩过Flappy Bird的三种模式吗

[复制链接]

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-8-23 13:05:47 | 显示全部楼层 |阅读模式
本帖最后由 洗澡哥 于 2014-8-25 01:45 编辑

RAW-OS上的小游戏---你玩过Flappy Bird的三种模式吗
参与HELPER2416开发板助学计划
   首先感谢BOSS,给了大家一个这么好的学习机会。
   近期学习了国产实时操作系统RAW-OS,第一次接触RTOS,看了txj大神写的《高效实时操作系统设计》,感觉很不错,对于我这样的新手算是脑补了一下。很多RTOS的东西只是有了大概的印象,具体的留到以后实践中去检验学习。个人感觉国产RTOS前景广阔,这也是为什么作为一个新手我会选择学习RAW-OS的原因。RAW-OS源码可从RAW-OS官网下载。
   第一次的实验,参考了这个贴子:HELPER2416学习笔记7——RAW-OS之任务创建、调度、挂起及恢复。计划将LED灯亮和LED灯灭两个任务改成LED亮和按键检测,当检测到按键按下时,LED才亮。结果在按键检测中犯了一个错误,没用while(1)循环,结果按键检测一次就退出了,始终达不到想要的效果。错误程序如下:
  1. void KEY_task(void *arg)
  2. {
  3.      if((GPFDAT_REG)%2)
  4.                 GPBDAT_REG = 0x00000002;
  5.      else
  6.      {
  7.                  raw_task_resume(&LED_ON_OBJ);
  8.       }
  9. }
复制代码
正确程序:
  1. void KEY_task(void *arg)
  2. {
  3.         while(1)
  4.         {
  5.                 if((GPFDAT_REG)%2)
  6.                         GPBDAT_REG = 0x00000002;
  7.                 else
  8.                 {
  9.                         raw_task_resume(&LED_ON_OBJ);
  10.                 }
  11.         }
  12. }
复制代码
       通过这次试验,让我认识到了,RTOS的任务间关系。LED亮起任务在等待按键检测到按下后,才能恢复运行。可是按键检测任务只执行了一次就结束了(因为没使用while(1)循环)因此来不及检测按键按下,也就没办法恢复LED亮的任务了。加上了while(1)循环后,程序就能达到,按下按键亮LED的效果了。
      附上工程文件。按键是SW1。LED是屏幕下面那个。


      第二次实验就是这个Flappy Bird小游戏了。创建了三个任务,按键检测,触摸屏检测,屏幕显示。
     按键检测内容如下:
  1. void KEY_task(void *arg)        //按键检测
  2. {
  3.         while(1)
  4.         {
  5.                 if(key)
  6.                         raw_sleep(10);
  7.                 else if(!((GPFDAT_REG)%2))
  8.                 {
  9.                         num=0;
  10.                         y=100;
  11.                         
  12.                         X[0]=480;X[1]=600;X[2]=720;X[3]=840;
  13.                         
  14.                         GUI_SetBkColor(GUI_BLUE);                //蓝色背景
  15.                         GUI_MEMDEV_Select(hMem);                //选择存储设备
  16.                         GUI_ClearRect(0,0,480,272);                //清屏
  17.                         GUI_MEMDEV_CopyToLCD(hMem);        //存储设备显示
  18.                         
  19.                         key=1;
  20.                 }
  21.                 else
  22.                         raw_sleep(1);
  23.         }
  24. }
复制代码
      这个按键检测的堆栈空间大小stack_size和上一个程序设置的一样64,结果每次按键按下后,程序就死机了。
运行仿真,发现每次程序都是停在RAW_ASSERT(0);附程序如下:
  1. void raw_stack_check(void)
  2. {
  3.         PORT_STACK *task_stack_start;

  4.         task_stack_start = raw_task_active->task_stack_base;

  5.         /*statck check method 1*/
  6.         if (*task_stack_start) {

  7.                 RAW_ASSERT(0);
  8.         }

  9.         /*statck check method 2*/
  10.         if ((PORT_STACK *)(raw_task_active->task_stack) < task_stack_start) {

  11.                 RAW_ASSERT(0);
  12.         }

  13. }
复制代码
      一看估计程序是挂在是堆栈检测上了,难道是堆栈溢出?于是迅速打开《高效实时操作系统设计》,“任务堆栈空间监测机制”,看了如下的话:

      假设任务的栈空间是往下增长的,假设任务函数体内已经栈溢出,在某个时候任务会主动切换到其它任务,或者通过中断触发到更高优先级的任务。这个时候在任务栈空间中已经保存了寄存器的时候,可以做两种判断机制:
      第一种判断任务栈的底部是否是原先的0值,因为创建任务的时候,任务的栈会被全部清0,所以,如果这个时候任务栈的底部这个值不为0的话,上图中的红色底部区域表明栈空间已经不为0,说明栈空间已经溢出。
      第二种判断是,在任务栈中保存了任务所有寄存器的前提下,判断当前任务的栈指针是否已经小于原先任务底部的栈值。在栈空间往下生长的情况下,如果是小于了,说明栈空间已经溢出了。

      推测堆栈可能小了,于是换成128,程序就完美运行了。再也不卡死了。任务的栈溢出,及时的被raw-os的栈溢出机制检查了出来了,不错!
      操作屏幕用的ucgui,一些基本的函数,现学现用。
      附上Flappy Bird小游戏的工程文件和一份ucgui中文手册。工程文件的ucgui文件夹中有英文手册,以英文手册为准。
加上了很多自己的注释,相信很容易理清程序思路。
      由于论坛上传15M的限制,请移步百度网盘下载:
       Flappy Bird小游戏工程文件:
链接:http://pan.baidu.com/s/1bnjbybH 密码:2im8
     最后附上游戏视频,优酷实在是蛋疼,我横屏录制的视频,在电脑上也是横屏的,传到优酷上就变成竖屏了。用视频播放器把视频逆时针旋转90°,传到优酷上结果逆时针旋转了180°,蛋疼,总之传上去的视频总是竖屏的。。。。。
     程序开始运行,蓝屏;然后按下按键“SW1”开始游戏,碰到柱子后会有一句话送给玩家。再次按下按键“SW1”重新开始游戏。
     鄙人最高玩到21,求超越。视频中3分11秒,刚好玩到21,呵呵。





    昨天发帖后,论坛一个网友回复,说能不能写个外挂,通过程序的算法,然后实现自动的移动。于是第三次试验就开始了。
   经过努力,在普通模式的基础上,增加了两种模式:作弊模式(外挂模式)和无尽模式。游戏运行过程中,随时可切换模式:SW2普通模式;SW3作弊模式;SW4无尽模式。

   如下图,标注了各点坐标,屏幕上一共四根柱子在循环移动,a作为它们的标识,a=0,1,2,3。

QQ图片20140825004653.jpg
     
   各变量定义如下:


  1. #define high 75                //安全区域高度

  2. #define width 40        //安全区域宽度
  3. volatile static unsigned int X[ ]={480,600,720,840};                                //X坐标
  4. volatile static unsigned int Y[ ]={20,40,60,80,100,120,140,160,170};//Y坐标
  5. volatile static char a;                //四个柱子循环显示
  6. volatile static char b[4];        //四个柱子随机高度
  7. volatile static char delay;        //触摸屏扫描延时
  8. volatile static unsigned int num;         //通过数字
  9. volatile static char key;                         //key=1运行游戏,key=0停止。按键sw1按下则使key=1
  10. volatile static char Key_Flag=1;        //撞到柱子的标志位
  11. volatile static unsigned int y;                //bird高度
  12. volatile static unsigned int Dead_High; //撞柱的柱子高度(Y坐标)
  13. volatile static unsigned int Length=5;        //Bird(小方块)的边长
  14. volatile static char Button_Key;                 //按钮值:1,普通模式;2,作弊模式;3,无尽模式。
  15. volatile static unsigned char Between_Where;        //作弊模式用到的,用来分析下一根柱子的高度

复制代码
  刷新四个移动的柱子,更新通过的柱子数:
  1.         GUI_SetColor(GUI_GREEN);//颜色设置
  2.         for(a=0;a<4;a++)        //画柱子
  3.         {
  4.                 GUI_ClearRect(X[a]-1,0,             X[a],Y[ b[a] ]);
  5.                 GUI_ClearRect(X[a]-1,Y[ b[a] ]+high,X[a],271 );

  6.                 GUI_FillRect(X[a]-1-width,0,             X[a]-1,Y[ b[a] ]);
  7.                 GUI_FillRect(X[a]-1-width,Y[ b[a] ]+high,X[a]-1,271 );

  8.                 if(X[a]-1-width == 144)
  9.                         num++;
  10.                
  11.                 if(X[a]<=0)        
  12.                 {
  13.                         X[a]=480;        //更新下一根柱子
  14.                         b[a]=rand()%8;
  15.                 }
  16.                 else
  17.                         X[a]-=1;
  18.         }
复制代码


    作弊模式(外挂模式)如何实现的呢:其实是检测出接下来到的的那一根柱子可通过的最低高度 Y[ b[Between_Where] ] + high - Length,Between_Where是下一根即将到来的柱子对应的a值。在Bird(小方块)即将降到这个最低高度时,用程序模拟一次触屏按下即可。关键是检测Between_Where的大小。
   检测及执行代码:



  1. <p>for(a=0;a<4;a++)//作弊模式
  2. {
  3.       if( X[a] > 150 && X[a] < width+80+150 )
  4.            Between_Where = a;
  5. }

  6. if(!delay) //触屏是否按下,扫描。delay的作用是让bird上升的过程更加平滑以及触屏消抖
  7. {
  8.      if(y<=271-Length-2) //不断增加Bird高度,位置下移
  9.          y+=2;
  10.      else
  11.          y=271-Length;
  12.   
  13.     if(GUI_TOUCH_GetState(pState)) //触屏被按下
  14.         delay=3;
  15.     if(Button_Key==2 && y > Y[ b[Between_Where] ] + high - Length - 3) //作弊模式代码,当位置较低时触发Bird向上运动
  16.         delay=3;
  17. }
  18. else
  19. {
  20.    if(y>=17)
  21.       y-=17;
  22.    else
  23.      y=0;
  24.    delay--;
  25. }
复制代码

   无尽模式,就是每次碰到柱子后,bird的体积变大一次,当碰柱子的次数实在太多时,便只能重新开始游戏了。这告诉我们小的错误累计多了也是致命的。 建议大家可以这么玩(录完视频突然想到的),先用无尽模式,让bird变的比较大的时候,然后切换到作弊模式(外挂模式),让它自己通关,这样一对比,就看出程序控制和人操作的差距了。   
   优酷不失所望,仍然把我横屏录的视频竖起来了:


   附上工程文件,带详细注释,欢迎大家来交流,或者有什么好的创意也可以分享一下,看能否加进这个游戏中:
链接: http://pan.baidu.com/s/1bnjb0kf 密码: kyrp
   通过三次实验,感觉在学习rtos这条路上还有很长的路要走,要在不断的犯错中学习。虽然是个小游戏吧,但是程序猿玩着自己写的游戏,跟玩别人写的游戏,感觉总是不一样的吧。



论坛ID:洗澡哥
提交时间:2014.08.23


按键—LED.rar

478.43 KB, 下载次数: 6

uCGUI中文手册.rar

4.27 MB, 下载次数: 12

评分

1

查看全部评分


回复

使用道具 举报

298

TA的帖子

4

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2014-8-23 18:28:44 | 显示全部楼层
楼主厉害!

点评

哪里那里,你写的很多帖子看起来很棒,等学linux的时候必须要好好看一下  详情 回复 发表于 2014-8-24 10:18

回复

使用道具 举报

584

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-8-23 20:21:05 | 显示全部楼层
非常帅!!!

点评

感谢BOSS搞了这个活动,让我学到不少东西  详情 回复 发表于 2014-8-24 10:19
My dreams will go on...
http://www.jyxtec.com

回复

使用道具 举报

20

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-8-23 23:02:18 | 显示全部楼层
赞一个

回复

使用道具 举报

130

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2014-8-23 23:15:00 | 显示全部楼层
要不楼主组织大家中这个游戏的外挂把,就是通过程序的算法,然后实现自动的移动到1024.不知道有没有什么难度,希望论坛的算法大神出来带队!

点评

外挂有了哦,嘿嘿  详情 回复 发表于 2014-8-24 22:20
这个创意不错啊,等下午有时间,我试一下,嘿嘿。  详情 回复 发表于 2014-8-24 10:20

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 10:18:12 | 显示全部楼层

哪里那里,你写的很多帖子看起来很棒,等学linux的时候必须要好好看一下

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 10:19:41 | 显示全部楼层

感谢BOSS搞了这个活动,让我学到不少东西

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 10:20:42 | 显示全部楼层
散吧散吧 发表于 2014-8-23 23:15
要不楼主组织大家中这个游戏的外挂把,就是通过程序的算法,然后实现自动的移动到1024.不知道有没有什么难 ...

这个创意不错啊,等下午有时间,我试一下,嘿嘿。

回复

使用道具 举报

567

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

荣誉会员勋章

发表于 2014-8-24 13:01:57 | 显示全部楼层
这个不顶也不行呀,严重支持作者继续多创新!

点评

今天在简版游戏的基础上,加入了“作弊模式”和“无尽模式”,视频正在上传中,嘿嘿  详情 回复 发表于 2014-8-24 22:17

回复

使用道具 举报

567

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

荣誉会员勋章

发表于 2014-8-24 13:04:35 | 显示全部楼层
保险一点的话,任务的栈空间可以继续增加,因为printf 这种耗栈很厉害

点评

好的,谢谢提醒  详情 回复 发表于 2014-8-24 22:17

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 22:17:16 | 显示全部楼层
jorya_txj 发表于 2014-8-24 13:01
这个不顶也不行呀,严重支持作者继续多创新!

今天在简版游戏的基础上,加入了“作弊模式”和“无尽模式”,视频正在上传中,嘿嘿

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 22:17:46 | 显示全部楼层
jorya_txj 发表于 2014-8-24 13:04
保险一点的话,任务的栈空间可以继续增加,因为printf 这种耗栈很厉害

好的,谢谢提醒

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 22:20:05 | 显示全部楼层
散吧散吧 发表于 2014-8-23 23:15
要不楼主组织大家中这个游戏的外挂把,就是通过程序的算法,然后实现自动的移动到1024.不知道有没有什么难 ...

外挂有了哦,嘿嘿

点评

外挂代码放上来哦!  详情 回复 发表于 2014-8-24 22:50

回复

使用道具 举报

3359

TA的帖子

422

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2014-8-24 22:50:18 | 显示全部楼层
太给力了!

点评

你的签名档好屌啊,火箭板生产全过程,呵呵  详情 回复 发表于 2014-8-24 23:05

回复

使用道具 举报

584

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-8-24 22:50:55 | 显示全部楼层
洗澡哥 发表于 2014-8-24 22:20
外挂有了哦,嘿嘿

外挂代码放上来哦!

点评

必须放,整个工程都会放上来,为的就是交流学习嘛正在整理中,加点注释~  详情 回复 发表于 2014-8-24 23:07
My dreams will go on...
http://www.jyxtec.com

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 23:05:49 | 显示全部楼层

RAW-OS上的游戏----你玩过Flappy Bird的三种模式吗


你的签名档好屌啊,火箭板生产全过程,呵呵



回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-24 23:07:10 | 显示全部楼层
spacexplorer 发表于 2014-8-24 22:50
外挂代码放上来哦!

必须放,整个工程都会放上来,为的就是交流学习嘛正在整理中,加点注释~

回复

使用道具 举报

17

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-8-25 20:43:01 | 显示全部楼层
谢谢分享,很不错!!!

点评

你也在学RAW-OS吗,一起学习吧  详情 回复 发表于 2014-8-25 23:19

回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2014-8-25 23:19:13 | 显示全部楼层
liuyongliuyong 发表于 2014-8-25 20:43
谢谢分享,很不错!!!

你也在学RAW-OS吗,一起学习吧

回复

使用道具 举报

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-8-26 06:24:24 | 显示全部楼层
谢谢分享

点评

共同学习  详情 回复 发表于 2014-8-26 21:15
http://shop34182318.taobao.com/

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-22 01:58 , Processed in 0.579041 second(s), 18 queries , Redis On.

快速回复 返回顶部 返回列表