嵌入式系統(tǒng)課程設(shè)計(jì)——貪吃蛇參考模板_第1頁(yè)
嵌入式系統(tǒng)課程設(shè)計(jì)——貪吃蛇參考模板_第2頁(yè)
嵌入式系統(tǒng)課程設(shè)計(jì)——貪吃蛇參考模板_第3頁(yè)
嵌入式系統(tǒng)課程設(shè)計(jì)——貪吃蛇參考模板_第4頁(yè)
嵌入式系統(tǒng)課程設(shè)計(jì)——貪吃蛇參考模板_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、/* *;*-;*-;* 文件作者 : ARM開發(fā)小組;* 創(chuàng)建日期 : 2004/06/25;* 版本聲明 : v1.0.0;*-;*-;*;*/#include ".incconfig.h"#include<stdlib.h>#include<time.h>#include<stdio.h>#defineSTACKSIZE256OS_STK_DATA stk;extern GUI_FONT CHINESE_FONT12;extern GUI_FONT CHINESE_FONT16;extern GUI_FONT GUI_Font8x1

2、6;OS_EVENT *Key_Mbox;1 / 44/* 分配各任務(wù)的堆棧容量 */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 /蛇的最大長(zhǎng)度#define MAX_Y 200#define UP 1 /蛇的方向#define DOWN 2#define LEFT 3#define RIGHT 4#define ROW 22 /表格行數(shù)#define COLUM

3、N 22 /表格列數(shù)/定義蛇的各項(xiàng)信息struct Snake S32 xMAX_X; S32 yMAX_Y; S32 length; S32 direction; S32 life;snake;struct Food int x;/*食物的橫坐標(biāo)*/ int y;/*食物的縱坐標(biāo)*/ int yes;/*判斷是否要出現(xiàn)食物的變量*/food;/*食物的結(jié)構(gòu)體*/S16 map_12222 =/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 0, 0, 0, 0, 0, 0, 0, 0,

4、 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/1 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 ,/2 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ,/3 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

5、 0, 0, 0, 0, 1, 0 ,/4 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ,/5 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ,/6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/7 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/8 0,

6、 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/9 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/12 0, 0, 0, 0, 0, 0, 0, 0,

7、 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/14 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ,/15 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ,/16 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

8、, 0, 0, 0, 0, 0, 1, 0 ,/17 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ,/18 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 ,/19 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/20 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

9、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, 21 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,/0 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/1 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

10、0, 1 ,/2 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/3 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/4 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/5 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/6 1, 0, 0, 0, 0,

11、0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/7 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/8 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 ,/9 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/10 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

12、 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/11 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 ,/12 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/13 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/14 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0

13、, 0, 1 ,/15 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/16 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/17 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/18 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/19 1, 0, 0,

14、 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,/20 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /21 ; int oldDire = 4; /記錄前一個(gè)方向int score = 0; /分?jǐn)?shù)int gametime = 99;/時(shí)間int mapSelect = 0;/關(guān)卡int gamespeed = 0;/難度,速度int key_F = 0;/標(biāo)記F鍵int setUnit = 0;/設(shè)置游戲項(xiàng),0表示關(guān)卡,1表示難度int f

15、oodIndex = 0; /第幾個(gè)食物int mySrand = 0;void Draw_GUI();/繪制游戲界面void Random_Food();/產(chǎn)生食物void GameOver();/結(jié)束游戲void NewGame();/新游戲void PrScore();/輸出新得分void DspTime(INT32U);/顯示倒計(jì)時(shí)void DrawMap();/畫障礙物void CheckMap();/ 判斷蛇是否撞到障礙物void Set_SelectFace();/游戲設(shè)置void DrawSetForm();/游戲設(shè)置鍵void Task_2();/*- 函數(shù)名稱 : Task

16、_4(void *pdata)- 函數(shù)說(shuō)明 : GUI任務(wù),優(yōu)先級(jí)為56- 輸入?yún)?shù) : pdata- 輸出參數(shù) : 無(wú)*/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; /第一節(jié)蛇 snake.x2=60; snake.y2=40; snake.length=3; /節(jié)數(shù) snake.direction = RIGHT; food.yes=0

17、; while(1) if(score >= 100) score = 0; mapSelect +; Set_Color(GUI_GREEN); Set_Font(&CHINESE_FONT16); Disp_String (CN_start"恭喜你,進(jìn)入下一關(guān)!"CN_end,240,240); OSTimeDly(200); NewGame(); if(key_F = 1)/是否進(jìn)入游戲設(shè)置 /OSTimeDly(100); OSTimeDly(50000); if(snake.x0 = (food.x*20)+20 && snake.y

18、0=(food.y*20)+20)/*吃到食物以后*/Set_Color(GUI_WHITE);/用白色去除蛇的的最后一節(jié)Fill_Rect(food.x*20)+20,(food.y*20)+20,(food.x*20)+40,(food.y*20)+40);snake.length+;/蛇的身體長(zhǎng)一節(jié)food.yes=0;/畫面上需要出現(xiàn)新的食物score += 10;PrScore();/輸出新得分 x = snake.xsnake.length-1;y = snake.ysnake.length-1; for(i=snake.length-1;i>0;i-)/蛇的每個(gè)環(huán)節(jié)往前!s

19、nake.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);/設(shè)置食

20、物顏色 紅色 Fill_Circle(food.x*20)+30,(food.y*20)+30,10); /畫食物,為紅色的圓 switch(snake.direction) /蛇的方向 case UP: if(oldDire != DOWN) snake.y0 -= 20; oldDire = snake.direction; else snake.y0 += 20; break; case DOWN: if(oldDire != UP) snake.y0 += 20; oldDire = snake.direction; else snake.y0 -= 20; break; case L

21、EFT: if(oldDire != RIGHT) snake.x0 -= 20; oldDire = snake.direction; else snake.x0 += 20; break; case RIGHT: if(oldDire != LEFT) snake.x0 += 20; oldDire = snake.direction; else snake.x0 -= 20; break; default: break; Uart_Printf("snake.x0=%d* snake.y0=%dn",snake.x0,snake.y0); for(i=3;i<s

22、nake.length;i+)/是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)if(snake.xi=snake.x0&&snake.yi=snake.y0) snake.life=1; break; CheckMap();/ 判斷蛇死亡條件 if(snake.x0<20)snake.x0=440;else if(snake.x0 > 440)snake.x0=20;else if(snake.y0 > 440)snake.y0=20;else if(snake.y0 <20)snake.y0=440; if(gametime <=0)/時(shí)間到

23、了 snake.life=1; /蛇死 Uart_Printf(" >>>>>>>>>>>>>>>>>>>>>>snake.life =%dn",snake.life);Uart_Printf(" >>>>>>>>>>>>>>>>>>>>>>snake.direction =%dn",snake

24、.direction);if(snake.life = 1)/蛇是否死了 GameOver();/本次游戲結(jié)束 OSTimeDly(50000); if(gamespeed = 0)/易 for(k=0;k<10000000;k+); else if(gamespeed = 1)/中 for(k=0;k<1000000;k+); else if(gamespeed = 2)/難 for(k=0;k<100000;k+); else for(k=0;k<10000000;k+); Set_Color(GUI_WHITE);/用灰色去除蛇的的最后一節(jié)Fill_Rect(x,

25、y,x+20,y+20);OSTimeDly(10); /*- 函數(shù)名稱 : Task_3- 函數(shù)說(shuō)明 : 任務(wù)3,向串口發(fā)送數(shù)據(jù)- 輸入?yún)?shù) : pdata- 輸出參數(shù) : 無(wú)*/void Task_3(void *pdata) for(;) if(key_number!=0xff) Uart_Printf("key_number=%xn",key_number); /任務(wù)的干得活兒就是向超級(jí)終端發(fā)送內(nèi)容 key_number=0xff; OSTimeDly(30); /延時(shí)100個(gè)節(jié)拍 /OSTimeDly(100); void Task_1(void *pdata)

26、INT8U err; INT8U *Key_P; INT8U Key_Val; int ys = 0; char cmapSelect2; Timer1_Init(); /打開時(shí)鐘節(jié)拍,讓操作系統(tǒng)跑起來(lái) / OSTaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2(STACKSIZE) - 1, 9); /在任務(wù)里創(chuàng)建另一個(gè)任務(wù)/ OSTaskCreate(Task_3, (void *)0, (OS_STK *)&Stack_Task_3(STACKSIZE) - 1, 8); /在任務(wù)里創(chuàng)建另一個(gè)任務(wù) /在任務(wù)里創(chuàng)建另一

27、個(gè)任務(wù) for(;) Key_P = OSMboxPend(Key_Mbox, 0, &err); /等待任務(wù)間的通信郵箱內(nèi)的鍵值指針 Key_Val = *Key_P; switch(Key_Val) /int temp_mapSelect = 0;/設(shè)置時(shí),選擇的關(guān)卡/int temp_gamespeed = 0;/設(shè)置時(shí),選擇的難度case 0x05 : /GUI_StoreKey(GUI_KEY_UP); if(key_F = 1) if(setUnit = 0) /選擇關(guān)卡 mapSelect = 1; /mapSelect +; /if(mapSelect = 3) /ma

28、pSelect = 2; else if(setUnit = 1) /選擇難易程度 gamespeed = 1; /gamespeed +; /if(gamespeed = 3) /gamespeed = 2; DrawSetForm(); break; case 0x06 : /上 /GUI_StoreKey(GUI_KEY_UP); if(key_F = 1) setUnit = 0; DrawSetForm(); snake.direction = UP; break; case 0x04 : /下 /GUI_StoreKey(GUI_KEY_DOWN); if(key_F = 1) s

29、etUnit = 1; DrawSetForm(); snake.direction = DOWN; break; case 0x01 : /右 /GUI_StoreKey(GUI_KEY_RIGHT); if(key_F = 1) if(setUnit = 0) mapSelect = 2; /mapSelect +; /if(mapSelect = 3) /mapSelect = 2; else if(setUnit = 1) gamespeed = 2; /gamespeed +; /if(gamespeed = 3) /gamespeed = 2; DrawSetForm(); sna

30、ke.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 = 0; /gamespeed -; /if(gamespeed = -1) /gamespeed = 0; DrawSetForm(); snake.direction = LEFT; break;

31、case 0x0F : /進(jìn)入菜單 if(key_F = 0) key_F = 1; Set_SelectFace(); DrawSetForm(); Uart_Printf(" key_F =%dn",key_F); break; case 0x0B : /進(jìn)入游戲界面 if(key_F = 1) key_F = 0; score = 0; gametime = 99; NewGame(); OSTimeDlyResume(8); else Draw_GUI(); /游戲界面初始化 PrScore();/初始化分?jǐn)?shù) DspTime(99);/初始化倒計(jì)時(shí) DrawMap(

32、); OSTaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2(STACKSIZE) - 1, 4); OSTaskCreate(Task_4, (void *)0, (OS_STK *)&Stack_Task_4(STACKSIZE*3) - 1, 8);/創(chuàng)建任務(wù)4 break; /*case 0x0E : /重新開始游戲 score = 0; gametime = 99; NewGame(); break;*/ case 0x00: GUI_StoreKey(GUI_KEY_ENTER); break; default

33、: break; OSTimeDly(1); void Task_2(void *pdata) /記時(shí)INT8U hours = 0;INT8U minutes = 0;INT8U seconds = 1;INT16U milli = 0;while(1) OSTimeDly(300);if(snake.life = 0)gametime -;DspTime(gametime);PrScore();void Draw_GUI() /繪制游戲界面int i=0; int j=0; Set_Color(GUI_WHITE);/游戲背景 白 Fill_Rect(20,20,640,480); Set

34、_Color(GUI_BLACK);/設(shè)置墻 黑色 Set_Font(&CHINESE_FONT16); Fill_Rect(0,0,20,640); /左墻 Fill_Rect(0,0,640,20);/ 上墻 Fill_Rect(0,460,640,480); /下墻 Fill_Rect(460,0,480,480); /右墻 Set_Color(GUI_BLUE);/右邊顯示欄 藍(lán)色 Fill_Rect(480,20,620,460); Set_Color(GUI_BLACK);/設(shè)置墻 黑色 Fill_Rect(620,0,640,480); /右邊框 Set_BkColor(

35、GUI_BLUE); Set_Color(GUI_WHITE); Disp_String (CN_start"關(guān)卡:"CN_end,500,60); Disp_String (CN_start"難易程度:"CN_end,500,110); Disp_String (CN_start"分?jǐn)?shù):"CN_end,500,250); Disp_String (CN_start"倒計(jì)時(shí):"CN_end,500,360); void Random_Food() srand(mySrand+); food.x=rand()%22;

36、 srand(mySrand+3); food.y=rand()%22; food.yes = 1; switch(mapSelect)case 0: Uart_Printf("*case 0*foodIndex = %d n",foodIndex);break;case 1:Uart_Printf("*case 1*map_1food.xfood.y = %d n",map_1food.xfood.y);if(map_1food.yfood.x = 1) Uart_Printf("*1111*foodIndex = %d n",fo

37、odIndex); Random_Food(); Uart_Printf("*2222*foodIndex = %d n",foodIndex); break;case 2:if(map_2food.yfood.x = 1) Random_Food(); Uart_Printf("*case 2*foodIndex = %d n",foodIndex);break;default:break; Uart_Printf("*FOOD*food.x = %d n",food.x); Uart_Printf("*FOOD*food.y = %d n",food.y); void Gam

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論