当前位置:文档之家› 基于ucos的贪吃蛇游戏设计

基于ucos的贪吃蛇游戏设计

OS_STK Main_Stack[STACKSIZE]={0, }; //Main_Test_Task 堆栈 void Main_Task(void *Id); //Main_Test_Task #define Main_Task_Prio 8 OS_STK Key_Stack[STACKSIZE]={0, }; //test_Test_Task 堆栈 void Key_Task(void *Id); //test_Test_Task #define test_Task_Prio 6
3
int key; key=KeyBoard_Read(0,FALSE); if(key==LEFT||key==RIGHT||key==UP||key==DOWN) { //Snake.direction=key; OSMboxPost(keybox,&key); } OSTimeDly(10); } } void addNode(int x,int y) { INT8U *key1,err; key1=OSMboxPend(keybox,0,&err); Snake.direction =*key1; switch(Snake.direction) { case LEFT: Snake.x[0]=Snake.x[0]-NODE_SIZE*2;break; case RIGHT:Snake.x[0]=Snake.x[0]+NODE_SIZE*2;break; case UP:Snake.y[0]=Snake.y[0]-NODE_SIZE*2;break; case DOWN:Snake.y[0]=Snake.y[0]+NODE_SIZE*2;break; } drawNode(CURRENT_COLOR, Snake.x[0], Snake.y[0]); }
***********************附录 main.c 代码**************************
#include"../ucos-ii/includes.h" /* uC/OS interface */ #include "../ucos-ii/add/osaddition.h" #include "../inc/drivers.h" #include "../inc/sys/lib.h" #include "../src/gui/gui.h"////////绘图 gui #include <string.h> #include <stdio.h> //#include <Ustring.h> #pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting ///******************任务定义***************/// OS_STK Main_Stack[STACKSIZE]={0, }; //Main_Test_Task 堆栈 void Main_Task(void *Id); //Main_Test_Task #define Main_Task_Prio 12 OS_STK Key_Stack[STACKSIZE]={0, }; //test_Test_Task 堆栈 void Key_Task(void *Id); //test_Test_Task #define test_Task_Prio 15
1
之间的通信。在使用消息邮箱前,首先要配置相关参数,修改相关 os_cfg.h 文 件:
#define OS_MBOX_EN #define OS_MBOX_ACCEPT_EN #define OS_MBOX_DEL_EN #define OS_MBOX_POST_EN #define OS_MBOX_POST_OPT_EN #define OS_MBOX_QUERY_EN 1 1 1 1 1 1
************************任务间通信****************************** 消息邮箱是 uC/OS-II 中的一种通信机制,可以使一个任务或者中断服务子 程序向另一个任务发送一个指针型的变量。通常该指针指向一个包含了“消息”的 特定数据结构。此游戏需要键盘给屏幕发送数据,因此采用邮箱机制完成两任务
2
Hale Waihona Puke { int i; ClearScreen(); //清屏 pdc = CreateDC();//创建绘图设备上下文 // 蛇初始化 drawWall(); initSnake(); // 豆子初始化 Bean.x = 80; Bean.y = 80; drawBean(); while (1) { clearTail(Snake.x[Snake.length-1], Snake.y[Snake.length-1]);// 消尾 for(i=Snake.length-1;i>0;i--) { Snake.x[i]=Snake.x[i-1]; Snake.y[i]=Snake.y[i-1]; } if(Snake.x[0]<45||Snake.x[0]>380||Snake.y[0]<45|| Snake.y[0]>430)//蛇是否撞到墙壁 { ClearScreen(); } addNode(Snake.x[0],Snake.y[0]); // 更新节点 if(Bean.x==Snake.x[0]Bean.y==Snake.y[0]&&(Snake.length<SNAKE_MAX_LE N))// 判断是否吃到豆子 { Snake.length = Snake.length + 1; for(i=Snake.length-1;i>0;i--) { Snake.x[i]=Snake.x[i-1]; Snake.y[i]=Snake.y[i-1]; } addNode(Snake.x[0],Snake.y[0]); drawBean(); } OSTimeDly(500); } } void Key_Task(void *Id) { while(1) {
基于 ucos 的贪吃蛇游戏设计
游戏简介: 贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一 个食物, 通过按键盘四个光标键控制蛇向上下左右四个方向移动, 蛇头撞倒食物, 则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中 撞到墙或身体交叉蛇头撞倒自己身体游戏结束。 设计思路: 这个程序的关键是表示蛇的图形以及蛇的移动。 用一个小圆形表示蛇的一节 身体,身体每长一节,增加一个圆形块,蛇头用一节表示。移动时必须从蛇头开 始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键, 蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向 移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然 后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这是由于没 有清屏的原因, 原来蛇的位置和新蛇的位置差一个单位, 所以看起来多一节身体, 所以将蛇的最后一节用背景色覆盖。 食物的出现和消失也是画圆形块和覆盖圆形 块表示。 蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一 节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类 型,一组坐标对应一节的位置,假设有 i+1 节,由 0 到 i 节,第 i 节的坐标取第 i-1 节的坐标,第 i-1 节的坐标取第 i-2 节的坐标……直到第 1 节取第 0 节的坐 标。 而第 0 节的坐标, 即蛇头的坐标要往某个方向变化, 变化量为蛇每节的长度。 蛇的这种坐标轮换需要循环语句使其继续下去。 ************************任务划分及优先级定义******************** 此游戏已经成功移植到 S3C2410 开发板上运行, 是基于 ucos 系统的应用小 游戏。由此,将游戏划分成两个任务:屏幕显示任务、键盘扫描任务。先由键盘 扫描任务获取键值,控制显示任务绘制图形,由此屏幕显示任务优先级比键盘扫 描任务较低。任务控制块与优先级定义代码如下:
4
/////***************定义方向******************///////// #define LEFT 52 #define RIGHT 54 #define UP 56 #define DOWN 50 #define NODE_SIZE 5 #define SNAKE_MAX_LEN 4 #define BACKGROUND_COLOR 0x00FFFFFF #define CURRENT_COLOR 0x00000000 #define BEAN_X 30 #define BEAN_Y 20 #define WALL_X_MAX 450 #define WALL_X_MIN 20 #define WALL_Y_MAX 400 #define WALL_Y_MIN 20 *****************************事件定义****************************** OS_EVENT *keybox; PDC pdc; //定义绘图设备上下文结构 *************************游戏数据结构体的定************************** struct snake { int x[SNAKE_MAX_LEN]; int y[SNAKE_MAX_LEN]; int life; // 0,表示游戏结束 int length; // 数量表示节数,不超过 SNAKE_MAX_LEN int direction; // 表示方向,L R U D } Snake; struct bean { int x; int y; int count; } Bean; void drawNode(U32 color,int x,int y); void clearTail(int x,int y); void addNode(int x,int y); void drawWall(void)// 画墙 { int i; SetPenColor(pdc, 0x0000FFFF);//////设置画笔颜色为 for(i=18;i<=397;i+=10)/*画围墙范围是*/ { DrawRectFrame(pdc,i,25,i+10,34);
相关主题