51单片机--8*8点阵贪吃蛇--C语言

学习体会
构架(基于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;
		}

你可能感兴趣的:(51单片机)