|
給大家分享一個stm32貪吃蛇游戲程序
程序內的觸摸控制功能使用的是240*400分辨率的TFT彩屏,如果你的彩屏不是這個尺寸,出現觸摸位置不正確,你需要修改主函數內的觸摸參數判斷。具體可以看主函數。
程序僅供參考,如有問題可參考實驗例程內的一些基礎程序理解
0.png (463.8 KB, 下載次數: 135)
下載附件
2017-5-30 01:43 上傳
0.png (636.01 KB, 下載次數: 140)
下載附件
2017-5-30 01:43 上傳
單片機源程序如下:
- /* 文件比較大,使用自帶的下載軟件不能完全燒寫進去,因此請使用JLINK進行程序下載
- 下載后請按照LCD提示操作
- 1.可以使用按鍵操作貪吃蛇方向
- 2.可以使用觸摸控制貪吃蛇方向及游戲開始和暫停
- 3.游戲結束后按復位按鍵開始*/
- #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//蛇的最大長度
- u8 pause=0;
- u8 start=0;
- //蛇結構體
- struct Snake
- {
- s16 X[SNAKE_Max_Long];
- s16 Y[SNAKE_Max_Long];
- u8 Long;//蛇的長度
- u8 Life;//蛇的生命 0活著 1死亡
- u8 Direction;//蛇移動的方向
- }snake;
- //食物結構體
- struct Food
- {
- u8 X;//食物橫坐標
- u8 Y;//食物縱坐標
- u8 Yes;//判斷是否要出現食物的變量 0有食物 1需要出現食物
- }food;
- //游戲等級分數
- struct Game
- {
- u16 Score;//分數
- u8 Life;//游戲等級
- }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)))//開始
- {
- TouchData.lcdx=0;
- TouchData.lcdy=0;
- pause=0; //開始
- }
-
-
- }
- }
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)
- {
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
- touch();
- }
- }
- //游戲結束
- 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蛇的關節數 n用來判斷食物和蛇的身體是否重合
- u8 life_buf[2];
- u8 socre_buf[4];
- snake.Long=2;//定義蛇的長度
- snake.Life=0;//蛇還活著
- snake.Direction=1;//蛇的起始方向定義為右
- game.Score=0;//分數為0
- game.Life=4;//蛇的生命值
- food.Yes=1;//出現新食物
- snake.X[0]=12;snake.Y[0]=24;
- snake.X[1]=12;snake.Y[1]=24;
- while(1)
- {
- if(food.Yes==1)//出現新的食物
- {
- while(1)
- {
- //在設定的區域內顯示食物
- //food.X=12+rand()%(240/12)*12;
- // food.Y=12+rand()%(160/12)*12;
- srand(calendar.sec);//添加隨機種子 采用的RTC時鐘
- 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);
- }
- //取得需要重新畫的蛇的節數
- for(i=snake.Long-1;i>0;i--)
- {
- snake.X[i]=snake.X[i-1];
- snake.Y[i]=snake.Y[i-1];
- }
- //通過觸摸屏來設置蛇的運動方向
- switch(snake.Direction)
- {
- case 1:snake.X[0]+=12;break;//向右運動
- case 2:snake.X[0]-=12;break;//向左運動
- case 3:snake.Y[0]-=12;break;//向上運動
- case 4:snake.Y[0]+=12;break;//向下運動
- }
- for(i=0;i<snake.Long;i++)//畫出蛇
- GUI_Box(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10,BLUE);//畫蛇身體
- while(pause==1){};
- delay_ms(500);//延時
- 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;//蛇死掉了
-
- //當蛇的身體超過3節后判斷蛇自身的碰撞
- for(i=3;i<snake.Long;i++)
- {
- if(snake.X[i]==snake.X[0]&&snake.Y[i]==snake.Y[0])//自身的任一坐標值與蛇頭坐標相等就認為是自身碰撞
- game.Life-=1;
- }
- if(snake.Life==1||game.Life==0)//以上兩種判斷以后如果蛇死掉了跳出內循環,重新開始
- {
- 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++;//蛇的身體長一節
- 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);//顯示成績
- food.Yes=1;//需要重新顯示食物
- }
- life_buf[0]=game.Life%10+0x30;
- life_buf[1]='\0';
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
貪吃蛇游戲(帶觸摸功能).zip
(5.04 MB, 下載次數: 241)
2017-5-29 11:33 上傳
點擊文件名下載附件
stm32 下載積分: 黑幣 -5
|
|