|
51贪吃蛇点阵
单片机源程序如下:
- #include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include<intrins.h>
- #include<math.h>
- #include<stdio.h>
- #include<stdlib.h>
- //72,80,75,77是方向键对应的键值
- #define UP 5
- #define DOWN 6
- #define LEFT 7
- #define RIGHT 8
- #define SANKE 1 //蛇的坐标标识
- #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};
- //初始化蛇头坐标
- unsigned char snack[20] = {27};
- //初始化食物坐标
- unsigned char food = 17;
- //蛇长
- char len = 1;
- // 存储坐标数字与x,y的转化函数
- void tran(unsigned char num,unsigned char *x,unsigned char *y);
- //打印游戏
- void print_game(void);
- // 获取方向函数(注意当蛇身超过一节时不能回头)
- int get_dir(int old_dir);
- //移动蛇身函数
- void move_snack(int dir);
- //生产食物的函数
- unsigned char generate_food(void);
- //判断蛇死活的函数
- int isalive(void);
- //移动蛇身函数
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(unsigned int i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函数名 : Hc595SendByte(u8 dat)
- * 函数功能 : 向74HC595发送一个字节的数据
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- 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;
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- 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;
- }
- }
- }
- //存储坐标数字与x,y的转换函数
- 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;
- }
- //生产食物的函数
- 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_;
- }
- //获取方向的函数
- int get_dir(int old_dir)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
|
|