社区导航

 

搜索
查看: 6880|回复: 33

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

[复制链接]

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-8-23 13:05 | 显示全部楼层 |阅读模式
本帖最后由 洗澡哥 于 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. X[0]=480;X[1]=600;X[2]=720;X[3]=840;
  12. GUI_SetBkColor(GUI_BLUE); //蓝色背景
  13. GUI_MEMDEV_Select(hMem); //选择存储设备
  14. GUI_ClearRect(0,0,480,272); //清屏
  15. GUI_MEMDEV_CopyToLCD(hMem); //存储设备显示
  16. key=1;
  17. }
  18. else
  19. raw_sleep(1);
  20. }
  21. }
复制代码
这个按键检测的堆栈空间大小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. if(X[a]<=0)
  11. {
  12. X[a]=480; //更新下一根柱子
  13. b[a]=rand()%8;
  14. }
  15. else
  16. X[a]-=1;
  17. }
复制代码
作弊模式(外挂模式)如何实现的呢:其实是检测出接下来到的的那一根柱子可通过的最低高度 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. if(GUI_TOUCH_GetState(pState)) //触屏被按下
  13. delay=3;
  14. if(Button_Key==2 && y > Y[ b[Between_Where] ] + high - Length - 3) //作弊模式代码,当位置较低时触发Bird向上运动
  15. delay=3;
  16. }
  17. else
  18. {
  19. if(y>=17)
  20. y-=17;
  21. else
  22. y=0;
  23. delay--;
  24. }
复制代码
无尽模式,就是每次碰到柱子后,bird的体积变大一次,当碰柱子的次数实在太多时,便只能重新开始游戏了。这告诉我们小的错误累计多了也是致命的。 建议大家可以这么玩(录完视频突然想到的),先用无尽模式,让bird变的比较大的时候,然后切换到作弊模式(外挂模式),让它自己通关,这样一对比,就看出程序控制和人操作的差距了。 优酷不失所望,仍然把我横屏录的视频竖起来了: 附上工程文件,带详细注释,欢迎大家来交流,或者有什么好的创意也可以分享一下,看能否加进这个游戏中: 链接: http://pan.baidu.com/s/1bnjb0kf 密码: kyrp 通过三次实验,感觉在学习rtos这条路上还有很长的路要走,要在不断的犯错中学习。虽然是个小游戏吧,但是程序猿玩着自己写的游戏,跟玩别人写的游戏,感觉总是不一样的吧。
论坛ID:洗澡哥
提交时间:2014.08.23
来源:EEWorld 嵌入式系统编程板块,转载请附上链接

按键—LED.rar

478.43 KB, 下载次数: 6

uCGUI中文手册.rar

4.27 MB, 下载次数: 12

评分

1

查看全部评分




回复

使用道具 举报

296

TA的帖子

4

TA的资源

纯净的硅(初级)

Rank: 4

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

点评

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


回复

使用道具 举报

594

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

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

点评

感谢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 | 显示全部楼层
赞一个


回复

使用道具 举报

135

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

579

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

荣誉会员勋章

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

点评

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


回复

使用道具 举报

579

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

荣誉会员勋章

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

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

好的,谢谢提醒


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

外挂有了哦,嘿嘿

点评

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


回复

使用道具 举报

3364

TA的帖子

420

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

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

点评

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


回复

使用道具 举报

594

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

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

外挂代码放上来哦!

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


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




回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

18

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

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

点评

共同学习  详情 回复 发表于 2014-8-26 21:15
http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr


回复

使用道具 举报

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

关闭

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

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2019-9-18 14:58 , Processed in 0.542008 second(s), 20 queries , Gzip On, MemCache On.

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