当前位置:文档之家› 51单片机贪吃蛇

51单片机贪吃蛇

#include
#include

#define KEY P2
#define MAX_LENGTH 33
#define RIGEH 1
#define DOWN 2
#define LEFT 3
#define UP 4

//--定义全局变量--//
bit live=0;
bit start=0;
bit foodexist=0;
unsigned char BT3,BT2,BT1,BT0;
unsigned char SnakeBodyLength;
unsigned char direct;
unsigned char firstx,firsty,lastx,lasty;
unsigned char foodx,foody;
unsigned char speed;

//--定义数组--//
unsigned char code table0[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
unsigned char code table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
unsigned char code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
unsigned char code table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};

unsigned char Snakex[MAX_LENGTH];
unsigned char Snakey[MAX_LENGTH];


//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;

//--全局函数声明--//
void HC595SendData(unsigned char BT3,unsigned char BT2,unsigned char BT1,unsigned char BT0); //点阵输入函数
void Snakemove(); //蛇移动
void DrawSnake(); //显示蛇
void DrawFood(); //显示食物
void CreatFood(); //产生食物
void Keyscanf(); //扫描键盘
void SnakeDeathCheck(); //死亡检测
void SnakeGrow(); //蛇生长
void GameInit(); //游戏初始化
void GameOver(); //游戏结束
void Delay10ms(unsigned int c); //延迟函数

void Keyscanf()
{
unsigned char keyValue = 0 , i;

if (KEY != 0xff)
{
Delay10ms(1);

if (KEY != 0xff)
{
keyValue = KEY;
i = 0;
while ((i<50) && (KEY != 0xff))
{
Delay10ms(1);
i++;
}
}
}

switch (keyValue)
{
case(0xbf):direct=4;break;

case(0xf7):direct=3;break;

case(0xfb):direct=2;break;

case(0xfd):direct=1;break;

case(0xef):start=1;break;
}
}

void GameOver()
{
HC595SendData(0xff,0xff,0,0);
}

void SnakeDeathCheck()
{
unsigned char i;

for(i=1;i{
if((Snakex[0]==Snakex[i]) && (Snakey[0]==Snakey[i]))
{
live=0;
}
}
}


void SnakeGrow()
{
if((Snakex[0]==foodx) && (Snakey[0]==foody))
{
SnakeBodyLength++;
foodexist=0;

Snakex[SnakeBodyLength-1]=lastx;
Snakey[SnakeBodyLength-1]=lasty;
}
}

void GameInit()
{
live=1;
SnakeBodyLength=4;
direct=1;

Snakex[0]=9;
Snakey[0]=9;
Snakex[1]=8;
Snakey[1]=9;
Snakex[2]=7;
Snakey[2]=9;
Snakex[3]=6;
Snakey[3]=9;
DrawSnake();
if(foodexist==0)
{
CreatFood();
}
DrawFood();
}

void DrawSnake()
{
char i;

for(i=SnakeBodyLength-1;i>=0;i--)
{
switch(Snakey[i])
{
case(1):BT0=table0[0],BT1=table1[8];break;
case(2):BT0=table0[1],BT1=table1[8];break;
case(3):BT0=table0[2],BT1=table1[8];break;
case(4):BT0=table0[3],BT1=table1[8];break;
case(5):BT0=table0[4],BT1=table1[8];break;
case(6):BT0=ta

ble0[5],BT1=table1[8];break;
case(7):BT0=table0[6],BT1=table1[8];break;
case(8):BT0=table0[7],BT1=table1[8];break;
case(9):BT0=table0[8],BT1=table1[0];break;
case(10):BT0=table0[8],BT1=table1[1];break;
case(11):BT0=table0[8],BT1=table1[2];break;
case(12):BT0=table0[8],BT1=table1[3];break;
case(13):BT0=table0[8],BT1=table1[4];break;
case(14):BT0=table0[8],BT1=table1[5];break;
case(15):BT0=table0[8],BT1=table1[6];break;
case(16):BT0=table0[8],BT1=table1[7];break;
}

switch(Snakex[i])
{
case(1):BT2=table2[0],BT3=table3[8];break;
case(2):BT2=table2[1],BT3=table3[8];break;
case(3):BT2=table2[2],BT3=table3[8];break;
case(4):BT2=table2[3],BT3=table3[8];break;
case(5):BT2=table2[4],BT3=table3[8];break;
case(6):BT2=table2[5],BT3=table3[8];break;
case(7):BT2=table2[6],BT3=table3[8];break;
case(8):BT2=table2[7],BT3=table3[8];break;
case(9):BT2=table2[8],BT3=table3[0];break;
case(10):BT2=table2[8],BT3=table3[1];break;
case(11):BT2=table2[8],BT3=table3[2];break;
case(12):BT2=table2[8],BT3=table3[3];break;
case(13):BT2=table2[8],BT3=table3[4];break;
case(14):BT2=table2[8],BT3=table3[5];break;
case(15):BT2=table2[8],BT3=table3[6];break;
case(16):BT2=table2[8],BT3=table3[7];break;

}

HC595SendData(BT3,BT2,BT1,BT0);
}
}



void CreatFood()
{
unsigned int i,j;

i=rand()%16+1;
j=rand()%16+1;

foodx=i;
foody=j;

foodexist=1;
}


void DrawFood()
{
//if(foodexist==1)
//{
switch(foody)
{
case(1):BT0=table0[0],BT1=table1[8];break;
case(2):BT0=table0[1],BT1=table1[8];break;
case(3):BT0=table0[2],BT1=table1[8];break;
case(4):BT0=table0[3],BT1=table1[8];break;
case(5):BT0=table0[4],BT1=table1[8];break;
case(6):BT0=table0[5],BT1=table1[8];break;
case(7):BT0=table0[6],BT1=table1[8];break;
case(8):BT0=table0[7],BT1=table1[8];break;
case(9):BT0=table0[8],BT1=table1[0];break;
case(10):BT0=table0[8],BT1=table1[1];break;
case(11):BT0=table0[8],BT1=table1[2];break;
case(12):BT0=table0[8],BT1=table1[3];break;
case(13):BT0=table0[8],BT1=table1[4];break;
case(14):BT0=table0[8],BT1=table1[5];break;
case(15):BT0=table0[8],BT1=table1[6];break;
case(16):BT0=table0[8],BT1=table1[7];break;

}

switch(foodx)
{
case(1):BT2=table2[0],BT3=table3[8];break;
case(2):BT2=table2[1],BT3=table3[8];break;
case(3):BT2=table2[2],BT3=table3[8];break;
case(4):BT2=table2[3],BT3=table3[8];break;
case(5):BT2=table2[4],BT3=table3[8];break;
case(6):BT2=table2[5],BT3=table3[8];break;
case(7):BT2=table2[6],BT3=table3[8];break;
case(8):BT2=table2[7],BT3=table3[8];break;
case(9):BT2=table2[8],BT3=table3[0];break;
case(10):BT2=table2[8],BT3=table3[1];break;
case(11):BT2=table2[8],BT3=table3[2];break;
case(12):BT2=table2[8],BT3=table3[3];break;
case(13):BT2=table2[8],BT3=table3[4];break;
ca

se(14):BT2=table2[8],BT3=table3[5];break;
case(15):BT2=table2[8],BT3=table3[6];break;
case(16):BT2=table2[8],BT3=table3[7];break;
}

HC595SendData(BT3,BT2,BT1,BT0);
//}
}

void Delay10ms(unsigned char c)
{
unsigned char a, b;

for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}

}
}

void Snakemove()
{
int i;

if(direct==RIGEH)
{
firstx=Snakex[0];
firsty=Snakey[0];
lastx=Snakex[SnakeBodyLength-1];
lasty=Snakex[SnakeBodyLength-1];

Snakex[0]=Snakex[0]+1;
Snakey[0]=Snakey[0];

for(i=SnakeBodyLength-1;i>0;i--)
{
if(i>=2)
{
Snakex[i]=Snakex[i-1];
Snakey[i]=Snakey[i-1];
}
else if(i==1)
{
Snakex[i]=firstx;
Snakey[i]=firsty;
}
}
}
else if(direct==DOWN)
{
firstx=Snakex[0];
firsty=Snakey[0];
lastx=Snakex[SnakeBodyLength-1];
lasty=Snakex[SnakeBodyLength-1];

Snakex[0]=Snakex[0];
Snakey[0]=Snakey[0]+1;

for(i=SnakeBodyLength-1;i>0;i--)
{
if(i>=2)
{
Snakex[i]=Snakex[i-1];
Snakey[i]=Snakey[i-1];
}
else if(i==1)
{
Snakex[i]=firstx;
Snakey[i]=firsty;
}
}
}
else if(direct==LEFT)
{
firstx=Snakex[0];
firsty=Snakey[0];
lastx=Snakex[SnakeBodyLength-1];
lasty=Snakex[SnakeBodyLength-1];

Snakex[0]=Snakex[0]-1;
Snakey[0]=Snakey[0];

for(i=SnakeBodyLength-1;i>0;i--)
{
if(i>=2)
{
Snakex[i]=Snakex[i-1];
Snakey[i]=Snakey[i-1];
}
else if(i==1)
{
Snakex[i]=firstx;
Snakey[i]=firsty;
}
}
}
else if(direct==UP)
{
firstx=Snakex[0];
firsty=Snakey[0];
lastx=Snakex[SnakeBodyLength-1];
lasty=Snakex[SnakeBodyLength-1];

Snakex[0]=Snakex[0];
Snakey[0]=Snakey[0]-1;

for(i=SnakeBodyLength-1;i>0;i--)
{
if(i>=2)
{
Snakex[i]=Snakex[i-1];
Snakey[i]=Snakey[i-1];
}
else if(i==1)
{
Snakex[i]=firstx;
Snakey[i]=firsty;
}
}
}
}


void main(void)
{
char i;

BT0=0x00;
BT1=0x00;
BT2=0xff;
BT3=0xff;

GameInit();
Keyscanf();

while(start)
{
while(live)
{
if(foodexist==0)
{
CreatFood();
}

Keyscanf();
Snakemove();
SnakeGrow();
for(speed=10;speed>0;speed--)
{
for(i=10000;i>0;i--)
{
DrawSnake();
DrawFood();
Keyscanf();
}
}
SnakeDeathCheck();
}
}
GameOver();
}



void HC595SendData(unsigned char BT3,unsigned char BT2,unsigned char BT1,unsigned char BT0)
{
unsigned char i;


for(i=0;i<8;i++)
{
MOSIO = BT3 >> 7 ;
BT3 <<= 1;

S_CLK = 0;
S_CLK = 1;
}


for(i=0;i<8;i++)
{
MOSIO = BT2 >>7;
BT2 <<= 1;

S_CLK = 0;
S_CLK = 1;
}


for(i=0;i<8;i++)
{
MOSIO = BT1 >> 7;
BT1 <<= 1;
S_CLK = 0;
S_CLK = 1;
}


for(i=0;i<8;i++)
{
MOSIO = BT0 >> 7;
BT0 <<= 1;
S_CLK = 0;
S

_CLK = 1;
}


R_CLK = 0;
R_CLK = 1;
R_CLK = 0;
}




相关主题
文本预览
相关文档 最新文档