|
給大家分享一個(gè)stm32貪吃蛇游戲程序
程序內(nèi)的觸摸控制功能使用的是240*400分辨率的TFT彩屏,如果你的彩屏不是這個(gè)尺寸,出現(xiàn)觸摸位置不正確,你需要修改主函數(shù)內(nèi)的觸摸參數(shù)判斷。具體可以看主函數(shù)。
程序僅供參考,如有問(wèn)題可參考實(shí)驗(yàn)例程內(nèi)的一些基礎(chǔ)程序理解
單片機(jī)源程序如下:
- /* 文件比較大,使用自帶的下載軟件不能完全燒寫(xiě)進(jìn)去,因此請(qǐng)使用JLINK進(jìn)行程序下載
- 下載后請(qǐng)按照LCD提示操作
- 1.可以使用按鍵操作貪吃蛇方向
- 2.可以使用觸摸控制貪吃蛇方向及游戲開(kāi)始和暫停
- 3.游戲結(jié)束后按復(fù)位按鍵開(kāi)始*/
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "button.h"
- #include "lcd_driver.h"
- #include "gui.h"
- #include "tim.h"
- #include "rtc.h"
- #include "stdlib.h"
- #include "flash.h"
- #include "touch.h"
- #include "snake.h"
- #define SNAKE_Max_Long 50//蛇的最大長(zhǎng)度
- u8 pause=0;
- u8 start=0;
- //蛇結(jié)構(gòu)體
- struct Snake
- {
- s16 X[SNAKE_Max_Long];
- s16 Y[SNAKE_Max_Long];
- u8 Long;//蛇的長(zhǎng)度
- u8 Life;//蛇的生命 0活著 1死亡
- u8 Direction;//蛇移動(dòng)的方向
- }snake;
- //食物結(jié)構(gòu)體
- struct Food
- {
- u8 X;//食物橫坐標(biāo)
- u8 Y;//食物縱坐標(biāo)
- u8 Yes;//判斷是否要出現(xiàn)食物的變量 0有食物 1需要出現(xiàn)食物
- }food;
- //游戲等級(jí)分?jǐn)?shù)
- struct Game
- {
- u16 Score;//分?jǐn)?shù)
- u8 Life;//游戲等級(jí)
- }game;
- void touch(void)
- {
- static u8 start=0;
- key=keyscan(0);
- if(TOUCH_Scan() == 0)
- {
- start=1;
- }
- if(start==1)
- {
-
- if((key==K_UP_PRESS||(TouchData.lcdx>88&&TouchData.lcdx<152&&TouchData.lcdy>192&&TouchData.lcdy<224))&&snake.Direction!=4) //上
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- snake.Direction=3;
- }
- if((key==K_DOWN_PRESS||(TouchData.lcdx>88&&TouchData.lcdx<152&&TouchData.lcdy>266&&TouchData.lcdy<298))&&snake.Direction!=3) //下
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- snake.Direction=4;
- }
- if((key==K_LEFT_PRESS||(TouchData.lcdx>19&&TouchData.lcdx<83&&TouchData.lcdy>229&&TouchData.lcdy<261))&&snake.Direction!=1) //左
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- snake.Direction=2;
- }
- if((key==K_RIGHT_PRESS||(TouchData.lcdx>157&&TouchData.lcdx<221&&TouchData.lcdy>229&&TouchData.lcdy<261))&&snake.Direction!=2) //右
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- snake.Direction=1;
- }
- if(((TouchData.lcdx>174&&TouchData.lcdx<238&&TouchData.lcdy>286&&TouchData.lcdy<318)))//暫停
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- pause=1; //暫停
- }
- if(((TouchData.lcdx>1&&TouchData.lcdx<65&&TouchData.lcdy>286&&TouchData.lcdy<318)))//開(kāi)始
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- pause=0; //開(kāi)始
- }
-
-
- }
- }
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)
- {
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
- touch();
- }
- }
- //游戲結(jié)束
- void gameover()
- {
- start=0;//停止游戲
- Test_Show_CH_Font24(80,65,0,RED);
- Test_Show_CH_Font24(104,65,1,RED);
- Test_Show_CH_Font24(128,65,2,RED);
- Test_Show_CH_Font24(152,65,3,RED);
- Test_Show_CH_Font24(176,65,4,RED);
- GUI_Show12ASCII(224,165,"0",BLACK,GRAY);//顯示生命值
- }
- //玩游戲
- void play()
- {
- u16 i,n;//i蛇的關(guān)節(jié)數(shù) n用來(lái)判斷食物和蛇的身體是否重合
- u8 life_buf[2];
- u8 socre_buf[4];
- snake.Long=2;//定義蛇的長(zhǎng)度
- snake.Life=0;//蛇還活著
- snake.Direction=1;//蛇的起始方向定義為右
- game.Score=0;//分?jǐn)?shù)為0
- game.Life=4;//蛇的生命值
- food.Yes=1;//出現(xiàn)新食物
- snake.X[0]=12;snake.Y[0]=24;
- snake.X[1]=12;snake.Y[1]=24;
- while(1)
- {
- if(food.Yes==1)//出現(xiàn)新的食物
- {
- while(1)
- {
- //在設(shè)定的區(qū)域內(nèi)顯示食物
- //food.X=12+rand()%(240/12)*12;
- // food.Y=12+rand()%(160/12)*12;
- srand(calendar.sec);//添加隨機(jī)種子 采用的RTC時(shí)鐘
- food.X=12+rand()%(228/12)*12;
- food.Y=12+rand()%(148/12)*12;
- for(n=0;n<snake.Long;n++)
- {
- if(food.X==snake.X[n]&&food.Y==snake.Y[n])
- break;
- }
- if(n==snake.Long)
- food.Yes=0;
- break;
- }
- }
-
- if(food.Yes==0)//有食物就要顯示
- {
- GUI_Box(food.X,food.Y,food.X+10,food.Y+10,RED);
- }
- //取得需要重新畫(huà)的蛇的節(jié)數(shù)
- for(i=snake.Long-1;i>0;i--)
- {
- snake.X[i]=snake.X[i-1];
- snake.Y[i]=snake.Y[i-1];
- }
- //通過(guò)觸摸屏來(lái)設(shè)置蛇的運(yùn)動(dòng)方向
- switch(snake.Direction)
- {
- case 1:snake.X[0]+=12;break;//向右運(yùn)動(dòng)
- case 2:snake.X[0]-=12;break;//向左運(yùn)動(dòng)
- case 3:snake.Y[0]-=12;break;//向上運(yùn)動(dòng)
- case 4:snake.Y[0]+=12;break;//向下運(yùn)動(dòng)
- }
- for(i=0;i<snake.Long;i++)//畫(huà)出蛇
- GUI_Box(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10,BLUE);//畫(huà)蛇身體
- while(pause==1){};
- delay_ms(500);//延時(shí)
- GUI_Box(snake.X[snake.Long-1],snake.Y[snake.Long-1],snake.X[snake.Long-1]+10,snake.Y[snake.Long-1]+10,GRAY);//消除蛇身
-
-
- //判斷是否撞墻
- if(snake.X[0]<0||snake.X[0]>240||snake.Y[0]<0||snake.Y[0]>150)
- snake.Life=1;//蛇死掉了
-
- //當(dāng)蛇的身體超過(guò)3節(jié)后判斷蛇自身的碰撞
- for(i=3;i<snake.Long;i++)
- {
- if(snake.X[i]==snake.X[0]&&snake.Y[i]==snake.Y[0])//自身的任一坐標(biāo)值與蛇頭坐標(biāo)相等就認(rèn)為是自身碰撞
- game.Life-=1;
- }
- if(snake.Life==1||game.Life==0)//以上兩種判斷以后如果蛇死掉了跳出內(nèi)循環(huán),重新開(kāi)始
- {
- gameover();
- break;
- }
- //判斷蛇是否吃到了食物
- if(snake.X[0]==food.X&&snake.Y[0]==food.Y)
- {
- GUI_Box(food.X,food.Y,food.X+10,food.Y+10,GRAY);//把吃到的食物消除
- if(!((snake.Long==SNAKE_Max_Long)&&(snake.Long==SNAKE_Max_Long)))
- snake.Long++;//蛇的身體長(zhǎng)一節(jié)
- game.Score+=10;
- socre_buf[0]=game.Score/100+0x30;
- socre_buf[1]=game.Score%100/10+0x30;
- socre_buf[2]=game.Score%100%10+0x30;
- socre_buf[3]='\0';
- GUI_Show12ASCII(40,165,socre_buf,BLACK,GRAY);//顯示成績(jī)
- food.Yes=1;//需要重新顯示食物
- }
- life_buf[0]=game.Life%10+0x30;
- life_buf[1]='\0';
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
貪吃蛇游戲(帶觸摸功能).zip
(5.04 MB, 下載次數(shù): 241)
2017-5-29 11:33 上傳
點(diǎn)擊文件名下載附件
stm32
|
|