|
|
利用51單片機(jī)設(shè)計(jì)經(jīng)典懷舊游戲貪吃蛇。
0.png (49.59 KB, 下載次數(shù): 31)
下載附件
2018-6-2 04:04 上傳
ILI9163液晶屏+單片機(jī)源程序如下:
- /**************************************************************************
- 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();
- }
- }
復(fù)制代碼- /***********************************************************************************
- /* 文件名稱: SNAKE.c
- /* 功 能: 貪吃蛇游戲代碼
- /* 署 名: 張先永(原作者)
- /* 時(shí) 間: 2009年10月11日
- /* 備 注:
- /* 游戲按鍵由于需要快速的響應(yīng),所有按鍵通過線與擴(kuò)展為中斷按鍵
- /* LCD 液晶顯示器在PO口 需要上拉電阻
- /***********************************************************************************/
- #include <reg52.H>
- #include <KEY_SWEEP.H>
- #include"9325tp.h"
- #include "SNAKE.h"
- #define uchar unsigned char
- //=================================================================
- // 使用結(jié)構(gòu)體定義變量 使程序的名稱更加的清楚
- //=================================================================
- struct
- {
- uchar X;
- uchar Y;
- uchar Yes;
- }Food; //食物結(jié)構(gòu)體
- #define SNAKE_Max_Long 20 //最大長度
- struct
- {
- uchar X[SNAKE_Max_Long];
- uchar Y[SNAKE_Max_Long];
- uchar Long;
- uchar Life;
- uchar Score; //蛇的分?jǐn)?shù)
- uchar Level; //蛇的等級(jí)
- }Snake; //蛇結(jié)構(gòu)體
- uchar Key_V_temp=0; //取出上次按鍵值
- //=================================================================
- //函數(shù)功能:1ms延時(shí)函數(shù)
- //晶 振:11.0592 M
- //入口參數(shù):n
- //出口參數(shù):無
- //=================================================================
- void Delay_1mS(unsigned int n)
- {
- unsigned int i;
- unsigned char j;
-
- for(i=0;i<n;i++)
- for(j=0;j<120;j++) ;
- }
- //=================================================================
- //函數(shù)名稱:void Init_time0 (void)
- //函數(shù)功能:初始化定時(shí)器1 用于產(chǎn)生隨機(jī)數(shù)種子 ,用于放置實(shí)物
- //入口參數(shù):無
- //出口參數(shù):無
- //=================================================================
- 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;
- }
- //=================================================================
- //函數(shù)名稱:Trun_On_Point Trun_Off_Point (uchar x,uchar y)
- //函數(shù)功能:點(diǎn)亮或者熄滅 一個(gè)點(diǎn)。用于顯示蛇身體
- //入口參數(shù):無
- //出口參數(shù):無
- //特別說明:此 Trun_On,函數(shù)換成其他的就可以兼容其他的液晶
- // 入8*8 點(diǎn)陣 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);
- }
- //=================================================================
- //函數(shù)名稱:void Init_SNAKE(void)
- //函數(shù)功能:繪制游戲界面,初始化游戲等級(jí)等參數(shù)
- //入口參數(shù):無
- //出口參數(shù):無
- //=================================================================
- void Init_SNAKE(void)
- {
- uchar i;
- Init_time0();
- //***********繪制游戲界面********************//
- CLR_Screen(0xBE5F);
- Rectangle(8,8-1,85,120,0xaa);//繪制一個(gè)矩形框, 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);
- //***********初始化蛇參數(shù)********************//
- 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);
- }
- }
- //=================================================================
- //函數(shù)名稱:void Display_dead(uchar i)
- //函數(shù)功能:顯示死亡界面
- //入口參數(shù):無
- //出口參數(shù):無
- //=================================================================
- void Display_dead(void)
- {
- LCD_PutString(10,40,"GAME OVER",0x00ff,0xBE5F);
- while(Key_Value!=Key_Enter)
- {
- Key();
- }
- Init_SNAKE();
- }
- //=================================================================
- //函數(shù)名稱:void Display_Pass(uchar i)
- //函數(shù)功能:顯示過關(guān)界面
- //入口參數(shù):無
- //出口參數(shù):無
- //=================================================================
- 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();
- }
- //=================================================================
- //函數(shù)名稱:void Run_SNAKE(void)
- //函數(shù)功能:蛇運(yùn)動(dòng)函數(shù) (游戲精華)
- //入口參數(shù):無
- //出口參數(shù):無
- //=================================================================
- void Run_SNAKE(void)
- {
- uchar i=0;
- /*********************根據(jù)按鍵選擇蛇的運(yùn)動(dòng)方向*******************/
- 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; //蛇頭向你要求的方向移動(dòng)
-
- for(i=0;i<Snake.Long;i++) //這個(gè)讓蛇顯示出來的函數(shù)
- {
- 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; //蛇頭向你要求的方向移動(dòng)
-
- for(i=0;i<Snake.Long;i++) //這個(gè)讓蛇顯示出來的函數(shù)
- {
- 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; //蛇頭向你要求的方向移動(dòng)
-
- for(i=0;i<Snake.Long;i++) //這個(gè)讓蛇顯示出來的函數(shù)
- {
- 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; //蛇頭向你要求的方向移動(dòng)
-
- for(i=0;i<Snake.Long;i++) //這個(gè)讓蛇顯示出來的函數(shù)
- {
- Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
- }
- Key_V_temp=Key_Down;
- }
-
- /****************根據(jù)按鍵選擇蛇的運(yùn)動(dòng)程序結(jié)束*******************/
- /////////////////////////////////////////////////////////////////
-
- /************************判斷蛇是否死亡***********************/
- if(Snake.X[Snake.Long-1]>=19||Snake.Y[Snake.Long-1]>=28)//判蛇頭是否撞到墻壁
- {
- Snake.Life=1;
- }
- for(i=3;i<Snake.Long;i++)//從第三節(jié)開始判斷蛇頭是否咬到自己
- {
- 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();
- }
- /******************判斷蛇是否死亡程序結(jié)束***********************/
- /////////////////////////////////////////////////////////////////
- /************************判斷蛇是否最長了**********************/
- 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++;//蛇節(jié)數(shù)加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; //食物標(biāo)志置1
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
2.4 貪吃蛇實(shí)驗(yàn).rar
(186.78 KB, 下載次數(shù): 26)
2018-6-1 09:36 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|