简介
本文是基于Arduino和74HC595实现的点阵贪吃蛇游戏,6个74HC595控制9个88点阵实现2424点阵屏。
硬件
硬件我选用的是Arduino mega2560开发板1,74HC595移位寄存器6,88点阵屏9,按钮开关*4。
开发环境
开发环境使用的是Arduino IDE。
接线图
软件部分
方向控制
if((digitalRead(A3)==1&&digitalRead(A2)==1&&digitalRead(A1)==1&&digitalRead(A0)==0||Up==1)&&Down!=1)//按钮上的事件处理
{
if(Q[0]>2&&H[0]==0)
{
H[0]=8;
Q[0]=Q[0]-3;
moveINS=0;
}
H[0]=H[0]-1;//行-1
Up=1;
Down=0;
Left=0;
Right=0;
}
if((digitalRead(A0)==1&&digitalRead(A2)==1&&digitalRead(A3)==1&&digitalRead(A1)==0||Down==1)&&Up!=1)//按钮下的事件处理
{
if(Q[0]<6&&H[0]==7)
{
H[0]=-1;
Q[0]=Q[0]+3;
moveINS=0;
}
H[0]=H[0]+1;//行+1
Up=0;
Down=1;
Left=0;
Right=0;
}
if((digitalRead(A0)==1&&digitalRead(A1)==1&&digitalRead(A3)==1&&digitalRead(A2)==0||Left==1)&&Right!=1&&moveINS==1)//按钮左的事件处理
{
if(L[0]==0&&Q[0]!=0&&Q[0]!=3&&Q[0]!=6)
{
L[0]=8;
Q[0]=Q[0]-1;
}
L[0]=L[0]-1;//列-1
H[0]=H[1];
Up=0;
Down=0;
Left=1;
Right=0;
}
if((digitalRead(A0)==1&&digitalRead(A1)==1&&digitalRead(A2)==1&&digitalRead(A3)==0||Right==1)&&Left !=1&&moveINS==1)//按钮右的事件处理
{
if(L[0]==7&&Q[0]!=2&&Q[0]!=5&&Q[0]!=8)
{
L[0]=-1;
Q[0]=Q[0]+1;
}
L[0]=L[0]+1;//列+1
H[0]=H[1];
Up=0;
Down=0;
Left=0;
Right=1;
}
蛇身轨迹
for(len=snakeLen;len>0;len--)//蛇身路径轨迹
{
H[len]=H[len-1];
L[len]=L[len-1];
Q[len]=Q[len-1];
}
碰壁检测
if((L[0]<0&&(Q[0]==0||Q[0]==3||Q[0]==6))||(L[0]>7&&(Q[0]==2||Q[0]==5||Q[0]==8)))//左右碰壁自动重新归位,清除所有标记位
{
clearAllData();
}
if((H[0]<0&&(Q[0]==0||Q[0]==1||Q[0]==2))||(H[0]>7&&(Q[0]==6||Q[0]==7||Q[0]==8)))//上下碰壁自动重新归位,清除所有标记位
{
clearAllData();
}
蛇身显示
void showPoint(int y, int x, int location)
{
digitalWrite(latchpin,LOW);
switch(location){
case 0:
{
shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,y);
shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,x);
break;
}
case 1:
{
shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,y);
shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,x);shiftOut(datapin,ckpin,LSBFIRST,0x00);
break;
}
case 2:
{
shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,y);
shiftOut(datapin,ckpin,LSBFIRST,x);shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,0x00);
break;
}
case 3:
{
shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,y);shiftOut(datapin,ckpin,LSBFIRST,0xff);
shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,x);
break;
}
case 4:
{
shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,y);shiftOut(datapin,ckpin,LSBFIRST,0xff);
shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,x);shiftOut(datapin,ckpin,LSBFIRST,0x00);
break;
}
case 5:
{
shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,y);shiftOut(datapin,ckpin,LSBFIRST,0xff);
shiftOut(datapin,ckpin,LSBFIRST,x);shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,0x00);
break;
}
case 6:
{
shiftOut(datapin,ckpin,LSBFIRST,y);shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,0xff);
shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,x);
break;
}
case 7:
{
shiftOut(datapin,ckpin,LSBFIRST,y);shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,0xff);
shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,x);shiftOut(datapin,ckpin,LSBFIRST,0x00);
break;
}
case 8:
{
shiftOut(datapin,ckpin,LSBFIRST,y);shiftOut(datapin,ckpin,LSBFIRST,0xff);shiftOut(datapin,ckpin,LSBFIRST,0xff);
shiftOut(datapin,ckpin,LSBFIRST,x);shiftOut(datapin,ckpin,LSBFIRST,0x00);shiftOut(datapin,ckpin,LSBFIRST,0x00);
break;
}
}
digitalWrite(latchpin,HIGH);
}
刷新食物
if(H[0]==rn1&&L[0]==rn2&&Q[0]==rn3)//点被吃到后产生新的随机点,同时蛇身长度的点数+1
{
H.insert(H.end(),0);
L.insert(L.end(),0);
Q.insert(Q.end(),0);
snakeLen=snakeLen+1;
rn1=random(0,7);//随机行
rn2=random(0,7);//随机列
rn3=random(0,8);//随机格子
}
仿真演示