⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.c

📁 单片机12864贪吃蛇程序
💻 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 + -