日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

光立方实现3D贪吃蛇

發(fā)布時間:2023/12/9 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 光立方实现3D贪吃蛇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這段代碼是貪吃蛇的核心代碼,一般貪吃蛇只有4個方向,這個是6個方向也就是3D的。

蛇能自己移動,用函數(shù)Snake_Move和Change_Direction實現(xiàn)。

我使用的是STC12C5A60S2,所以要更改的,只有以LED開頭的函數(shù)

只要能實現(xiàn)一個點亮指定位置(x,y,z)燈的函數(shù)Led_Set_Bit

/****************************************************************************** * 文 件: Snake.c * 作 者: ZhnJa * 修改日期: 2013-7-10 * 說 明: 貪吃蛇相關(guān) ******************************************************************************/ #include "MyType.h" #include "LED_CMD.H" #include "snake.h" #include "STC12C5A60S2.h" #include <stdlib.h>#define WidthMax 4 //蛇最寸高度 #define HeightMax 4 //蛇最大長度 #define LengthMax 4 //蛇最大長度 #define MaxLength 20 //總長度#define Up 6 #define Down 5 #define Left 4 #define Right 3 #define For 2 #define Rea 1typedef struct _Food //食物結(jié)構(gòu)體 {uchar x;/*食物的橫坐標(biāo)*/uchar y;/*實物的縱坐標(biāo)*/uchar z;/*實物的z坐標(biāo)*/uchar yes;/*是否出現(xiàn)食物的標(biāo)志,0表示未產(chǎn)生,1表示產(chǎn)生*/ }Food;/*食物*/typedef struct _Point //點結(jié)構(gòu)體 {uchar x;uchar y;uchar z; }Point;typedef struct _Snake {uchar x[MaxLength]; //蛇身節(jié)點的橫坐標(biāo)uchar y[MaxLength]; //蛇身節(jié)點的縱坐標(biāo)uchar z[MaxLength]; //蛇節(jié)點uchar node;/*蛇長度*/uchar direction;/*蛇移動方向*/uchar life;/*蛇是否存活標(biāo)志,0死亡,1存活,2表示暫停*/ }Snake;xdata Snake snake={{1,2,3},{1,1,1},{1,1,1},3,Up,1}; xdata Food food={1,4,4}; //食物 Point TailPoint;//存放蛇尾巴節(jié)點的臨時變量 Point NextPoint;//存放蛇下一次移動的位置/******************************************** * 蛇初始化 *參數(shù): *功能: *********************************************/ void Init_Snake() {unsigned char i;for(i=0;i<=2;i++)LED_Set_Bit(snake.x[i],snake.y[i],snake.z[i]);LED_Set_Bit(food.x,food.y,food.z); } /******************************************** * 蛇移動函數(shù) *參數(shù):無 *功能:刪除最后一個節(jié)點,點亮下一個節(jié)點 *********************************************/ uchar Snake_Move() {uchar i;TailPoint.x=snake.x[0]; //保存蛇尾TailPoint.y=snake.y[0];TailPoint.z=snake.z[0];for(i=0;i<snake.node-1;i++) //依次向尾部方向移動蛇各個節(jié)點的坐標(biāo){snake.x[i]=snake.x[i+1];snake.y[i]=snake.y[i+1];snake.z[i]=snake.z[i+1];} switch(snake.direction){case Up:{snake.z[snake.node-1]+=1;break;}case Down:{snake.z[snake.node-1]-=1;break;}case Left:{snake.x[snake.node-1]-=1;break;}case Right:{snake.x[snake.node-1]+=1;break;}case For:{snake.y[snake.node-1]+=1;break;}case Rea:{snake.y[snake.node-1]-=1;break;}}LED_Reset_Bit(TailPoint.x,TailPoint.y,TailPoint.z);LED_Set_Bit(snake.x[snake.node-1],snake.y[snake.node-1],snake.z[snake.node-1]);return 1; }bit IsLive() {uchar i=0;//計算下一個點NextPoint.x=snake.x[snake.node-1];NextPoint.y=snake.y[snake.node-1];NextPoint.z=snake.z[snake.node-1];switch(snake.direction){case Up:{NextPoint.z+=1;break;}case Down:{NextPoint.z-=1;break;}case Left:{NextPoint.x-=1;break;}case Right:{NextPoint.x+=1;break;}case For:{NextPoint.y+=1;break;}case Rea:{NextPoint.y-=1;break;}}//判斷蛇有沒有撞到自身for(i=0;i<=snake.node-1;i++){if((snake.x[i]==NextPoint.x)&&(snake.y[i]==NextPoint.y)&&(snake.z[i]==NextPoint.z)){snake.life=0;return 0;break;}}//判斷蛇有沒有撞到墻if(NextPoint.x>=1&&NextPoint.x<=4&&NextPoint.y>=1&&NextPoint.y<=4&&NextPoint.z>=1&&NextPoint.z<=4)return 1; else {snake.life=0;return 0;} }bit Change_Direction() {uchar olddir=snake.direction; if(snake.x[snake.node-1] < food.x)snake.direction = Right;else if(snake.x[snake.node-1] > food.x)snake.direction = Left;else if(snake.y[snake.node-1] <food.y)snake.direction = For;else if(snake.y[snake.node-1] > food.y)snake.direction = Rea;else if(snake.z[snake.node-1] > food.z)snake.direction = Down;else if(snake.z[snake.node-1] < food.z)snake.direction = Up; return 1; }//功能:吃食并且產(chǎn)生下一個實物的坐標(biāo)//返回值:1表示吃到食物,0表示未吃到食物 bit EatFood(void) {uchar i;if(((snake.x[snake.node-1])==food.x)&&((snake.y[snake.node-1])==food.y)&&(snake.z[snake.node-1]==food.z)) //如果吃到食物{for(i=snake.node;i>0;i--) //依次向頭部方向移動蛇各個節(jié)點的坐標(biāo){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];snake.z[i]=snake.z[i-1];}snake.x[0]=TailPoint.x; //恢復(fù)尾巴坐標(biāo)snake.y[0]=TailPoint.y;snake.z[0]=TailPoint.z;snake.node++; //節(jié)點個數(shù)加1//以下程序段為產(chǎn)生食物do{food.yes=1;//實物產(chǎn)生標(biāo)志置1GetNewFoodLoc(&food.x,&food.y,&food.z);//隨機(jī)產(chǎn)生新的食物的坐標(biāo)for(i=0;i<snake.node-1;i++){if((snake.x[i])==food.x&&((snake.y[i])==food.y)&&(snake.z[i]==food.z)) //判斷食物出現(xiàn)的位置是否在蛇身上{food.yes=0; //食物產(chǎn)生標(biāo)志置0break;}}}while(!food.yes);//直到產(chǎn)生的食物不在蛇身上為止LED_Set_Bit(food.x,food.y,food.z);//產(chǎn)生新的食物return 1;}return 0; }//讀取定時器的隨機(jī)值來獲得食物坐標(biāo),同時不能越界 void GetNewFoodLoc(uchar *x,uchar *y,uchar *z) { *x=TH0%4+1; *y=TL0%4+1;*z=(TL0+TH0)%4+1; }void Change_Direction2() {uchar olddir=snake.direction; do{snake.direction=rand()%6+1;}while(snake.direction == olddir); } //表示食物的LED燈閃爍 void Shine_Food() {LED_Shine(food.x,food.y,food.z); }
指定位置滅LED燈Led_Reset_Bit 以及 讓LED閃爍的函數(shù)LED_Shine 即可。

總結(jié)

以上是生活随笔為你收集整理的光立方实现3D贪吃蛇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。