51単片机--8*8时阵贪吃蛇--C言语


学習体験フレームワーク(C言語に基づいてヘビを貪る):a:オープニングアニメーションb:スクリーン表示c:ヘビの移動d:最終点数の表示コード:①オープニングアニメーションx=100、1サイクルで表示する.(赤外線制御も可能)
//    
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進法74 HC 595チップ
//  
        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);
        }

④表示点数の半分は、それぞれの方と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;
		}