|
制作出來的貪吃蛇游戲機實物圖如下:
IMG_20190420_175150.jpg (262.6 KB, 下載次數(shù): 93)
下載附件
2019-12-26 02:07 上傳
原理圖.png (120.79 KB, 下載次數(shù): 90)
下載附件
原理圖
2019-12-23 14:53 上傳
單片機源程序如下:
- #include"snake.h"
- #include<stdlib.h>
- #include"key.h"
- #include"display.h"
- #include"main.h"
- #include"delay.h"
- ///////////////////////////////////////////////
- /////////////// 貪吃蛇 ////////////////
- ///////////////////////////////////////////////
- void setDir(u8 *dir_1,u8 *dir_2,u8 value){
- *dir_1 = 0;
- *dir_2 = value;
- }
- void setHead(u8 *z,u8 dir){
- *z+=dir;
- if(*z == -1)*z = 7;
- else if(*z == 8)*z = 0;
- }
- void moveSnakeXY(u8 *snakeXY,const u8 num,const u8 XY){
- u8 i = 0;
- while(i<num-1){
- snakeXY[i] = snakeXY[i+1];
- i++;
- }
- snakeXY[i] = XY;
- }
- void changeLED(u8 (*led)[LED_WIDTH],const u8 *x,const u8 *y,u8 num,u8 apx,u8 apy){
- int i = 0;
- cleanLED(led);
- while(i < num){
- led[y[i]][x[i]] = 1;
- i++;
- }
- led[apy][apx] = 1;
- }
- void randXY(u8 *x,u8 *y,u8 (*led)[LED_WIDTH],u8 t){
- srand(t);
- do{
- *x = rand()%8;
- *y = rand()%8;
- }while(led[*y][*x]); //若這個點上面為1,則繼續(xù),直到這個點上面為空
- led[*y][*x] = 1;
- }
- void showDegree(u8 degree){
- u8 i,j;
- for(i = 0;i<LED_HEIGHT;i++)
- for(j = 0;j<=degree;j++)
- setPoint(j,i);
- }
- u8 Snake(void){
- #define BLOCKNUM 64 //蛇身數(shù)組大小
- u8 degree = 0,snakeNum = 1,dirX = 1,dirY = 0,dirOX,dirOY; //難度等級,當前蛇身長度,方向變量
- u8 LED[LED_HEIGHT][LED_WIDTH];//界面顯示矩陣
- u8 headX = 0,headY = 0,appleX,appleY; //蛇頭位置變量 食物位置變量
- u8 t,time; //移動速度控制變量
- u8 r = 0;
- //蛇身位置數(shù)組
- u8 snakeX[BLOCKNUM];
- u8 snakeY[BLOCKNUM];
- while(1){ //難度選擇
- showDegree(degree);
- if(keySelect())
- if(degree<7)degree++;
- else degree = 0;
- else if(keyStart())break;
- }
- time = 100-degree*10;//延時長度
- cleanLED(LED);//清屏
- LED[headY][headX] = 1;//顯示蛇頭
- //將蛇頭保存到數(shù)組第一位
- snakeX[0] = headX;
- snakeY[0] = headY;
- //運動方向初始化
- dirOX = dirX;
- dirOY = dirY;
- //隨機食物出現(xiàn)的位置
- randXY(&appleX,&appleY,LED,t);
- t = 0;
- while(1){
- /*
- 游戲主循環(huán)
- */
- display(LED);//顯示
- // //按鍵操作檢測,防止多余的按鍵判斷,獲取最近一次的方向
- if(dirY!=-1 && (keyUP()||keyY()))setDir(&dirX,&dirY,-1);
- else if(dirY!=1 &&(keyDOWN()||keyA()))setDir(&dirX,&dirY,1);
- else if(dirX!=-1 &&(keyLEFT()||keyX()))setDir(&dirY,&dirX,-1);
- else if(dirX!=1 &&(keyRIGHT()||keyB()))setDir(&dirY,&dirX,1);
-
- //暫停
- if(keyStart())
- while(!keyStart())
- display(LED);
-
- /*
- 每隔一定時間進行移動
- 以下代碼功能為移動判斷與移動操作
- */
- r++;//時間種子
- if(t++ >time){ //間隔性的移動
- t = 0;
- if((dirX!=0 && dirOX ==0)||(dirY!=0 && dirOY==0)){//合法方向輸入引用
- dirOX = dirX;
- dirOY = dirY;
- }
- setHead(&headX,dirOX); //按照合法的輸入方向提前運動一次
- setHead(&headY,dirOY);
- if(headY == appleY && headX == appleX){ //若蛇頭運行的下一位是食物
- //數(shù)組加長
- snakeNum++;
- snakeX[snakeNum-1] = appleX;
- snakeY[snakeNum-1] = appleY;
- //下一個蘋果
- randXY(&appleX,&appleY,LED,r);
- }else if(!LED[headY][headX]){ //若前方為無障礙物
- //前方無障礙
- moveSnakeXY(snakeX,snakeNum,headX);
- moveSnakeXY(snakeY,snakeNum,headY);
- }else if(headX == snakeX[0]&& headY == snakeY[0]){//
- moveSnakeXY(snakeX,snakeNum,headX);
- moveSnakeXY(snakeY,snakeNum,headY);
- }else { //若前方有障礙物體,則觸發(fā)蜂鳴器并返回錯誤值
- return GAMEOVER;
- }
- changeLED(LED,snakeX,snakeY,snakeNum,appleX,appleY);//顯示矩陣刷新
- }
- }
- return GAMEOVER;//游戲結(jié)束,返回錯誤信息
- }
復制代碼
所有資料51hei提供下載:
自制貪吃蛇游戲機資料.7z
(80.24 KB, 下載次數(shù): 38)
2019-12-26 02:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|