|
部分代碼:
#include<reg52.h>
#include "lcd_driver.h"
#include "gui.h"
#include "touch.h"
typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
u8 snake_long = 5;//蛇開始長度
u8 snake_x[20] = {14,11,8,5,2};//蛇的開始位置
u8 snake_y[20] = {2,2,2,2,2};
u8 food_x[100] = {10,10,15,16,27,34,21,23,15,17,11,13,20,16,16,30,42,36,45,67,41,35,27};
u8 food_y[100] = {24,26,5,17,4,20,4,4,6,22,4,6,7,2,1,31,15,45,18,32,44,63,12,46};
u8 score = 0;
sbit beep=P1^4;
sbit IRIN=P3^2;
u8 IrValue[6];
u8 Time;
u8 t;
u8 ki;
void oppencarton();//開機(jī)動畫
void overcarton();//游戲結(jié)束
void delay(u16 i);//延時子程序
void Snake_go();//把蛇前點(diǎn)的位置賦給蛇的后點(diǎn)
void Snake_turn();//蛇轉(zhuǎn)彎指令
void dead(); //顯示死后的得分和結(jié)束動畫
void eating();//蛇頭與食物是否重合判斷
void DisDigplay();//顯示
void gameover();//死亡判斷
void IrInit();//紅外初始化
void select();//判斷顯示的得分
void delay(u16 i)
{
while(i--);
}
void IrInit()
{
IT0=1;//下降沿觸發(fā)
EX0=1;//打開中斷0允許
EA=1; //打開總中斷
IRIN=1;//初始化端口
}
void oppencarton()
{
u16 i=0;
for(i;i<5;i++)
{
GUI_Write32CnChar(1,1,"歡",RED,BLUE);
GUI_Write32CnChar(145,1,"迎",RED,BLUE);
GUI_Write32CnChar(1,75,"來",RED,BLUE);
GUI_Write32CnChar(145,75,"到",RED,BLUE);
GUI_Write32CnChar(75,120,"貪",RED,BLUE);
GUI_Write32CnChar(1,190,"吃",RED,BLUE);
GUI_Write32CnChar(145,190,"蛇",RED,BLUE);
}
}
void overcarton()
{
u16 i=0;
for(i;i<5;i++)
{
GUI_Write32CnChar(1,1,"結(jié)",RED,BLUE);
GUI_Write32CnChar(115,1,"結(jié)",RED,BLUE);
GUI_Write32CnChar(1,190,"結(jié)",RED,BLUE);
GUI_Write32CnChar(115,190,"結(jié)",RED,BLUE);
GUI_Write32CnChar(33,1,"束",RED,BLUE);
GUI_Write32CnChar(148,1,"束",RED,BLUE);
GUI_Write32CnChar(33,190,"束",RED,BLUE);
GUI_Write32CnChar(148,190,"束",RED,BLUE);
TFT_ClearScreen(BLACK);
}
}
void Snake_go() //把后一個點(diǎn)的坐標(biāo)覆蓋在前一個坐標(biāo)上或指令的方向
{
u8 i;
for(i = 1; i < snake_long;i++)
{
snake_x[snake_long - i] = snake_x[snake_long - i - 1];
snake_y[snake_long - i] = snake_y[snake_long - i - 1];
}
}
/*蛇轉(zhuǎn)彎*/
void Snake_turn()
{
switch(IrValue[2])
{
case 0x45: //進(jìn)入游戲默向右走--開機(jī)鍵
Snake_go();
if(snake_x[0] == 70)// snake_x[0]為蛇頭
snake_x[0] = 0;
else
snake_x[0] = snake_x[0]+3;//蛇向右走由1-》2 x軸向右移
DisDigplay();//顯示蛇和食物
break;
case 0x18: //向上走--2
Snake_go();
if(snake_y[0] == 0)
snake_y[0] = 70;
else
snake_y[0] = snake_y[0]-3;
DisDigplay();//顯示蛇和食物
break;
case 0x52: //向下走--8
Snake_go();
if(snake_y[0] == 70)
snake_y[0] = 0;
else
snake_y[0] = snake_y[0]+3;
DisDigplay();//顯示蛇和食物
break;
case 0x08: //向左走--4
Snake_go();
if(snake_x[0] == 0)
snake_x[0] = 70;
else
snake_x[0] = snake_x[0]-3;
DisDigplay();//顯示蛇和食物
break;
case 0x5a: //向右走--6
Snake_go();
if(snake_x[0] == 70)
snake_x[0] = 0;
else
snake_x[0] = snake_x[0]+3;
DisDigplay();//顯示蛇和食物
break;
default:break;
}
}
/*發(fā)生碰撞*/
void dead()
{
u8 i;
i=1;
for(i;i<snake_long;i++)
if(((snake_x[0] == snake_x[i])||(snake_x[0] == snake_x[i]+1)||(snake_x[0] == snake_x[i]-1))&&((snake_y[0] == snake_y[i])||(snake_y[0] == snake_y[i]+1)||(snake_y[0] == snake_y[i]-1)))
{
gameover();
}
}
void feel() //觸屏?xí)和?br />
{
uchar temp=0;
if(TOUCH_XPT_ReadXY() == 1)
{
while(1)
{
if(temp==0)
TFT_ClearScreen(CYAN);
temp=1;
if(TOUCH_XPT_ReadXY() == 1)
{
temp=0;
TFT_ClearScreen(BLACK);
break;
}
}
}
}
void gameover()
{
select();
select();
select();
TFT_ClearScreen(CYAN);
overcarton();
ki++;
}
/*吃豆豆*/
void eating()
{
if(((snake_x[0] == food_x[snake_long - 2])||(snake_x[0] == food_x[snake_long - 2]-1)||(snake_x[0] == food_x[snake_long - 2]+1)) && ((snake_y[0] == food_y[snake_long - 2])||(snake_y[0] == food_y[snake_long - 2]+1)||(snake_y[0] == food_y[snake_long - 2]-1)))
{
snake_long++;
delay(10);
beep = ~beep;
score++;
}
}
void select()
{
if(score == 0)
GUI_WriteASCII(120, 170, "0", CYAN, BLACK);
else if(score == 1)
GUI_WriteASCII(120, 170, "1", CYAN, BLACK);
else if(score == 2)
GUI_WriteASCII(120, 170, "2", CYAN, BLACK);
else if(score == 3)
GUI_WriteASCII(120, 170, "3", CYAN, BLACK);
else if(score == 4)
GUI_WriteASCII(120, 170, "4", CYAN, BLACK);
else if(score == 5)
GUI_WriteASCII(120, 170, "5", CYAN, BLACK);
else if(score == 6)
GUI_WriteASCII(120, 170, "6", CYAN, BLACK);
else if(score == 7)
GUI_WriteASCII(120, 170, "7", CYAN, BLACK);
}
void DisDigplay()//顯示蛇和食物
{
u8 i;
for(i = 0;i < snake_long;i++)
{
GUI_Dot(snake_x[i],snake_y[i],RED);//蛇點(diǎn)
GUI_Dot(food_x[snake_long - 2],food_y[snake_long - 2],BLUE);//食物點(diǎn)
GUI_Write32CnChar(50, 170, "得分", CYAN, BLACK);
select();
}
GUI_Dot(snake_x[snake_long-1],snake_y[snake_long-1],BLACK);
}
void main()
{
TFT_Init();
IrInit();
TFT_ClearScreen(BLACK);
oppencarton();
TFT_ClearScreen(BLACK);
while(1)
{
Snake_turn();
eating();
dead();
feel();
}
}
void ReadIr() interrupt 0
{
u8 j,k;
u16 err;
Time=0;
delay(700); //7ms
if(IRIN==0) //確認(rèn)是否真的接收到正確的信號
{
err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
/*當(dāng)兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
侯,程序死在這里*/
while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
{
delay(1);
err--;
}
if(IRIN==1) //如果正確等到9ms低電平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
{
delay(1);
err--;
}
for(k=0;k<4;k++) //共有4組數(shù)據(jù)
{
for(j=0;j<8;j++) //接收一組數(shù)據(jù)
{
err=60;
while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //計(jì)算高電平的時間長度。
{
delay(10); //0.1ms
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1; //k表示第幾組數(shù)據(jù)
if(Time>=8) //如果高電平出現(xiàn)大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0; //用完時間要重新賦值
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
|
|