|
以前看到的點陣貪食蛇都是8*8的,這次我用16*16的led點陣做了一個效果也還可以,速度可自己調節,可穿墻。
0.png (208.72 KB, 下載次數: 86)
下載附件
2016-9-25 12:43 上傳
proteus仿真工程文件及程序下載地址:
16x16 Snake.zip
(81.78 KB, 下載次數: 78)
2016-9-25 12:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序:
- #include<reg52.h>
- #include<stdlib.h>
- #include "74HC595.h"
- #include "74HC154.h"
- #define uint unsigned int
- #define uchar unsigned char
- //上 下 左 右
- //1 2 3 4
- sbit k1=P0^0;
- sbit k2=P0^1;
- sbit k3=P0^2;
- sbit k4=P0^3;
- uint a[8]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
- uint x[16];
- uint y[16];
- uchar D; //方向參數
- uchar n; //蛇身長度
- uchar k; //速度參量
- /**************************
- 重啟程序
- **************************/
- void restart()
- {
- D=0;
- n=3;
- x[0]=1;x[1]=1;x[2]=1;
- y[0]=2;y[1]=1;y[2]=0;
- }
- /******************************
- 基本延時程序
- ******************************/
- void yanshi(uint t)
- {
- unsigned char j;
- while(t--)
- {
- for(j=0;j<125;j++)
- {}
- }
- }
- /*****************************
- 碰撞掃描子程序
- *****************************/
- bit check_error(uchar X,uchar Y)
- {
- uchar i;
- for(i=1;i<n;i++)
- {
- if((x[i]==X)&&(y[i]==Y))
- {return 1;}
- }
- return 0;
- }
- /*****************************
-
- 食物隨機點產生程序
-
- *****************************/
- void food()
- {
- uchar tempx,tempy;
- //隨機函數rand,頭文件<stdlib.h>
- tempx=rand()%16;
- tempy=rand()%16;
- while(check_error(tempx,tempy))
- {
- tempx=rand()%16;
- tempy=rand()%16;
- }
- x[n]=tempx;
- y[n]=tempy;
- }
- /*********************************
-
- 顯示程序
-
- **********************************/
- void display()
- {
- uchar i;
- uchar t;
- //多掃描幾遍,穩定顯示
- OE1=0;
- OE2=0;
- for(t=0;t<=40*k;t++)
- {
- //掃描一遍
-
- for(i=0;i<=n;i++)
- {
- if(x[i]<8)
- {
- OE2=1;
- OE1=0;
- Ser_IN1(a[x[i]]);
- Par_OUT1();
- writ_154(y[i]);
- yanshi(1);
- E1=1;
- }
- else
- {
- OE1=1;
- OE2=0;
- Ser_IN2(a[x[i]-8]);
- Par_OUT2();
- writ_154(y[i]);
- yanshi(1);
- E1=1;
- }
- }
-
- }
- }
- /*******************************
- 獎勵程序
- *******************************/
- void victory()
- {
- uchar i;
- for(i=0;i<16;i++)
- x[0]=x[1]=0;
- x[2]=x[3]=1;
- x[4]=x[5]=2;
- x[6]=x[7]=3;
- x[8]=x[9]=4;
- x[10]=x[11]=5;
- x[12]=x[13]=6;
- x[14]=x[15]=7;
- y[0]=3;y[1]=4;
- y[2]=4;y[3]=5;
- y[4]=5;y[5]=6;
- y[6]=5;y[7]=4;
- y[8]=4;y[9]=3;
- y[10]=3;y[11]=2;
- y[12]=2;y[13]=1;
- y[14]=1;y[15]=0;
- n=15;
- while(1)
- display();
- }
- /********************************
- 核心程序(計算蛇身下一步的顯示)
- ********************************/
- void display_next(uchar D)
- {
- uchar i;
- if((x[0]==x[n])&&(y[0]==y[n])) //判斷是否吃到食物
- {
- n++;
- if(n==15)
- {
- k--;
- if(k==0)
- {victory();}
- else
- food();
- }
- }
- if(D==1) //上
- {
- for(i=n-1;i>=1;i--)
- {
- x[i]=x[i-1];
- y[i]=y[i-1];
- }
- y[0]-=1;
- if(y[0]==-1)
- y[0]=15;
- }
- else if(D==2)
- //下
- {
- for(i=n-1;i>=1;i--)
- {
- x[i]=x[i-1];
- y[i]=y[i-1];
- }
- y[0]+=1;
- if(y[0]==16)
- y[0]=0;
- }
-
-
- else if(D==3) //左
- {
- for(i=n-1;i>=1;i--)
- {
- x[i]=x[i-1];
- y[i]=y[i-1];
- }
- x[0]-=1;
- if(x[0]==-1)
- x[0]=15;
- }
-
- else if(D==4) //右
- {
-
- for(i=n-1;i>=1;i--)
- {
- x[i]=x[i-1];
- y[i]=y[i-1];
- }
- x[0]+=1;
- if(x[0]==16)
- x[0]=0;
- }
- if(check_error(x[0],y[0]))
- {
- restart();
- k=3;
- }
- }
- //檢查是否有方向變化
- void check_D()
- {
- P0=0xff;
- if(k1==0)
- {if(D!=2)D=1;}
- else if(k2==0){if(D!=1)D=2;}
- else if(k3==0){if(D!=4)D=3;}
- else if(k4==0){if(D!=3)D=4;}
- }
- /**********************************
- //主程序
- **********************************/
- void main()
- {
- k=2;
- restart();
- food();
- while(1)
- {
- check_D();
- display_next(D);
- display();
- }
- }
復制代碼
|
|