简单总结一下这一次的贪吃蛇代码,同时也对之前的代码进行一些复盘,也把遇到的问题记录一下便于之后查找.
-----------------------------------------------正文部分------------------------------------------------------------------
主控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_