無聊寫了個貪吃蛇程序,用了stc89c52作為MCU,MAX7219點陣屏用于顯示,TM1637數碼管模塊用于記分。
雖然說游戲只有8*8的顯示;但是極其好玩。
制作出來的實物圖如下:
51hei圖片_20201107001030.jpg (74.9 KB, 下載次數: 31)
下載附件
2020-11-7 00:14 上傳
51hei圖片_20201107001038.jpg (82.26 KB, 下載次數: 34)
下載附件
2020-11-7 00:14 上傳
單片機源程序如下:
- #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)
2020-11-7 00:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|