|
一套基于C51的12864貪吃蛇程序
截圖
單片機(jī)源程序如下:
- /*
- 貪食蛇程序
- 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;//存放頭尾數(shù)據(jù)的數(shù)組編號(hào)
- unsigned char front_dir,tail_dir;//頭尾移動(dòng)的方向
- unsigned char frontdat,taildat; //頭尾的段數(shù)
- char tail_x,tail_y,front_x,front_y;//頭尾的坐標(biāo)
- unsigned char food_x,food_y;//食物坐標(biāo)
- 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) //將分?jǐn)?shù)轉(zhuǎn)換為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)); //讀點(diǎn)是為了讓食物的點(diǎn)在蛇身之外
- power = rand()%2+1;
- time_speed = (250-speed*10)/power;
- LCD12864_Drawpoint(food_x,food_y,DISPLAY); //將點(diǎn)在12864顯示出來(lái)
- }
- //畫(huà)界面
- 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,"分?jǐn)?shù): ");
- LCD12864_String(0,1,scoreString);
- LCD12864_String(0,2,"稱號(hào): ");
- LCD12864_String(0,3,"小蝦米 ");
- for(i=LEFT_X;i<RIGHT_X;i++) //畫(huà)上下邊框
- {
- LCD12864_Drawpoint(i,TOP_Y,DISPLAY);
- LCD12864_Drawpoint(i,BOTTOM_Y,DISPLAY);
- }
- for(i=0;i<BOTTOM_Y;i++) //畫(huà)左右邊框
- {
- LCD12864_Drawpoint(LEFT_X,i,DISPLAY);
- LCD12864_Drawpoint(RIGHT_X,i,DISPLAY);
- }
-
- //畫(huà)蛇
- 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();
-
- }
- //游戲結(jié)束界面
- 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();
- }
- //稱號(hào)獲得
- 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,"大豆蟲(chóng) ");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;
- }
- }
- //畫(huà)出貪食蛇
- 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)) //判斷前進(jìn)方向上有無(wú)點(diǎn)
- {
- //判斷是否為食物
- 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();
- }
- }
-
- //畫(huà)頭
- 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;
- //重新獲取尾巴的段數(shù)和方向
- 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;
- }
- //手柄數(shù)據(jù)處理函數(shù)
- void MakeFCscan(unsigned char* stepArray,unsigned char* dirArray)
- {
- unsigned char fcdat;
- fcdat = FC_scan();
- //手柄有方向
- if(fcdat != 0)
- {
- //方向不與頭的行進(jìn)方向反向或相同
- if((fcdat != ~front_dir) && (fcdat != front_dir))
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
貪食蛇 2.0.zip
(68.71 KB, 下載次數(shù): 20)
2018-2-25 20:14 上傳
點(diǎn)擊文件名下載附件
|
|