|
51貪吃蛇點(diǎn)陣
單片機(jī)源程序如下:
- #include "reg51.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include<intrins.h>
- #include<math.h>
- #include<stdio.h>
- #include<stdlib.h>
- //72,80,75,77是方向鍵對(duì)應(yīng)的鍵值
- #define UP 5
- #define DOWN 6
- #define LEFT 7
- #define RIGHT 8
- #define SANKE 1 //蛇的坐標(biāo)標(biāo)識(shí)
- #define FOOD 1
- #define BAR 0
- sbit SRCLK=P3^6;
- sbit RCLK=P3^5;
- sbit SER=P3^4;
- //按鍵
- sbit Left = P3^1;
- sbit Right = P3^0;
- sbit Up = P3^2;
- sbit Down = P3^3;
- unsigned int NLL=1;
- //u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
- unsigned char ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- //初始化地圖17*17
- unsigned char map[8][8] ={0};
- //初始化蛇頭坐標(biāo)
- unsigned char snack[20] = {27};
- //初始化食物坐標(biāo)
- unsigned char food = 17;
- //蛇長(zhǎng)
- char len = 1;
- // 存儲(chǔ)坐標(biāo)數(shù)字與x,y的轉(zhuǎn)化函數(shù)
- void tran(unsigned char num,unsigned char *x,unsigned char *y);
- //打印游戲
- void print_game(void);
- // 獲取方向函數(shù)(注意當(dāng)蛇身超過一節(jié)時(shí)不能回頭)
- int get_dir(int old_dir);
- //移動(dòng)蛇身函數(shù)
- void move_snack(int dir);
- //生產(chǎn)食物的函數(shù)
- unsigned char generate_food(void);
- //判斷蛇死活的函數(shù)
- int isalive(void);
- //移動(dòng)蛇身函數(shù)
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
- *******************************************************************************/
- void delay(unsigned int i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函數(shù)名 : Hc595SendByte(u8 dat)
- * 函數(shù)功能 : 向74HC595發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void Hc595SendByte(unsigned char dat)
- {
- unsigned char a;
- SRCLK=0;
- RCLK=0;
- for(a=0;a<8;a++)
- {
- SER=dat>>7;
- dat<<=1;
- SRCLK=1;
- _nop_();
- _nop_();
- SRCLK=0;
- }
- RCLK=1;
- _nop_();
- _nop_();
- RCLK=0;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- int dir = UP,n,i=1;
- while(1)
- {
- move_snack(dir);
- for(n=0;n<50;n++)
- {
- print_game();
- dir = get_dir(dir);
- }
- if(!isalive())
- {
- break;
- }
- }
-
- }
- void print_game(void)
- {
- int i,j;
- unsigned int zhi=0;
- for(i = 0;i < 8;i ++)
- {
- zhi = 0;
- for(j = 0;j < 8;j ++)
- {
- if(map[i][j] == 1)
- {
- zhi=zhi+(0x01<<j);
- }
- }
- P0=ledwei[i]; //位選
- Hc595SendByte(zhi);
- delay(100);
- Hc595SendByte(0x00);
-
- }
-
- }
- void move_snack(int dir)
- {
- int last = snack[0],current;
- int i,j;
- int grow = 0;
- unsigned char x,y,fx,fy;
- tran(food,&fx,&fy);
- tran(snack[0],&x,&y);
- switch(dir)
- {
- case UP:
- y++;
- break;
- case DOWN:
- y--;
- break;
- case LEFT:
- x--;
- break;
- case RIGHT:
- x++;
- break;
- }
- // snack[0] = ((x ^ 0) << 4) ^ y;
- snack[0] = x*8+y;
- //蛇吃到食物
- if(snack[0] == food)
- {
- grow = 1;
- food = generate_food();
- }
-
- for(i = 0;i < len;i ++)
- {
- if(i == 0)
- continue;
- current = snack[i];
- snack[i] = last;
- last = current;
- }
- if(grow)
- {
- snack[len] = last;
- len++;
- }
- for(j = 0;j < 8; j ++)
- {
- for(i = 0;i < 8;i ++)
- {
- if(i == 0 || i == 7 || j == 0 || j == 7)
- {
- map[i][j] = 1;
- }
- else if(i == fx && j == fy)
- {
- map[i][j] = 1;
- }
- else
- {
- map[i][j] = 0;
- }
-
-
- }
- }
- for(i = 0;i < len;i ++)
- {
- tran(snack[i],&x,&y);
- if(snack[i] > 0)
- {
- map[x][y] = SANKE;
- }
- }
- }
- //存儲(chǔ)坐標(biāo)數(shù)字與x,y的轉(zhuǎn)換函數(shù)
- void tran(unsigned char num,unsigned char *x,unsigned char *y)
- {
- // *x = num >> 4;
- // *y = (unsigned char)(num << 4 ) >> 4;
- *x = num / 8;
- *y = num % 8;
- }
- //生產(chǎn)食物的函數(shù)
- unsigned char generate_food(void)
- {
- unsigned char food_,fx,fy;
- unsigned int in_snack=0,i;
- // srand((unsigned int)time(NULL));
- srand(NLL);
- do
- {
- NLL++;
- in_snack=0;
- food_ = rand() % 64;
- tran(food_,&fx,&fy);
- for(i = 0;i < len;i ++)
- {
- if(food_ == snack[i])
- {
- in_snack = 1;
- }
- }
- }while(fx == 0 || fx == 7 || fy == 0 || fy == 7 || in_snack);
-
- return food_;
- }
- //獲取方向的函數(shù)
- int get_dir(int old_dir)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
|
-
-
單片機(jī)貪吃蛇.zip
2018-12-25 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
51.13 KB, 下載次數(shù): 22, 下載積分: 黑幣 -5
-
-
貪吃蛇.docx
2018-12-25 13:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
59.47 KB, 下載次數(shù): 7, 下載積分: 黑幣 -5
-
-
HC6800-ES V2.0 新版.pdf
2018-12-25 13:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
759.71 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5
|