- #include "system.h"
- #include "SysTick.h"
- #include "led.h"
- #include "usart.h"
- #include "tftlcd.h"
- #include "time.h"
- #include "key.h"
- #include "snake.h"
- #include "rtc.h"
- #include "stdlib.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)
- {
- key=KEY_Scan(0);
-
- if(key==KEY_UP_PRESS&&snake.Direction!=4) //上
- {
- snake.Direction=3;
- }
- if(key==KEY1_PRESS&&snake.Direction!=3) //下
- {
- snake.Direction=4;
- }
- if(key==KEY2_PRESS&&snake.Direction!=1) //左
- {
- snake.Direction=2;
- }
- if(key==KEY0_PRESS&&snake.Direction!=2) //右
- {
- snake.Direction=1;
- }
- }
- void TIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update)!= RESET)
- {
- touch();
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
- }
- }
- //游戲結束
- 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);
- FRONT_COLOR=BLACK;
- BACK_COLOR=GRAY;
- LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,"0");//顯示生命值
- }
- //玩游戲
- 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(rtc_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)//有食物就要顯示
- {
- LCD_Fill(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++)//畫出蛇
- LCD_Fill(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10,BLUE);//畫蛇身體
- while(pause==1){};
- delay_ms(500);//延時
- LCD_Fill(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)
- {
- LCD_Fill(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';
- FRONT_COLOR=BLACK;
- BACK_COLOR=GRAY;
-
- LCD_ShowString(40,165,tftlcd_data.width,tftlcd_data.height,16,socre_buf);//顯示成績
- food.Yes=1;//需要重新顯示食物
- }
- life_buf[0]=game.Life%10+0x30;
- life_buf[1]='\0';
-
- LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,life_buf);//顯示生命值
- }
- }
- int main()
- {
- SysTick_Init(168);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組
- LED_Init();
- KEY_Init();
- USART1_Init(9600);
- TFTLCD_Init(); //LCD初始化
- LCD_ShowPictureEx(0, 0, 240, 400);
- while(1)
- {
- if(KEY_Scan(1)==KEY_UP_PRESS)break;
- FRONT_COLOR=RED;
- LCD_ShowString(20,10,tftlcd_data.width,tftlcd_data.height,16,"Press K_UP key to Enter...");
- delay_ms(200);
- LCD_ShowString(20,10,tftlcd_data.width,tftlcd_data.height,16," ");
- delay_ms(200);
- }
- TIM2_Init(50,8399);
- RTC_Config();
- RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);//配置WAKE UP中斷,1秒鐘中斷一次
- LCD_Clear(GRAY);
- show();//畫游戲界面
- play();//玩游戲
- }
復制代碼
所有程序:
8-貪吃蛇游戲.rar
(772.36 KB, 下載次數: 24)
2021-2-23 09:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|