接下来就是最终的成果展示了,实现的是一个比较完整的贪吃蛇游戏,基本功能包括:
吃食物增加长度;
撞到边界结束游戏(也就是重新开始);
我们在上一步实现了基本啊方向控制,这个时候我们要一步一步增加基础游戏功能,第一步就是吃食物增加长度,首先要产生一个事物,理论上最好使用随机数生成函数,不过这个工程还是不太了解的,这里我们使用的rand()函数,属于一个伪随机数函数。
主要产生随机食物的位置是初始化的时候以及吃到食物的时候:
rand_cnt = rand(); eat_snake.my_snake_food.iX = rand_cnt%24*10; rand_cnt = rand(); eat_snake.my_snake_food.iY = rand_cnt%13*10;
随机获取食物的横纵坐标,注意这里食物选择了和贪吃蛇身体一样的宽度,所以理论上显示屏幕最大是24*13;
接下来就是吃食物的操作,实际上就是运行的头部遇到食物就算吃到了:
if(eat_snake.my_snake_body[0].iX == eat_snake.my_snake_food.iX && eat_snake.my_snake_body[0].iY == eat_snake.my_snake_food.iY){ rand_cnt = rand(); eat_snake.my_snake_food.iX = rand_cnt%24*10; rand_cnt = rand(); eat_snake.my_snake_food.iY = rand_cnt%13*10; eat_snake.snake_body_len++; }
对于边界的判断不过是在达到边缘时的处理,之前的处理是传过去,现在是进行初始化从新开始:
void snake_move(){ uint16_t i; for( i = eat_snake.snake_body_len; i > 0; i--){ eat_snake.my_snake_body[i].iX = eat_snake.my_snake_body[i-1].iX; eat_snake.my_snake_body[i].iY = eat_snake.my_snake_body[i-1].iY; } if(eat_snake.snake_body_dir == 0){ if(eat_snake.my_snake_body[0].iX >= 230){ restart_flag = 1; } else{ eat_snake.my_snake_body[0].iX += eat_snake.snake_body_width; eat_snake.my_snake_body[0].iY += 0; } } else if(eat_snake.snake_body_dir == 1){ if(eat_snake.my_snake_body[0].iX == 0){ restart_flag = 1; } else{ eat_snake.my_snake_body[0].iX -= eat_snake.snake_body_width; eat_snake.my_snake_body[0].iY += 0; } } else if(eat_snake.snake_body_dir == 2){ if(eat_snake.my_snake_body[0].iY >= 120){ restart_flag = 1; } else{ eat_snake.my_snake_body[0].iY += eat_snake.snake_body_width; eat_snake.my_snake_body[0].iX += 0; } } else if(eat_snake.snake_body_dir == 3){ if(eat_snake.my_snake_body[0].iY == 0){ restart_flag = 1; } else{ eat_snake.my_snake_body[0].iY -= eat_snake.snake_body_width; eat_snake.my_snake_body[0].iX += 0; } } if(eat_snake.my_snake_body[0].iX == eat_snake.my_snake_food.iX && eat_snake.my_snake_body[0].iY == eat_snake.my_snake_food.iY){ rand_cnt = rand(); eat_snake.my_snake_food.iX = rand_cnt%24*10; rand_cnt = rand(); eat_snake.my_snake_food.iY = rand_cnt%13*10; eat_snake.snake_body_len++; } if(restart_flag == 1){ snake_init(); restart_flag = 0; } }
整体的判断依然是在snake_move()中进行,实际上是在基础处理的基础上更改判断规则就可以了,不过这里实现的只是基础的贪吃蛇游戏功能,基本实现了游戏的操作,要是需要什么更加具有趣味性的操作,大家可以在此基础上进一步进行扩展。
整体的效果如下:
【彩屏贪吃蛇小游戏成果展示】 https://www.bilibili.com/video/BV1otWAe9EA4/?share_source=copy_web&vd_source=6c53bcbe419a41b4d4827b64953cb205