无聊写了个贪吃蛇程序,用了stc89c52作为MCU,MAX7219点阵屏用于显示,TM1637数码管模块用于记分。
虽然说游戏只有8*8的显示;但是极其好玩。
制作出来的实物图如下:
单片机源程序如下:
- #include "max7219.h"
- #include "reg52.h"
- #include "stdlib.h"
- #include "TM1637.h"
- #define u8 unsigned char
- #define u16 unsigned int
- u16 POINT;
- void Tanchishe_Init();
- void Write_She();
- void Move_She();
- bit Game_Over();
- u8 Key();
- void Create_Food();
- bit Eat_food();
- u8 start();
- u8 Last_X;
- u8 Last_Y;
- u8 S_Config;
- struct Snake
- {
- u8 direct;//方向 0上 1下 2左 3右
- u8 x_Snake[30]; //0为蛇头
- u8 y_Snake[30]; //0为蛇尾
- u8 lenth;//长度
- u8 Food_X;//食物X
- u8 Food_Y;//食物Y
- }snake;
- void main()
- {
- // u8 jx;
- P2=0xff;
-
- Init_MAX7219();
- TM1637_display(POINT%10000/1000,POINT%1000/100,POINT%100/10,POINT%10,0);
- while(1)
- {
- put();
- Tanchishe_Init();
- S_Config=start();
- POINT=0;
- CLR();
- Write_She();
- Write_All();
- Delay_xms(500);
-
- while(!Game_Over())
- {
- u8 HYM;
- u8 p=S_Config;
- Move_She();
- if(Eat_food())
- {
- Create_Food();
- POINT++;
- }
- TM1637_display(POINT%10000/1000,POINT%1000/100,POINT%100/10,POINT%10,0);
- CLR();
- Write_She();
- Write_All();
- while(p--)
- {
- HYM=Key();
- if(HYM!=4)
- {
- snake.direct=HYM;
- }
- Delay_xms(2);
- }
- }
- //for(jx=1;jx<9;jx++)
- //{
- // Write_Max7219(jx,0xff);
- //}
- }
- //while(1);
- }
- u8 Key()
- {
- u8 h;
- switch(P2&0xf0)
- {
- case 0x70:
- if(snake.direct!=1)
- {h=0;}
- else
- {h=4;}
- break;
- case 0xb0:
- if(snake.direct!=0)
- {h=1;}
- else
- {h=4;}
- break;
- case 0xd0:if(snake.direct!=3){h=2;}else{h=4;}break;
- case 0xe0:if(snake.direct!=2){h=3;}else{h=4;}break;
- default:h=4;break;
- }
- return h;
- }
- void Tanchishe_Init()
- {
- snake.direct=3;
- snake.x_Snake[0]=4;
- snake.y_Snake[0]=2;
- snake.x_Snake[1]=4;
- snake.y_Snake[1]=3;
- snake.x_Snake[2]=4;
- snake.y_Snake[2]=4;
- snake.lenth=3;
- }
- void Write_She()
- {
- int i;
- for(i=0;i<snake.lenth;i++)
- {
- Write_A_Dot(snake.x_Snake[i],snake.y_Snake[i]);
- }
- Write_A_Dot(snake.Food_X,snake.Food_Y);
- }
- void Move_She()
- {
- u8 i=snake.lenth-1;
- Last_X=snake.x_Snake[i];
- Last_Y=snake.y_Snake[i];
- switch(snake.direct)
- {
- case 0:
- while(i>0)
- {
- snake.x_Snake[i]=snake.x_Snake[i-1];
- snake.y_Snake[i]=snake.y_Snake[i-1];
- i--;
- }
- snake.y_Snake[0]++;
- snake.y_Snake[0]%=8;
- break;
- case 1:
- while(i>0)
- {
- snake.x_Snake[i]=snake.x_Snake[i-1];
- snake.y_Snake[i]=snake.y_Snake[i-1];
- i--;
- }
- snake.y_Snake[0]--;
- snake.y_Snake[0]%=8;
- break;
- case 2:
- while(i>0)
- {
- snake.x_Snake[i]=snake.x_Snake[i-1];
- snake.y_Snake[i]=snake.y_Snake[i-1];
- i--;
- }
- snake.x_Snake[0]--;
- snake.x_Snake[0]%=8;
- break;
- case 3:
- while(i>0)
- {
- snake.x_Snake[i]=snake.x_Snake[i-1];
- snake.y_Snake[i]=snake.y_Snake[i-1];
- i--;
- }
- snake.x_Snake[0]++;
- snake.x_Snake[0]%=8;
- break;
- }
- }
- void Create_Food()
- {
- u16 x,y;
- u8 j;
- bit flag=0;
- x=rand()/4096;
- y=rand()/4096;
- for(j=0;j<snake.lenth;j++)
- {
- if(snake.x_Snake[j]==x&&snake.y_Snake[j]==y)
- {
- flag=1;
- break;
- }
- }
- if(flag)
- {
- Create_Food();
- }
- else
- {
- snake.Food_X=x;
- snake.Food_Y=y;
- }
- }
- bit Eat_food()
- {
- if(snake.Food_X==snake.x_Snake[0]&&snake.Food_Y==snake.y_Snake[0])
- {
- snake.x_Snake[snake.lenth]=Last_X;
- snake.y_Snake[snake.lenth]=Last_Y;
- snake.lenth++;
- return 1;
- }
- else
- {
- return 0;
- }
- }
- bit Game_Over()
- {
- u8 j;
- for(j=1;j<snake.lenth;j++)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
超级贪吃蛇.zip
(31.71 KB, 下载次数: 55)
|