普中51单片机的贪吃蛇教程

时间:2025-03-07 12:16:33
  • #include <>
  • #include <>
  • #include <>
  • #include ""
  • #include ""
  • typedef unsigned int u16;
  • typedef unsigned char u8;
  • sbit up=P3^1;
  • sbit down=P3^0;
  • sbit lt=P3^2;
  • sbit rt=P3^3;
  • u8 coordx[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,};
  • u8 coordy[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,};
  • u8 foodx;
  • u8 foody;
  • u8 snake_x[20]={0};
  • u8 snake_y[20]={0};
  • u8 length;
  • u8 direction;
  • void initsnake();
  • void Keyboard();
  • void move();
  • void creatfood();
  • void snakegrow(void);
  • void drawsnake();
  • void initsnake()//蛇的初始化
  • {
  • snake_x[0]=0;//1
  • snake_y[0]=0;//1
  • length=1;
  • direction=2;
  • }
  • void move()//移动
  • {
  • u8 len=length-1;//u16,漏-1
  • for (len;len>0;len--)
  • {
  • snake_x[len]=snake_x[len-1];
  • snake_y[len]=snake_y[len-1];
  • }
  • switch(direction)//case不加()
  • {
  • case 1:
  • snake_y[0]--;
  • break;
  • case 2:
  • snake_y[0]++;
  • break;
  • case 3:
  • snake_x[0]--;
  • break;
  • case 4:
  • snake_x[0]++;
  • break;
  • default:
  • break;
  • }
  • }
  • void Keyboard()//按钮
  • {
  • if(up==0)
  • {
  • Delay(10);//避免
  • if(up==0)
  • {
  • direction=1;
  • }
  • while(!up);//!up,原up==1
  • }
  • if(down==0)
  • {
  • Delay(10);
  • if(down==0)
  • {
  • direction=2;
  • }
  • while(!down);//!down
  • }
  • if(lt==0)
  • {
  • Delay(10);
  • if(lt==0)
  • {
  • direction=3;
  • }
  • while(!lt);//改
  • }
  • if(rt==0)
  • {
  • Delay(10);
  • if(rt==0)
  • {
  • direction=4;
  • }
  • while(!rt);//改
  • }
  • }
  • void creatfood()//食物创造
  • {
  • u8 i;//u16
  • foodx=rand()%8;
  • foody=rand()%8;
  • for(i=0; i<length; i++)
  • {
  • if((foodx==snake_x[i])&&(foody==snake_y[i]))//括号运算优先级
  • {
  • creatfood();
  • }
  • }
  • }
  • void snakegrow()//吃食物后增厂长
  • {
  • if(foody==snake_y[0]&&foodx==snake_x[0])
  • {
  • creatfood();
  • snake_x[length]=snake_x[length-1];
  • snake_y[length]=snake_y[length-1];
  • length++;
  • }
  • }
  • void drawsnake()//调佣mtrixled来绘制蛇和食物
  • {
  • u8 i;//u16
  • for(i=0;i<length;i++)//应该是小于length
  • {
  • MatrixLED_ShowColumn(coordy[snake_y[i]],coordx[snake_x[i]]);
  • MatrixLED_ShowColumn(coordy[foody],coordx[foodx]);
  • }
  • }
  • void judgedeath()//判断死亡
  • {
  • u8 i;//u16
  • if((snake_x[0]>7)||(snake_y[0]>7))
  • {
  • _74H595_WriteByte(0x00);//MatrixLED_ShowColumn(0x00,0xff);//清屏
  • while(1);
  • }
  • for(i=4; i<length;i++)
  • {
  • if((snake_x[0]==snake_x[i])&&(snake_y[0]==snake_y[i]))
  • {
  • P0=0xFF;//MatrixLED_ShowColumn(0x00,0xff);
  • while(1);
  • }
  • }
  • }
  • void Timer0Init()
  • {
  • TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  • TH0=0XD8; //给定时器赋初值,定时10ms
  • TL0=0XF0;
  • ET0=1;//打开定时器0中断允许
  • EA=1;//打开总中断
  • TR0=1;//打开定时器
  • }
  • void Timer0() interrupt 1
  • {
  • static u16 i;
  • TH0=0XD8; //给定时器赋初值,定时10ms
  • TL0=0XF0;
  • i++;
  • if(i==50)
  • {
  • i=0;
  • move();
  • }
  • }
  • void main()
  • {
  • Timer0Init();
  • initsnake();
  • while (1)
  • {
  • drawsnake();
  • judgedeath();
  • snakegrow();
  • Keyboard();
  • }
  • }