本帖最后由 775913024 于 2018-9-25 11:07 编辑
开学无聊没事干,做了个简陋的贪吃蛇娱乐娱乐.
接线如图所示
代码如下:- //贪吃蛇游戏--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;
- }
复制代码
|