学习体会
构架(基于C语言实现贪吃蛇):
a:开场动画
b:屏幕显示
c:蛇的移动
d:最终分数的显示
代码:
①开场动画
x=100,用一个循环显示。(也可以用红外控制)
//开场动画
wile(x--)
{
for(i=0;i<8;i++)
{
Hc595SendByte(ledwei[i],ledduan[i]);
delay(10);
}
}
②蛇的移动
二维数组代表蛇的坐标,0,空地,>0&&<65,蛇,65,果实
//主循环
while(1)
{
//移动
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(map[i][j]==length)
{
map[i][j]=0;
}
else if(map[i][j]>1 && map[i][j]<65)
{
map[i][j]++;
}
else if(map[i][j]==1)
{
map[i][j]++;
switch(command)
{
case 0:hand_i=i-1;hand_j=j;break;
case 1:hand_i=i;hand_j=j+1;break;
case 2:hand_i=i+1;hand_j=j;break;
case 3:hand_i=i;hand_j=j-1;break;
}
}
}
}
//判断是否到墙边
if(hand_i==-1)
{
hand_i=7;
}
else if(hand_i==8)
{
hand_i=0;
}
if(hand_j==-1)
{
hand_j=7;
}
else if(hand_j==8)
{
hand_j=0;
}
//判断是否死亡
if(map[hand_i][hand_j]>1 && map[hand_i][hand_j]<65)
{
break;//跳出主循环
}
if(map[hand_i][hand_j]==65)
{
map[hand_i][hand_j]=1;
length++;
score++;
while(1) //要用循环,将新果实的位置找出
{
i = rand() % SIZE; j = rand() % SIZE;//规定果实的位置
if (map[i][j] == 0)
{
map[i][j] = 65;
break;
}
}
beep();
//在串口助手上显示分数
SBUF=score+0x30;//十进制要加0x30,十六进制就用hex接收,不用加0x30。
while(!TI); //等待发送数据完成
TI=0;
}
else
{
map[hand_i][hand_j]=1;
}
③显示
用16进制传给74HC595芯片
//显示
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(map[i][j]!=0)
{
switch(i)
{
case 0:Duan[j]+=0x01;break;
case 1:Duan[j]+=0x02;break;
case 2:Duan[j]+=0x04;break;
case 3:Duan[j]+=0x08;break;
case 4:Duan[j]+=0x10;break;
case 5:Duan[j]+=0x20;break;
case 6:Duan[j]+=0x40;break;
case 7:Duan[j]+=0x80;break;
}
}
}
}
for(i=0;i<SIZE;i++)
{
Hc595SendByte(ledwei[i],Duan[i]);
Duan[i]=0x00;
delay(10);
}
④显示分数
一半一半分别显示各位和十位。
//显示分数
for(i=0;i<SIZE;i++)
{
Duan[i]=0x00;
}
switch((score%10))
{
case 0:Duan[4]=0x7f;
Duan[5]=0x41;
Duan[6]=0x41;
Duan[7]=0x7f;break;
case 1:Duan[4]=0x00;
Duan[5]=0x00;
Duan[6]=0x00;
Duan[7]=0x7f;break;
case 2:Duan[4]=0x79;
Duan[5]=0x49;
Duan[6]=0x49;
Duan[7]=0x4f;break;
case 3:Duan[4]=0x49;
Duan[5]=0x49;
Duan[6]=0x49;
Duan[7]=0x7f;break;
case 4:Duan[4]=0x0f;
Duan[5]=0x08;
Duan[6]=0x08;
Duan[7]=0x7f;break;
case 5:Duan[4]=0x4f;
Duan[5]=0x49;
Duan[6]=0x49;
Duan[7]=0x79;break;
case 6:Duan[4]=0x7f;
Duan[5]=0x49;
Duan[6]=0x49;
Duan[7]=0x79;break;
case 7:Duan[4]=0x01;
Duan[5]=0x01;
Duan[6]=0x01;
Duan[7]=0x7f;break;
case 8:Duan[4]=0x7f;
Duan[5]=0x49;
Duan[6]=0x49;
Duan[7]=0x7f;break;
case 9:Duan[4]=0x4f;
Duan[5]=0x49;
Duan[6]=0x49;
Duan[7]=0x7f;break;
}
switch(score/10)
{
case 0:Duan[0]=0x7f;
Duan[1]=0x41;
Duan[2]=0x41;
Duan[3]=0x7f;break;
case 1:Duan[0]=0x00;
Duan[1]=0x00;
Duan[2]=0x00;
Duan[3]=0x7f;break;
case 2:Duan[0]=0x79;
Duan[1]=0x49;
Duan[2]=0x49;
Duan[3]=0x4f;break;
case 3:Duan[0]=0x49;
Duan[1]=0x49;
Duan[2]=0x49;
Duan[3]=0x7f;break;
case 4:Duan[0]=0x0f;
Duan[1]=0x08;
Duan[2]=0x08;
Duan[3]=0x7f;break;
case 5:Duan[0]=0x4f;
Duan[1]=0x49;
Duan[2]=0x49;
Duan[3]=0x79;break;
case 6:Duan[0]=0x7f;
Duan[1]=0x49;
Duan[2]=0x49;
Duan[3]=0x79;break;
case 7:Duan[0]=0x01;
Duan[1]=0x01;
Duan[2]=0x01;
Duan[3]=0x7f;break;
case 8:Duan[0]=0x7f;
Duan[1]=0x49;
Duan[2]=0x49;
Duan[3]=0x7f;break;
case 9:Duan[0]=0x4f;
Duan[1]=0x49;
Duan[2]=0x49;
Duan[3]=0x7f;break;
}
while(1)
{
for(i=0;i<SIZE;i++)
{
Hc595SendByte(ledwei[i],Duan[i]);
delay(10);
}
}
⑤方向
有红外控制,保存在全局变量command中。
f(IrValue[2]!=~IrValue[3])
{
return;
}
//获得贪吃蛇运动方向
switch(IrValue[2])
{
case 8:temp=3;break;//向左
case 82:temp=2;break;//向下
case 90:temp=1;break;//向右
case 24:temp=0;break;//向上
}
if(abs(temp-command)!=2)//判断是否输入,并且不能反向走
{
command=temp;
}