嵌入式系统课程设计——贪吃蛇_第1页
嵌入式系统课程设计——贪吃蛇_第2页
嵌入式系统课程设计——贪吃蛇_第3页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* 文件作者 : ARM 开发小组* 创建日期 : 2004/06/25* 版本声明 : *J*J*;*/#include ".incconfig.h"#include<stdlib.h>#include<time.h>#include<stdio.h>#defineSTACKSIZE 256OS_STK_DATA stk;externGUI_FONT CHINESE_FONT12;externGUI_FONT CHINESE_FONT16;externGUI_FONT GUI_Font8x16;OS_EVENT *Key_Mbox;/

2、*分配各任务的堆栈容量*/OS_STK Stack_Task_1STACKSIZE;OS_STK Stack_Task_2STACKSIZE;OS_STK Stack_Task_3STACKSIZE;OS_STK Stack_Task_4STACKSIZE*3;/*/ 蛇的最大长度/ 蛇的方向*/#define MAX_X 200#define MAX_Y 200#define UP 1#define DOWN 2 #define LEFT 3#define RIGHT 4#define ROW22 / 表格行数#define COLUMN 22/ 表格列数/ 定义蛇的各项信息struct S

3、nakeS32 xMAX_X;S32 yMAX_Y;S32 length;S32 direction;S32 life;snake;struct Foodint x;/* 食物的横坐标 */int y;/* 食物的纵坐标 */int yes;/* 判断是否要出现食物的变量 */food;/* 食物的结构体 */0, 0 ,/00, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/10, 0,1,1,1, 1, 1, 0, 0, 0,0,0,0,0,0,0,1,1,1,1,1, 0 ,/20, 0,1,0,0, 0, 0, 0, 0, 0,0

4、,0,0,0,0,0,0,0,0,0,1, 0 ,/30, 0,1,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 0 ,/40, 0,1,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 0 ,/50, 0,1,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 0 ,/60, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/70, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/80

5、, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/90, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/100, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/110, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/120, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 ,/130, 0, 0, 0, 0, 0, 0, 0

6、, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1, 0 ,/150, 0,1,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 0 ,/160, 0,1,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 0 ,/170, 0,1,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 0 ,/180, 0,1,1,1, 1, 1, 0, 0, 0,0,0,0,0,0,1,1,1,1,1,1, 0 ,/190, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0

7、,0,0,0,0,0,0,0, 0 ,/200, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 0 /21;S16 map_22222/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 211, 1, 1,1,1, 1, 1, 1, 1, 1,1,1,1,1,1,1,1,1,1,1,1, 1 ,/01, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/11, 0, 0,0,0, 0, 0, 0,

8、 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/21, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/31, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/41, 0, 0,0,0, 0, 0, 0, 0, 1,0,0,1,0,0,0,0,0,0,0,1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,0, 1 ,/61, 0, 0,0,0, 0, 0, 0, 0,1,0,0,1,0,0,0,0,0,

9、0,0,0, 1 ,/71, 0, 0,0,0, 0, 0, 0, 0,1,0,0,1,0,0,0,0,0,0,0,0, 1 ,/81, 0, 0,0,0, 1, 1, 1, 1,1,0,0,1,1,1,1,1,0,0,0,0, 1 ,/91, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/101, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/111, 0, 0,0,0, 1, 1, 1, 1,1,0,0,1,1,1,1,1,0,0,0,0, 1 ,/121, 0, 0,0,0,

10、0, 0, 0, 0,1,0,0,1,0,0,0,0,0,0,0,0, 1 ,/131, 0, 0,0,0, 0, 0, 0, 0,1,0,0,1,0,0,0,0,0,0,0,0, 1 ,/141, 0, 0,0,0, 0, 0, 0, 0,1,0,0,1,0,0,0,0,0,0,0,0, 1 ,/151, 0, 0,0,0, 0, 0, 0, 0,1,0,0,1,0,0,0,0,0,0,0,0, 1 ,/161, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/171, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,

11、0,0,0,0,0,0, 1 ,/181, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0, 1 ,/191, 0, 0,0,0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,1, 1 /21;int oldDire = 4; / 记录前一个方向int score = 0; / 分数int gametime = 99;/ 时间int mapSelect = 0;/ 关卡int gamespeed = 0;/ 难度,速度1 表示难度int key_F = 0;/ 标记 F 键int setUnit = 0;/ 设置游戏项, 0

12、表示关卡,int foodIndex = 0; / 第几个食物int mySrand = 0;void Draw_GUI();/ 绘制游戏界面void Random_Food();/ 产生食物void GameOver();/ 结束游戏void NewGame();/ 新游戏void PrScore();/ 输出新得分void DspTime(INT32U);/ 显示倒计时void DrawMap();/ 画障碍物void CheckMap();/ 判断蛇是否撞到障碍物void Set_SelectFace();/ 游戏设置void DrawSetForm();/ 游戏设置键void Task

13、_2();/*函数名称: Task_4(void *pdata)函数说明: GUI 任务,优先级为 56输入参数: pdata输出参数: 无*/ void Task_4(void *pdata)I32 k = 0;int i = 0;int j = 0;int x = 0;int y = 0;snake.life = 0;/ 活着snake.x0=100;snake.y0=40;/ 蛇头snake.x1=80;snake.y1=40;/ 第一节蛇snake.x2=60;snake.y2=40;snake.length=3;/ 节数snake.direction =RIGHT;food.yes=

14、0;while(1) if(score >= 100)score = 0;mapSelect +;Set_Color(GUI_GREEN);Set_Font(&CHINESE_FONT16);Disp_String (CN_start" 恭喜你,进入下一关! "CN_end,240,240);OSTimeDly(200);NewGame();if(key_F = 1)/ 是否进入游戏设置 /OSTimeDly(100);OSTimeDly(50000);if(snake.x0 = (food.x*20)+20 && snake.y0=(food

15、.y*20)+20)/* 吃到食物以后*/Set_Color(GUI_WHITE);用白色去除蛇的的最后一节Fill_Rect(food.x*20)+20,(food.y*20)+20,(food.x*20)+40,(food.y*20)+40);snake.length+;/ 蛇的身体长一节 food.yes=0;/ 画面上需要出现新的食物 score += 10;PrScore();输出新得分x = snake.xsnake.length-1;y = snake.ysnake.length-1;!for(i=snake.length -1;i>0;i-)/ 蛇的每个环节往前 snak

16、e.xi=snake.xi-1;snake.yi=snake.yi-1;Set_Color(GUI_GREEN);画出蛇for(j=0;j<snake.length;j+) Fill_Rect(snake.xj,snake.yj,snake.xj+20,snake.yj+20);if(food.yes=0) / 画食物Random_Food();Uart_Printf(" random x=%xn",food.x);Uart_Printf(" random y=%xn",food.y);Set_Color(GUI_RED);设置食物颜色红色Fill

17、_Circle(food.x*20)+30,(food.y*20)+30,10);/ 画食物,为红色的圆/ 蛇的方向switch(snake.direction)case UP:if(oldDire != DOWN)snake.y0 -= 20;oldDire = snake.direction;elsebreak;case DOWN:if(oldDire != UP)snake.y0 += 20;oldDire = snake.direction;elsesnake.y0 -= 20;break;case LEFT:if(oldDire != RIGHT)snake.x0 -= 20;old

18、Dire = snake.direction;elsebreak;case RIGHT:if(oldDire != LEFT)snake.x0 += 20;oldDire = snake.direction;elsesnake.x0 -= 20;break;default:break;Uart_Printf("snake.x0=%d*snake.y0=%dn",snake.x0,snake.y0);for(i=3;i<snake.length;i+)/ 是否撞到自己了,因为蛇头为两节,第三节不可能拐过来 if(snake.xi=snake.x0&&sn

19、ake.yi=snake.y0) snake.life=1;break;CheckMap();/ 判断蛇死亡条件if(snake.x0<20)snake.x0=440;else if(snake.x0 > 440)snake.x0=20; snake.y0=20;else if(snake.y0 <20)snake.y0=440;if(gametime <=0)/ 时间到了snake.life=1; / 蛇死Uart_Printf(" >>>>>>>>>>>>>>>>

20、;>>>>>>snake.life =%dn",snake.life);Uart_Printf(" >>>>>>>>>>>>>>>>>>>>>>snake.direction =%dn",snake.direction);if(snake.life = 1)/ 蛇是否死了GameOver();/ 本次游戏结束OSTimeDly(50000);if(gamespeed = 0)/ 易for(k=0;k

21、<10000000;k+);else if(gamespeed = 1)/ 中for(k=0;k<1000000;k+);else if(gamespeed = 2)/ 难for(k=0;k<100000;k+);elsefor(k=0;k<10000000;k+);Set_Color(GUI_WHITE);用灰色去除蛇的的最后一节Fill_Rect(x,y,x+20,y+20);OSTimeDly(10);/*- 函数名称 : Task_3- 函数说明 : 任务 3,向串口发送数据 - 输入参数 : pdata- 输出参数 : 无*/void Task_3(void

22、*pdata)for(;)if(key_number!=0xff)Uart_Printf("key_number=%xn",key_number); / 任务的干得活儿就是向超级终 端发送内容key_number=0xff;OSTimeDly(30); / 延时100 个节拍/OSTimeDly(100);void Task_1(void *pdata)INT8U err;INT8U *Key_P;INT8U Key_Val;int ys = 0;char cmapSelect2;Timer1_Init(); / 打开时钟节拍,让操作系统跑起 来/ OSTaskCreate

23、(Task_2, (void *)0, (OS_STK *)&Stack_Task_2(STACKSIZ-E1), 9);/ 在任务里创建另一个任务/OSTaskCreate(Task_3, (void *)0, (OS_STK *)&Stack_Task_3(STACKSIZE-)1, 8); / 在任务里创建另一个任务/ 在任务里创建另一个任务for(;)/ 等待任务间的通信邮Key_P = OSMboxPend(Key_Mbox, 0, &err); 箱内的键值指针Key_Val = *Key_P;switch(Key_Val)/int temp_mapSelec

24、t = 0;/ 设置时,选择的关卡/int temp_gamespeed = 0;/ 设置时,选择的难度case 0x05 :/GUI_StoreKey(GUI_KEY_UP);if(key_F = 1)if(setUnit = 0)mapSelect = 1;/mapSelect +;/if(mapSelect = 3)/ mapSelect = 2;else if(setUnit = 1)gamespeed = 1;/gamespeed +;/if(gamespeed = 3)/ gamespeed = 2;DrawSetForm();break;/ 选择关卡/ 选择难易程度case 0x

25、06 :/GUI_StoreKey(GUI_KEY_UP);/ 上/ 下/ 右setUnit = 0;DrawSetForm();snake.direction = UP;break;case 0x04 :/GUI_StoreKey(GUI_KEY_DOWN);if(key_F = 1)setUnit = 1;DrawSetForm();snake.direction = DOWN;break;case 0x01 :/GUI_StoreKey(GUI_KEY_RIGHT);if(key_F = 1)if(setUnit = 0)mapSelect = 2;/mapSelect +;/ mapS

26、elect = 2;else if(setUnit = 1)gamespeed = 2;/gamespeed +;/if(gamespeed = 3)/ gamespeed = 2; DrawSetForm(); snake.direction = RIGHT;/ 左break;case 0x09 :/GUI_StoreKey(GUI_KEY_LEFT);if(key_F = 1)if(setUnit = 0)mapSelect = 0;/mapSelect -;/if(mapSelect = -1) / mapSelect = 0;else if(setUnit = 1)gamespeed

27、= 0;/gamespeed -;/if(gamespeed = -1)/ gamespeed = 0; DrawSetForm();snake.direction = LEFT;break;case 0x0F :/ 进入菜单if(key_F = 0)key_F = 1;Set_SelectFace();DrawSetForm();Uart_Printf(" key_F =%dn",key_F);break;/ 进入游戏界面case 0x0B :key_F = 0;score = 0;gametime = 99;NewGame();OSTimeDlyResume(8);el

28、seDraw_GUI(); / 游戏界面初始化PrScore();/ 初始化分数DspTime(99); / 初始化倒计时DrawMap();4);8);/ 创建任务 4OSTaskCreate(Task_2,(void *)0, (OS_STK*)&Stack_Task_2(STACKSIZE)- 1, OSTaskCreate(Task_4, (void *)0, (OS_STK *)&Stack_Task_4(STACKSIZE*-31), break;/*/ 重新开始游戏case 0x0E : score = 0;gametime = 99;NewGame();brea

29、k;*/case 0x00:GUI_StoreKey(GUI_KEY_ENTER);break;default:break;OSTimeDly(1);void Task_2(void *pdata) / 记时 INT8U hours = 0;INT8U minutes = 0;INT8U seconds = 1;INT16U milli = 0;while(1)OSTimeDly(300);if(snake.life = 0)gametime -;DspTime(gametime);PrScore();w«=s寸 9OCXIOOX。#1=匚 J9L-LN0ZI山 S 山 N_HO03

30、)1UOZIJS 间<WM退* (yo<18 Jno)ooolosS8 寸-0 寸 9-0cxl-0cxl)l。#1=匚Tn*>浜務注LU_L_HMI_no)o_ooloso"c一O上茎一= 05OIIO po>S9OO9-PU IN。- -¥<=七县 SINO) 6UESIdsQ _LU-L_H/AI_no)o_oolos _LUn18l_no)oo98los1*曰2 /二08 寸-0 寸 9OOCXI9X。# 丿_匚 间<w鋼退* (yo<18 Jno)ooolosS9 寸OCXI9OCXI-O8 寸)1。# 丿_匚 间相辿底瑁

31、曰牠/=(山018 Jno)o_oolosW2 /二08 寸-08 寸0-09 寸)1。# 丿_匚WK/二08 寸-0 寸 9-09 寸0)1。# 丿_匚WT 注OCXI-O 寸 9OOX。# 丿_匚Disp_String (CN_start" 难易程度: "CN_end,500,110);Disp_String (CN_start" 分数: "CN_end,500,250);Disp_String (CN_start" 倒计时: "CN_end,500,360);void Random_Food()srand(mySrand+);f

32、ood.x=rand()%22;srand(mySrand+3);food.y=rand()%22;food.yes = 1;switch(mapSelect)case 0:0*%dUart_Printf("*casen",foodIndex);case 1:1*map_1food.xfood.yUart_Printf("*case= %d n",map_1food.xfood.y);if(map_1food.yfood.x = 1)Uart_Printf(1111*foodIndex= %dn",foodIndex);Random_Food(

33、);Uart_Printf("*2222*foodIndex n",foodIndex);break;= %dcase 2:if(map_2food.yfood.x = 1)Random_Food();Uart_Printf("*case 2*foodIndex = %dn",foodIndex);default:break;Uart_Printf(FOOD*food.xUart_Printf(FOOD*food.y= %d n",food.x);= %d n",food.y);void GameOver()/ 游戏结束Set_Fon

34、t(&CHINESE_FONT16);/ 显示分数Disp_String (CN_start" 游戏结束! "CN_end,240,240); void PrScore()INT8U bw;INT8U sw;INT8U gw; char cscore 4; int b;int s;int g;Set_Color(GUI_BLUE);/ 蓝色Fill_Rect(520,280,540,320);Uart_Printf(score= %dn",score);bw = score/100;sw = score%100/10;gw = score%10;b = s

35、core/100;s = score%100/10;g = score%10;cscore0=b+48;cscore1=s+48;cscore2=g+48;cscore3=0;Set_Color(GUI_RED);/ 红色Set_Font(&GUI_Font8x16);Disp_String (cscore,520,280);write7279(decode1+2, bw & 0x0f);/ 左边数码管write7279(decode1+1,sw & 0x0f);write7279(decode1,gw & 0x0f); void DspTime(INT32U

36、time) / 显示倒计时 INT8U a;INT8U b;int atime;int btime;char ctime3;a = gametime / 10;b = gametime % 10; atime=gametime / 10;btime= gametime % 10;ctime0=atime+48;ctime1=btime+48; ctime2=0;Set_Color(GUI_BLUE);/ 蓝色Fill_Rect(520,270,550,320);Set_Color(GUI_RED);/ 红色Set_Font(&GUI_Font8x16);Disp_String (cti

37、me,520,390);write7279(decode1+5, a & 0x0f);/ 最右边数码管write7279(decode1+4,b & 0x0f);void NewGame()/ 新游戏int j = 0;Set_Color(GUI_WHITE);消去蛇原来的记录for(j=0;j<snake.length;j+)Fill_Rect(snake.xj,snake.yj,snake.xj+20,snake.yj+20);snake.life = 0;/ 活着snake.x0=100;snake.y0=40;/ 蛇头snake.x1=80;snake.y1=40

38、;/ 第一节蛇/ 节数snake.x2=60; snake.y2=40;snake.length=3;snake.direction = RIGHT;Draw_GUI(); / 游戏界面初始化gametime = 99;PrScore();/ 初始化分数DspTime(99); / 初始化倒计时DrawMap();food.yes = 0;void DrawMap()/ 画障碍物int i = 0;int j = 0;switch(mapSelect)case 0:break;case 1:for(i=0; i<22; i+)for(j=0; j<22; j+)if(map_1ij

39、 = 1)Set_Color(GUI_GRAY); / 障碍物颜色灰色Fill_Rect(j*20)+20, (i*20)+20, (j*20)+40, (i*20)+40);break;case 2:for(i=0; i<22; i+)for(j=0; j<22; j+)if(map_2ij = 1)Set_Color(GUI_GRAY); / 障碍物颜色 灰色Fill_Rect(j*20)+20, (i*20)+20, (j*20)+40, (i*20)+40);break;default:break;void CheckMap()/ 是否撞到障碍物int i = 0;int

40、j = 0;int snake_x = 0;int snake_y = 0;snake_x = (snake.x0-20)/20;snake_y = (snake.y0-20)/20;mapSelect = mapSelect % 3;switch(mapSelect)case 0:break;case 1:for(i=0; i<22; i+)for(j=0; j<22; j+) if(map_1ij = 1 && j = snake_x && i = snake_y) snake.life = 1; / 蛇死了i=22;break;break;ca

41、se 2:for(i=0; i<22; i+)for(j=0; j<22; j+)if(map_2ij = 1 && j = snake_x && i = snake_y)snake.life = 1; / 蛇死了i=22;break;break;default:break;/ 显示栏void Set_SelectFace()Set_Color(GUI_WHITE);Fill_Rect(0,0,639,479);/*Set_Color(GUI_GREEN);Fill_Rect(160,20,460,410);*/Set_Color(GUI_RED);

42、设置色Set_Font(&CHINESE_FONT16);Set_Color(GUI_YELLOW);Set_Font(&CHINESE_FONT16);Disp_String (CN_start" 关卡: "CN_end,310,140);/Fill_Rect(200,120,240,160);Disp_Stri ng (CN_startCN_e nd,250,200);/ Fill_Rect(260,120,300,160);Disp_Stri ng (CN_start"二"CN_e nd,310,200);/ Fill_Rect(3

43、20,120,360,160);Disp_Stri ng (CN_start"三"CN_e nd,370,200);Disp_Stri ng (CN_start"难度:"CN_e nd,310,260);/ Fill_Rect(200,200,240,240);Disp_Stri ng (CN_start"易"CN_e nd,250,320);/Fill_Rect(260,200,300,240);Disp_String (CN_start"中"CN_end,310,320);/ Fill_Rect(320,200,360,240);Disp_Stri ng (CN_start"难"CN_e nd,370,320);/* Set_Color(GUI_WHITE);Fill_Rect(460,20,630,460);*/* Disp_String (CN_start" 注释 "CN_end,490,80);Disp_String (CN_start" 菜单: F"CN_end,490,100);*/void DrawSetForm()/ 游戏设置键Set_Colo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论