📄 game.c
字号:
#include <REG52.H>
#include "12864.h"
#include "asc.h"
#define uchar unsigned char
#define uint unsigned int
sbit P00 =P0^0;
sbit P01 =P0^1;
sbit P02 =P0^2;
sbit P03 =P0^3;
sbit P04 =P0^4;
#define RIGHT 1
#define LIFT 2
#define UP 3
#define DOWN 4
bit ESC=1; //开始 暂停标志位
bit START=1; //重新开始标志位
bit M_LEVEL=0; //显示难度标志位
bit hero=0; //完成游戏
unsigned char gamespeed=20;//游戏速度调节
unsigned char level=1; //难度
unsigned char code s[]="--ByTang";
unsigned char s1[]="1";
struct Food
{
uchar x;/*食物的横坐标*/
uchar y;/*食物的纵坐标*/
uchar yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
uchar x[39];
uchar y[39];
uchar node;/*蛇的节数*/
uchar direction;/*蛇移动方向*/
uchar life;/* 蛇的生命,0活着,1死亡*/
}snake;
int rand(void){ int i; i = ((TH0<<8)|TL0)&0x7fff; return(i);} //随机数产生
void delay(unsigned char m) //10毫秒
{
unsigned char i,j,k;
while(m--)
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
/* 键扫描函数 */
void KeyScan()
{
P0=0xff;
if(P00==0)
if(snake.direction!=LIFT)
snake.direction=RIGHT;
if(P01==0)
if(snake.direction!=RIGHT)
snake.direction=LIFT;
if(P02==0)
if(snake.direction!=DOWN)
snake.direction=UP;
if(P03==0)
if(snake.direction!=UP)
snake.direction=DOWN;
if(P04==0)
ESC=~ESC;
}
/*游戏结束*/
void GameOver(void)
{
ClearLCD();
hz_disp(3,25,4,youxijieshu,1);
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=9;snake.y[0]=33;/*蛇头*/
snake.x[1]=6;snake.y[1]=33;
snake.node=2;/*节数*/
START=1;
}
void GamePlay(void)
{
uchar i;
while(1)
{
EA=1;
gamespeed=20;
level=1;
s1[0]='1';
while(ESC==0)
{
EA=1;
if(START==1) //重新开始否
{
ClearLCD();
hz_disp(3,40,2,nandu,1);
en_disp(3,80,1,Asc,s1,1);
delay(150);
ClearLCD();
Rect(5,5,123,60,1);
START=0;
}
if(snake.node%10==0 && food.yes==1) //加大难度
{
level+=1;
switch(level)
{
case 2:
s1[0]='2';
gamespeed=15;
break;
case 3:
s1[0]='3';
gamespeed=10;
break;
case 4:
s1[0]='4';
gamespeed=5;
break;
}
M_LEVEL=1;
}
if(M_LEVEL==1) //加大难度显示
{
START=1;
M_LEVEL=0;
}
if(snake.node==39)
{
ESC=1;
hero=1;
break;
}
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%114+6;
food.y=rand()%51+6;
while(food.x%3!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%3!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
RectArea(food.x,food.y,food.x+2,food.y+2,1);
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=3;break;
case 2: snake.x[0]-=3;break;
case 3: snake.y[0]-=3;break;
case 4: snake.y[0]+=3;break;
}
for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
snake.life=1;
break;
}
}
if(snake.x[0]<6||snake.x[0]>120||snake.y[0]<6||snake.y[0]>57)/*蛇是否撞到墙壁*/
snake.life=1; /*蛇死*/
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
{
ESC=1;
GameOver();/*本次游戏结束*/
break;
}
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
/*把画面上的食物东西去掉*/
RectArea(food.x,food.y,food.x+2,food.y+2,0);
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
}
/*画出蛇*/
for(i=0;i<snake.node;i++)
RectArea(snake.x[i],snake.y[i],snake.x[i]+2,snake.y[i]+2,1);
if(snake.direction==1)
Dot(snake.x[0]+2,snake.y[0]+1,0);
if(snake.direction==2)
Dot(snake.x[0],snake.y[0]+1,0);
if(snake.direction==3)
Dot(snake.x[0]+1,snake.y[0],0);
if(snake.direction==4)
Dot(snake.x[0]+1,snake.y[0]+2,0);
delay(gamespeed); //速度设置
/*去除蛇的的最后一节*/
RectArea(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+2,snake.y[snake.node-1]+2,0);
}//EDN while(!ESC)
if(hero)
{
ClearLCD();
img12864_disp(wancheng);
hz_disp(0,110,1,xie,1);
hz_disp(2,110,1,xie,1);
hz_disp(4,110,1,shi,1);
hz_disp(6,110,1,wan,1);
hz_disp(6,20,4,tangwei,1);
break;
}
}
}
/*--------------------------------------------------------------*/
void int_0(void) interrupt 0
{
EA=0;
KeyScan();
}
void snake_init()
{
EX0=1; //开中断
IT0=1; //设置电平触发方式
EA=1; //开所有中断
TMOD=0x01;
TH0=65536/256;
TL0=65536%256;
TR0=1;
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=9;snake.y[0]=33;/*蛇头*/
snake.x[1]=6;snake.y[1]=33;
snake.node=2;/*节数*/
img_disp(0,0,64,64,kaijitu); //开机画面
hz_disp(2,70,3,tanchishe,1);
en_disp(6,65,8,Asc,s,1);
}
void main (void)
{
LCD12864_init();
ClearLCD();
snake_init();
GamePlay();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -