一套基于C51的12864贪吃蛇程序
单片机源程序如下:
- /*
- 贪食蛇程序
- 2016年10月6日20:02:37
- */
- #include "reg52.h"
- #include "lcd12864.h"
- #include "FC.H"
- #include "stdlib.h"
- #define snake_UP 0x01
- #define snake_DOWN 0xfe
- #define snake_LEFT 0x02
- #define snake_RIGHT 0xfd
- #define snakeInitLength 2
- #define snakeInitSideX 70
- #define snakeInitSideY 30
- #define snakeInitDir snake_RIGHT
- #define arraysize 100
- #define LEFT_X 63
- #define TOP_Y 0
- #define RIGHT_X 127
- #define BOTTOM_Y 63
- unsigned char xdata stepArray[arraysize]={0};
- unsigned char xdata dirArray[arraysize]={0};
- unsigned char front_array,tail_array;//存放头尾数据的数组编号
- unsigned char front_dir,tail_dir;//头尾移动的方向
- unsigned char frontdat,taildat; //头尾的段数
- char tail_x,tail_y,front_x,front_y;//头尾的坐标
- unsigned char food_x,food_y;//食物坐标
- unsigned int score=0;
- unsigned int time_speed;
- unsigned char scoreString[5]={0};
- unsigned char flag_food=0,flag_skip=0;
- unsigned int speed = 1;
- unsigned char power = 1;
- void toString(unsigned char* str) //将分数转换为ask码的形式
- {
-
- str[0] = score/1000+0x30;
- str[1] = score%1000/100+0x30;
- str[2] = score%100/10+0x30;
- str[3] = score%10+0x30;
- }
- //生成食物
- void CreateFood()
- {
-
- do
- {
- food_x = rand ()%LEFT_X+LEFT_X+1;
- food_y = rand ()%(BOTTOM_Y-1);
- }while(LCD12864_Readpoint(food_x,food_y)); //读点是为了让食物的点在蛇身之外
- power = rand()%2+1;
- time_speed = (250-speed*10)/power;
- LCD12864_Drawpoint(food_x,food_y,DISPLAY); //将点在12864显示出来
- }
- //画界面
- void drawGUI()
- {
- unsigned char i=0;
- LCD12864_String(0,0," ");
- LCD12864_String(0,1," ");
- LCD12864_String(0,2," ");
- LCD12864_String(0,3," ");
-
-
- toString(scoreString);
- LCD12864_String(0,0,"分数: ");
- LCD12864_String(0,1,scoreString);
- LCD12864_String(0,2,"称号: ");
- LCD12864_String(0,3,"小虾米 ");
- for(i=LEFT_X;i<RIGHT_X;i++) //画上下边框
- {
- LCD12864_Drawpoint(i,TOP_Y,DISPLAY);
- LCD12864_Drawpoint(i,BOTTOM_Y,DISPLAY);
- }
- for(i=0;i<BOTTOM_Y;i++) //画左右边框
- {
- LCD12864_Drawpoint(LEFT_X,i,DISPLAY);
- LCD12864_Drawpoint(RIGHT_X,i,DISPLAY);
- }
-
- //画蛇
- for(i=0;i<snakeInitLength;i++)
- {
- LCD12864_Drawpoint(i+snakeInitSideX,snakeInitSideY,DISPLAY);
- }
- //食物
- do
- {
- food_x = rand ()%LEFT_X+LEFT_X+1;
- food_y = rand ()%(BOTTOM_Y-1);
- }while(LCD12864_Readpoint(food_x,food_y));
- //power = rand()%2+1;
- time_speed = (250-speed*10);
- LCD12864_Drawpoint(food_x,food_y,DISPLAY);
- }
- //初始化
- void Snake_Init()
- {
-
- score = 0;
- flag_food=0;
- flag_skip=0;
-
- speed = 1;
- power = 1;
- front_x = snakeInitSideX + snakeInitLength - 1;
- front_y = snakeInitSideY;
- tail_x = snakeInitSideX;
- tail_y = snakeInitSideY;
- stepArray[0] = snakeInitLength;
- dirArray[0] = snakeInitDir;
- tail_array = front_array = 0;
- time_speed = (250-speed*10)/power;
- front_dir = dirArray[0];
- tail_dir = dirArray[0];
- frontdat = stepArray[0];
- taildat = stepArray[0];
- drawGUI();
-
- }
- //游戏结束界面
- void GAMEOVER()
- {
- LCD12864_clearGDR();
- toString(scoreString);
- LCD12864_String(0,0," ");
- LCD12864_String(0,1," ");
- LCD12864_String(0,2," ");
- LCD12864_String(0,3," ");
-
- LCD12864_String(0,0," GAME OVER ");
- LCD12864_String(0,1," SCROE: ");
- LCD12864_String(5,1,scoreString);
- LCD12864_String(0,2," START ");
-
- while(1)
- {
- if(FC_ReadDATA() == FC_START) break;
- }
- Snake_Init();
- }
- //称号获得
- void LEVEL_Name()
- {
- switch (score)
- {
- case 0 : LCD12864_String(0,3,"小虾米 ");speed =1;
- break;
- case 4 : LCD12864_String(0,3,"大虾米 ");speed =2;
- break;
- case 8 : LCD12864_String(0,3,"大豆虫 ");speed =3;
- break;
- case 12: LCD12864_String(0,3,"小青蛇 ");speed =4;
- break;
- case 20: LCD12864_String(0,3,"青蛇 ");speed =5;
- break;
- case 40: LCD12864_String(0,3,"白蛇精 ");speed =6;
- break;
- case 80: LCD12864_String(0,3,"白素贞 ");speed =7;
- break;
- case 160:LCD12864_String(0,3,"蛇界食神");speed =8;
- break;
- case 320 : LCD12864_String(0,3,"小白龙 ");speed =9;
- break;
- case 640:LCD12864_String(0,3,"逆天白龙 ");speed =10;
- break;
- case 1000:LCD12864_String(0,3,"通天神龙");speed =11;
- break;
- default:
- break;
- }
- }
- //画出贪食蛇
- void drawSnake(unsigned char* stepArray,unsigned char* dirArray)
- { ``````````
-
- switch (front_dir)
- {
- case snake_UP : front_y--;if(front_y<(TOP_Y+1))front_y = (BOTTOM_Y-1);
- break;
- case snake_DOWN : front_y++;if(front_y>(BOTTOM_Y-1))front_y = (TOP_Y+1);
- break;
- case snake_LEFT : front_x--;if(front_x< (LEFT_X+1))front_x = (RIGHT_X-1);
- break;
- case snake_RIGHT: front_x++;if(front_x>(RIGHT_X-1))front_x = (LEFT_X+1);
- break;
- default:
- break;
- }
- frontdat = stepArray[front_array];
- frontdat++;
- frontdat = frontdat%128;
- stepArray[front_array] = frontdat;
-
- //判断是食物还是自己身体
- if(LCD12864_Readpoint(front_x,front_y)) //判断前进方向上有无点
- {
- //判断是否为食物
- if((front_x==food_x)&&(front_y==food_y))
- {
- flag_food = 1;
- score++;
-
- toString(scoreString);
- LCD12864_String(0,1,scoreString);
- LEVEL_Name();
- }
- else
- {
- flag_food = 0;
- GAMEOVER();
- }
- }
-
- //画头
- LCD12864_Drawpoint(front_x,front_y,DISPLAY);
-
-
- //消尾
- if(flag_skip == 0)
- {
-
- LCD12864_Drawpoint(tail_x,tail_y,NOTDISPLAY);
- taildat = stepArray[tail_array];
- taildat--;
-
- if(taildat == 0)
- {
- tail_array++;
- tail_array %= arraysize;
- //重新获取尾巴的段数和方向
- taildat = stepArray[tail_array];
- tail_dir = dirArray[tail_array];
-
- };
- stepArray[tail_array] = taildat;
- switch (tail_dir)
- {
- case snake_UP : tail_y--;if(tail_y<(TOP_Y+1))tail_y = (BOTTOM_Y-1);
- break;
- case snake_DOWN : tail_y++;if(tail_y>(BOTTOM_Y-1))tail_y = (TOP_Y+1);
- break;
- case snake_LEFT : tail_x--;if(tail_x<(LEFT_X+1))tail_x = (RIGHT_X-1);
- break;
- case snake_RIGHT: tail_x++;if(tail_x>(RIGHT_X-1))tail_x = (LEFT_X+1);
- break;
-
- }
- if(flag_food==1)
- {
- //判断前面是食物
- if((front_x==food_x)&&(front_y==food_y))
- {
- flag_food = 0;
-
- flag_skip = 1;
- CreateFood();
- }
-
- }
- }else flag_skip = 0;
- }
- //FC手柄扫描
- unsigned char FC_scan()
- {
- unsigned char dat;
- dat = FC_ReadDATA();
-
- if(dat != 0xff)
- {
-
- if((dat&~FC_UP) ==0) return snake_UP;
- if((dat&~FC_DOWN)==0) return snake_DOWN;
- if((dat&~FC_LEFT)==0) return snake_LEFT;
- if((dat&~FC_RIGHT)==0) return snake_RIGHT;
- }
- return 0;
- }
- //手柄数据处理函数
- void MakeFCscan(unsigned char* stepArray,unsigned char* dirArray)
- {
- unsigned char fcdat;
- fcdat = FC_scan();
- //手柄有方向
- if(fcdat != 0)
- {
- //方向不与头的行进方向反向或相同
- if((fcdat != ~front_dir) && (fcdat != front_dir))
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
贪食蛇 2.0.zip
(68.71 KB, 下载次数: 20)
|