- #include<reg52.h>
- #include<intrins.h>
- #include<stdlib.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define SHAKE 20//蛇的最大長度
- sbit SHANG=P3^4;
- sbit XIA=P3^5;
- sbit ZUO=P3^6;
- sbit YOU=P3^7;
- sbit dula=P2^6;
- sbit wela=P2^7;
- uchar code ly[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //P0控制y亮
- uchar code lx[]={0xfe,0xfd,0xfb,0xf7,0x7f,0xbf,0xdf,0xef};//P2控制x亮
- uchar xx[20]={0};//用來存蛇的x坐標
- uchar yy[20]={0};//用來存蛇的y坐標
- uchar length;//蛇的長度
- uchar direction;//蛇的方向
- uchar foodx,foody;
- void delay(uchar z)//延遲函數(shù)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- {
- for(y=110;y>0;y--)
- {};
- }
- }
- void close()//關掉數(shù)碼管
- {
- dula=1;
- P0=0x00;
- dula=0;
- }
- void init()//蛇的初始化
- {
- length=1;
- xx[0]=0;
- yy[0]=0;
- direction=2;
- }
- void move()//蛇的移動
- {
- uchar L=length-1;
- for(L;L>0;L--)
- {
- xx[L]=xx[L-1];
- yy[L]=yy[L-1];
- }
- switch(direction)//根據(jù)運動方向控制坐標
- {
- case 1:
- yy[0]++;
- break;
- case 2:
- yy[0]--;
- break;
- case 3:
- xx[0]--;
- break;
- case 4:
- xx[0]++;
- break;
- default:
- break;
- }
- }
- void keyword()//通過按鍵控制運動方向
- {
- if(SHANG==0)//上
- {
- delay(1000);
- if(SHANG==0)
- {
- if(direction==3|direction==4)
- direction=1;
- }
- while(!SHANG);
- }
-
- if(XIA==0)//下
- {
- delay(1000);
- if(XIA==0)
- {
- if(direction==3|direction==4)
- direction=2;
- }
- while(!XIA);
- }
-
- if(ZUO==0)//左
- {
- delay(1000);
- if(ZUO==0)
- {
- if(direction==1|direction==2)
- direction=3;
- }
- while(!ZUO);
- }
-
- if(YOU==0)//右
- {
- delay(1000);
- if(YOU==0)
- {
- if(direction==1|direction==2)
- direction=4;
- }
- while(!YOU);
- }
- }
- void food()//創(chuàng)造食物
- {
- uchar i;
- foodx=rand()%7;
- foody=rand()%7;
- for(i=0;i<length;i++)
- {
- if((xx[i]==foodx)&&(yy[i]==foody))
- {
- food();
- }
- }
- }
- void grow()//蛇的增長函數(shù)
- {
- if((xx[0]==foodx)&&(yy[0]==foody))
- {
- food();
- xx[length]=xx[length-1];
- yy[length]=yy[length-1];
- length++;
- }
- }
- void light()//點亮蛇和食物
- {
- uchar i;
- for(i=0;i<length;i++)
- {
- P2=lx[xx[i]];
- P0=ly[yy[i]];
-
- delay(10);
-
- P2=lx[foodx];
- P0=ly[foody];
-
- delay(10);
- }
- }
- void pick()//判斷蛇是否撞墻和撞到自己
- {
- uchar i;
- if(xx[0]>7||yy[0]>7)
- {
-
- while(1);
- }
-
- for(i=4;i<length;i++)
- {
- if(xx[0]==xx[i]&&yy[0]==yy[i])
- {
-
- while(1);
-
- };
- }
- }
- void main()
- {
- init();
- move();
- while(1)
- {
- close();
- light();
- food();
- pick();
- grow();
- keyword();
-
-
- }
- }
復制代碼 |