利用51單片機設計經典懷舊游戲貪吃蛇。
0.png (49.59 KB, 下載次數: 31)
下載附件
2018-6-2 04:04 上傳
ILI9163液晶屏+單片機源程序如下:
- /**************************************************************************
- mini80 或者 mini80E 按鍵,上 s6,下 s14,左 s11, 右 s9, s4 重新開始
- 可以按照自己需要重新定義鍵盤掃描程序中的值,在key_sweep.h 中
- ****************************************************************************/
- #include "reg52.h"
- #include "KEY_SWEEP.H"
- #include "SNAKE.h"
- #include "9325tp.h"
- //=========================================主程序========================================//
- main()
- {
- ILI9325_Initial();
- Init_SNAKE();
- while(1)
- {
- Run_SNAKE();
- Key();
- }
- }
復制代碼- /***********************************************************************************
- /* 文件名稱: SNAKE.c
- /* 功 能: 貪吃蛇游戲代碼
- /* 署 名: 張先永(原作者)
- /* 時 間: 2009年10月11日
- /* 備 注:
- /* 游戲按鍵由于需要快速的響應,所有按鍵通過線與擴展為中斷按鍵
- /* LCD 液晶顯示器在PO口 需要上拉電阻
- /***********************************************************************************/
- #include <reg52.H>
- #include <KEY_SWEEP.H>
- #include"9325tp.h"
- #include "SNAKE.h"
- #define uchar unsigned char
- //=================================================================
- // 使用結構體定義變量 使程序的名稱更加的清楚
- //=================================================================
- struct
- {
- uchar X;
- uchar Y;
- uchar Yes;
- }Food; //食物結構體
- #define SNAKE_Max_Long 20 //最大長度
- struct
- {
- uchar X[SNAKE_Max_Long];
- uchar Y[SNAKE_Max_Long];
- uchar Long;
- uchar Life;
- uchar Score; //蛇的分數
- uchar Level; //蛇的等級
- }Snake; //蛇結構體
- uchar Key_V_temp=0; //取出上次按鍵值
- //=================================================================
- //函數功能:1ms延時函數
- //晶 振:11.0592 M
- //入口參數:n
- //出口參數:無
- //=================================================================
- void Delay_1mS(unsigned int n)
- {
- unsigned int i;
- unsigned char j;
-
- for(i=0;i<n;i++)
- for(j=0;j<120;j++) ;
- }
- //=================================================================
- //函數名稱:void Init_time0 (void)
- //函數功能:初始化定時器1 用于產生隨機數種子 ,用于放置實物
- //入口參數:無
- //出口參數:無
- //=================================================================
- void Init_time0 (void)
- {
- EA=1;
- ET1=1;
- TMOD|=0x10;
- TH1=0X00;
- TL1=0X00;
- TR1=1;
- }
- void time1 (void) interrupt 3
- {
- TH1=0X00;
- TL1=0X00;
- }
- //=================================================================
- //函數名稱:Trun_On_Point Trun_Off_Point (uchar x,uchar y)
- //函數功能:點亮或者熄滅 一個點。用于顯示蛇身體
- //入口參數:無
- //出口參數:無
- //特別說明:此 Trun_On,函數換成其他的就可以兼容其他的液晶
- // 入8*8 點陣 12864 等
- //=================================================================
- void Trun_On_Point (uchar x,uchar y,uchar color)
- {
- Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color);
- }
- void Trun_Off_Point (uchar x,uchar y)
- {
- Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),0xBE5F);
- }
- //=================================================================
- //函數名稱:void Init_SNAKE(void)
- //函數功能:繪制游戲界面,初始化游戲等級等參數
- //入口參數:無
- //出口參數:無
- //=================================================================
- void Init_SNAKE(void)
- {
- uchar i;
- Init_time0();
- //***********繪制游戲界面********************//
- CLR_Screen(0xBE5F);
- Rectangle(8,8-1,85,120,0xaa);//繪制一個矩形框, 0-127
- LCD_PutString(88,8,"Score",0x00ff,0xBE5F);
- LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
- LCD_PutString(88,81,"LEVEL",0x00ff,0xBE5F);
- LCDShow_uCharNumber(96,97,Snake.Level,0x00ff,0xBE5F);
- //***********初始化蛇參數********************//
- Snake.Long=2; //定義初始化蛇的長度
- Snake.Life=0; //初始化蛇還活著
- Snake.Score=0;
- Food.Yes=1;
- Key_Value=0;
- Key_V_temp=0;
- for(i=0;i<Snake.Long;i++) //將蛇給賦值
- {
- Snake.X[i]=i+2;
- Snake.Y[i]=2;
- }
- for(i=0;i<Snake.Long;i++) //將蛇給畫出來
- {
- Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
- }
- }
- //=================================================================
- //函數名稱:void Display_dead(uchar i)
- //函數功能:顯示死亡界面
- //入口參數:無
- //出口參數:無
- //=================================================================
- void Display_dead(void)
- {
- LCD_PutString(10,40,"GAME OVER",0x00ff,0xBE5F);
- while(Key_Value!=Key_Enter)
- {
- Key();
- }
- Init_SNAKE();
- }
- //=================================================================
- //函數名稱:void Display_Pass(uchar i)
- //函數功能:顯示過關界面
- //入口參數:無
- //出口參數:無
- //=================================================================
- void Display_Pass(void)
- {
- Snake.Level++;
- LCD_PutString(18,40,"You are",0xcc88,0xBE5F);
- LCD_PutString(34,56,"WIN!",0xcc88,0xBE5F);
- while(Key_Value!=Key_Enter)
- {
- Key();
- }
- Init_SNAKE();
- }
- //=================================================================
- //函數名稱:void Run_SNAKE(void)
- //函數功能:蛇運動函數 (游戲精華)
- //入口參數:無
- //出口參數:無
- //=================================================================
- void Run_SNAKE(void)
- {
- uchar i=0;
- /*********************根據按鍵選擇蛇的運動方向*******************/
- if((Key_Value==Key_Right&&Key_V_temp!=Key_Left)||(Key_Value==Key_Left&&Key_V_temp==Key_Right))
- {
- Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾給熄滅掉
- for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
- {
- Snake.X[i]=Snake.X[i+1];
- Snake.Y[i]=Snake.Y[i+1];
- }
- Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;
- Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇頭向你要求的方向移動
-
- for(i=0;i<Snake.Long;i++) //這個讓蛇顯示出來的函數
- {
- Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
- }
- Key_V_temp=Key_Right;
- }
- if((Key_Value==Key_Left&&Key_V_temp!=Key_Right)||(Key_Value==Key_Right&&Key_V_temp==Key_Left))
- {
- Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾給熄滅掉
-
- for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
- {
- Snake.X[i]=Snake.X[i+1];
- Snake.Y[i]=Snake.Y[i+1];
- }
-
- Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;
- Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇頭向你要求的方向移動
-
- for(i=0;i<Snake.Long;i++) //這個讓蛇顯示出來的函數
- {
- Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
- }
- Key_V_temp=Key_Left;
- }
- if(( Key_Value==Key_Up&&Key_V_temp!=Key_Down)||( Key_Value==Key_Down&&Key_V_temp==Key_Up))
- {
- Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾給熄滅掉
-
- for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
- {
- Snake.X[i]=Snake.X[i+1];
- Snake.Y[i]=Snake.Y[i+1];
- }
-
- Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
- Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //蛇頭向你要求的方向移動
-
- for(i=0;i<Snake.Long;i++) //這個讓蛇顯示出來的函數
- {
- Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
- }
- Key_V_temp=Key_Up;
- }
- if(( Key_Value==Key_Down&&Key_V_temp!=Key_Up)||( Key_Value==Key_Up&&Key_V_temp==Key_Down))
- {
- Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾給熄滅掉
-
- for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
- {
- Snake.X[i]=Snake.X[i+1];
- Snake.Y[i]=Snake.Y[i+1];
- }
-
- Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
- Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //蛇頭向你要求的方向移動
-
- for(i=0;i<Snake.Long;i++) //這個讓蛇顯示出來的函數
- {
- Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
- }
- Key_V_temp=Key_Down;
- }
-
- /****************根據按鍵選擇蛇的運動程序結束*******************/
- /////////////////////////////////////////////////////////////////
-
- /************************判斷蛇是否死亡***********************/
- if(Snake.X[Snake.Long-1]>=19||Snake.Y[Snake.Long-1]>=28)//判蛇頭是否撞到墻壁
- {
- Snake.Life=1;
- }
- for(i=3;i<Snake.Long;i++)//從第三節開始判斷蛇頭是否咬到自己
- {
- if(Snake.X[i]==Snake.X[0]&&Snake.Y[i]==Snake.Y[0])
- {
- Snake.Life=1;
- }
- }
- if(Snake.Life==1) //if the snake over
- {
-
- Display_dead();
- }
- /******************判斷蛇是否死亡程序結束***********************/
- /////////////////////////////////////////////////////////////////
- /************************判斷蛇是否最長了**********************/
- if(Snake.Long==SNAKE_Max_Long)
- {
-
- Display_Pass();
- }
- /////////////////////////////////////////////////////////////////
- /*************************判蛇是否吃到食物**********************/
- if(Snake.X[Snake.Long-1]==Food.X&&Snake.Y[Snake.Long-1]==Food.Y)//
- {
- //Trun_Off_Point(Food.X,Food.Y); //消隱食物
- Snake.Long++;//蛇節數加1
- Snake.X[Snake.Long-1]=Food.X;
- Snake.Y[Snake.Long-1]=Food.Y;
- Snake.Score+=10;
- LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
- Food.Yes=1; //食物標志置1
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
2.4 貪吃蛇實驗.rar
(186.78 KB, 下載次數: 26)
2018-6-1 09:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|