本帖最后由 775913024 于 2018-9-25 11:07 編輯
開學無聊沒事干,做了個簡陋的貪吃蛇娛樂娛樂.
貪吃蛇演示.gif (2.89 MB, 下載次數: 137)
下載附件
2018-9-14 22:38 上傳
接線如圖所示
貪吃蛇arduino.png (26.95 KB, 下載次數: 104)
下載附件
貪吃蛇接線
2018-9-14 22:33 上傳
代碼如下:- //貪吃蛇游戲--2018.9.12
- int ckpin=4;
- int datapin=5;
- int latchpin=6;
- int Up,Down,Left,Right,a5;//記錄狀態的變量
- int Y[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//行
- int X[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//列
- int Y1,Y2,Y3,Y4,Y5,Y6,Y7;//行
- int X1,X2,X3,X4,X5,X6,X7;//列
- int rn1,rn2;//行列的隨機數
- void setup()
- {
- randomSeed(analogRead(A0));//初始化隨機函數
- //595的控制端
- pinMode(ckpin,OUTPUT);
- pinMode(datapin,OUTPUT);
- pinMode( latchpin,OUTPUT);
- //按鈕控制端
- pinMode( 13,INPUT_PULLUP);//上
- pinMode( 12,INPUT_PULLUP);//下
- pinMode( 11,INPUT_PULLUP);//左
- pinMode( 10,INPUT_PULLUP);//右
- //按鈕的狀態標記
- Up=0;
- Down=0;
- Left=0;
- Right=0;
- //吃到點的個數
- a5=0;
- //初始點的位置
- Y1=0;//初始點所在行數
- X1=0;//初始點所在列數
- //產生第一個隨機數
- rn1=random(0,8);//隨機行
- rn2=random(0,8);//隨機列
- }
- void loop()
- {
- //記錄7個走過的點的位置
- X7=X6;//列
- X6=X5;
- X5=X4;
- X4=X3;
- X3=X2;
- X2=X1;
- Y7=Y6;//行
- Y6=Y5;
- Y5=Y4;
- Y4=Y3;
- Y3=Y2;
- Y2=Y1;
- if(digitalRead(10)==1&&digitalRead(11)==1&&digitalRead(12)==1&&digitalRead(13)==0||Up==1)//按鈕上的事件處理
- {
- Y1=Y1+1;//行數+1
- Up=1;
- Down=0;
- Left=0;
- Right=0;
- }
- if(digitalRead(13)==1&&digitalRead(11)==1&&digitalRead(10)==1&&digitalRead(12)==0||Down==1)//按鈕下的事件處理
- {
- Y1=Y1-1;//行數-1
- Up=0;
- Down=1;
- Left=0;
- Right=0;
- }
- if(digitalRead(13)==1&&digitalRead(12)==1&&digitalRead(10)==1&&digitalRead(11)==0||Left==1)//按鈕左的事件處理
- {
- X1=X1+1;//列數+1
- Y1=Y2;
- Up=0;
- Down=0;
- Left=1;
- Right=0;
- }
- if(digitalRead(13)==1&&digitalRead(12)==1&&digitalRead(11)==1&&digitalRead(10)==0||Right==1)//按鈕右的事件處理
- {
- X1=X1-1;//列數-1
- Y1=Y2;
- Up=0;
- Down=0;
- Left=0;
- Right=1;
- }
- if(X1>7)//左碰壁
- {
- X1=0;
- Left=1;
- }
- if(X1<0)//右碰壁
- {
- X1=7;
- Right=1;
- }
- if(Y1>7)//上碰壁
- {
- Y1=0;
- Up=1;
- }
- if(Y1<0)//下碰壁
- {
- Y1=7;
- Down=1;
- }
- /*
- if(X1<0||X1>8)//左右碰壁自動重新歸位,清除所有標記位
- {
- X1=0;
- Y1=0;
- Up=0;
- Down=0;
- Left=0;
- Right=0;
- a5=0;
- }
- if(Y1==8||Y1<0)//上下碰壁自動重新歸位,清除所有標記位
- {
- X1=0;
- Y1=0;
- Up=0;
- Down=0;
- Left=0;
- Right=0;
- a5=0;
- }
- */
- for(int x=0;x<100;x++)//通過快速刷新的方式把點顯示出來
- {
- showPoint(Y[rn1],X[rn2]);//隨機點
-
- showPoint(Y[Y1],X[X1]);//第1個點
-
- showPoint(Y[Y2],X[X2]);//第2個點
-
- if(a5>=1)
- showPoint(Y[Y3],X[X3]);//第3個點
-
- if(a5>=2)
- showPoint(Y[Y4],X[X4]);//第4個點
-
- if(a5>=3)
- showPoint(Y[Y5],X[X5]);//第5個點
-
- if(a5>=4)
- showPoint(Y[Y6],X[X6]);//第6個點
-
- if(a5>=5)
- showPoint(Y[Y7],X[X7]);//第7個點
- delay(1);//加入延,時間可以自己看著辦
- }
- if(Y1==rn1&&X1==rn2)//點被吃到后產生新的隨機點,同時蛇身長度的點數+1
- {a5=a5+1;
- rn1=random(0,8);//隨機行
- rn2=random(0,8);//隨機列
- }
- while(a5==6)//吃到第8個時,游戲結束,并重新開始
- {
- showPoint(0x00,0xff);//勝利結束提示畫面
- delay(1000);
- showPoint(0xff,0xff);
- delay(1000);
- showPoint(0x00,0xff);
- delay(1000);
- showPoint(0xff,0xff);
- delay(1000);
- showPoint(0x00,0xff);
- delay(1000);
- showPoint(0xff,0xff);
- delay(1000);
-
- clearAllData(); //數據全清
-
- }
- if(a5==2&&(X1==X4&&Y1==Y4))//追尾事件1
- {
- clearAllData();
- }
- if(a5==3&&(X1==X4&&Y1==Y4)||(X1==X5&&Y1==Y5))//追尾事件2
- {
- clearAllData();
- }
- if(a5==4&&(X1==X4&&Y1==Y4)||(X1==X5&&Y1==Y5)||(X1==X6&&Y1==Y6))//追尾事件3
- {
- clearAllData();
- }
- if(a5==5&&(X1==X4&&Y1==Y4)||(X1==X5&&Y1==Y5)||(X1==X6&&Y1==Y6)||(X1==X7&&Y1==Y7))//追尾事件4
- {
- clearAllData();
- }
- }
- void showPoint(int y,int x)
- {
- digitalWrite(latchpin,LOW);//
- shiftOut(datapin,ckpin,LSBFIRST,y);//行
- shiftOut(datapin,ckpin,LSBFIRST,x);//列
- digitalWrite(latchpin,HIGH);
- }
- void clearAllData()
- {
- X1=0;
- Y1=0;
- Up=0;
- Down=0;
- Left=0;
- Right=0;
- a5=0;
- }
復制代碼
|