前几天外地出差,闲来无事,利用UCGUI编写了一个贪吃蛇的程序。用UCGUI自带的模拟LCD,通过VC6.0编译生成最终的程序。最终界面如下图所示:
在整个设计中我模仿了C++中对象的概念,对象有属性、方法和事件,我在程序中建立了三个结构体,分别是FOOD、SNAKE、GAME。程序如下:
struct SNAKE //蛇结构体
{
U8 x[N],y[N];//每节蛇的坐标
U8 node; //蛇的节数
U8 direction;//蛇的运动方向
U16 speed;//蛇运行速度
U8 life; //蛇是否有生命值,0死亡,1活着
void (*move)(U8 );//移动方法
}snake;
struct FOOD //食物结构体
{
U8 x,y;//食物的位置
U8 renew;//更新,0不更新,1更新
}food;
struct GAME
{
U8 level;
U16 score;
U8 state;
}game;
由于结构体不能直接包含函数,但是可以添加一个函数指针,这样的效果是一样的,只不过在使用之前要给这个函数指针赋一个函数地址,我称之为注册。上面程序中snake结构体的snake.move是一个函数指针。它的注册函数如下:
/*
*******************************************************************
*
* snake_creatclass()
*注册蛇类
*
*******************************************************************
*/
void snake_creatclass()
{
snake.move=snake_move;
snake_head(5,5);
snake_body(4,5);
snake_body(3,5);
snake.x[1]=4;
snake.y[1]=5;
snake.x[2]=3;
snake.y[2]=5;
snake.node=3;
snake.direction=RIGHT;
snake.speed=300;
xlast=snake.x[2];//保存蛇尾的位置
ylast=snake.y[2];
}
注册的意思就是将结构体中需要赋予初值的变量赋值。
本程序的主程序源代码如下:
/*
*******************************************************************
*
* main()
*
*******************************************************************
*/
void MainTask(void) {
U8 key;
GUI_Init();
snake_creatclass();
food_creatclass();
game_creatclass();
while(1)
{
key=GUI_GetKey();
game_pause(key);
game_restart(key);
if(game.state==START) snake.move(key);
DrawUI();
get_score();
GUI_Delay(snake.speed);
}
}
回来以后我又将它移植到了我的Mini2440的ARM开发板上面,加进去了UCOSII,由于Mini2440的键盘在里面不好使用,所以我采用电脑键盘,在电脑上敲击键盘,通过串口把键值传给ARM来控制游戏。不过最终的效果不是很好,速度太慢了,目前正在想办法改进。
文章评论(0条评论)
登录后参与讨论