學習體會
構架(基於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;
}