超级无敌贪吃蛇

   简单总结一下这一次的贪吃蛇代码,同时也对之前的代码进行一些复盘,也把遇到的问题记录一下便于之后查找.

     -----------------------------------------------正文部分------------------------------------------------------------------

        主控MCU:STM32F407ZGT6

        这里用的是正点原子F407探索者

        本次贪吃蛇目标如下

        基本功能:

1. 使用屏幕绘制游戏图形界面,使用按键功能操控游戏;

2. 实现贪吃蛇的基本功能(控制蛇上下左右移动、随机生成食物、吃到食物增加长度、判断蛇的死亡);

3. 实现游戏的可视化菜单。

        拓展功能:

                1. 使用触摸功能操控游戏;

                2. 添加AI蛇,能够实现自动寻路

                3. 人机对战、双人对战;

                4. 发挥你们的想象(比如换皮肤、多种地图等)。

        针对需所实现的目标,简单理一下框架

        

        UI      

 先从页面开始讲吧,这里用状态机写了一个二级菜单,先初始化一个变量state=0,通过一些功能性的按键按钮,改变state,从而实现状态即页面的切换。

        大体框架如下

        

		switch(state)
		{
			case 0:
			startpage();	break;
			
            case 1:
			firstpage();   break;
			
			case 2:
			secondpage();   break;


			case 3:
			thirdpage();	break;
		}

之后便开始画每一个页面的样子,拿startpage()和firstpage()举例

startpage()是默认进入的页面,即游戏开始的界面,在这个界面我们要能进入各个页面,同时还要能直观的展现出来,从而能提高人机交互性。

void startpage(void)	//封面
{
	POINT_COLOR=BLUE;
	//贪吃蛇
	LCD_Show_CH_Font72(50,0,0);
	LCD_Show_CH_Font72(122,0,1);
	LCD_Show_CH_Font72(194,0,2);
	
	POINT_COLOR=LIGHTBLUE;
	//双人对战
	LCD_Show_CH_Font48(62,120,0);
	LCD_Show_CH_Font48(110,120,1);
	LCD_Show_CH_Font48(158,120,2);
	LCD_Show_CH_Font48(206,120,3);
	
	//单人对战
	LCD_Show_CH_Font48(62,180,4);
	LCD_Show_CH_Font48(110,180,5);
	LCD_Show_CH_Font48(158,180,6);
	LCD_Show_CH_Font48(206,180,7);
	
	//电脑模式
	
	LCD_Show_CH_Font48(62,240,8);
	LCD_Show_CH_Font48(110,240,9);
	LCD_Show_CH_Font48(158,240,10);
	LCD_Show_CH_Font48(206,240,11);
	
	//人机模式
	LCD_Show_CH_Font48(62,300,12);
	LCD_Show_CH_Font48(110,300,13);
	LCD_Show_CH_Font48(158,300,2);
	LCD_Show_CH_Font48(206,300,15);

}

这里用软件制作完字库后,通过LCD_Show_CH_Font48()函数显示出中文,具体函数的定义如下。
    

void LCD_Show_CH_Font48(u16 x,u16 y,u8 index)
{      
    u16 temp,t,t1;
    u16 y0=y;
  
    for(t=0;t<288;t++) //这里的288=48*48/8 计算字节数
    {   
       temp=myHZ48[index*288+t]; //288
       for(t1=0;t1<8;t1++)
       {
		if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
		 else LCD_Fast_DrawPoint(x,y,BACK_COLOR);  
          temp<<=1;
          y++;
         if((y-y0)==48)  //字的大小
         {
          y=y0;
          x++;
          break;
         }
       }  
 
    }          
}

这里的288,48等参数修改一下,便可以显示出不同大小的汉字。

之后我们通过触摸屏修改state的值,就可以实现页面的切换

void startpage_touch()
{
			tp_dev.scan(0); 
	if(tp_dev.sta&TP_PRES_DOWN)	
	{
		if(tp_dev .x[0]>50&&tp_dev .x[0]<250&&tp_dev .y[0]>110&&tp_dev .y[0]<160)
		{
			delay_ms(10);
			if(tp_dev .x[0]>50&&tp_dev .x[0]<250&&tp_dev .y[0]>110&&tp_dev .y[0]<160)
			{
			state=1;
			food_init();
			Snake1_init();
			Snake2_init();
			flag=0;
			LCD_Clear(WHITE);
			
			}	
		}
		if(tp_dev .x[0]>50&&tp_dev .x[0]<250&&tp_dev .y[0]>170&&tp_dev .y[0]<220)
		{
			delay_ms(10);
			if(tp_dev .x[0]>50&&tp_dev .x[0]<250&&tp_dev .y[0]>170&&tp_dev .y[0]<220)
			{
			state=2;
			food_init();
			Snake1_init();
			flag=0;
			LCD_Clear(WHITE);
		
			}	
		}
		if(tp_dev .x[0]>50&&tp_dev .x[0]<250&&tp_dev .y[0]>230&&tp_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值