前言
上一篇讲的是 蛇的显示、移动和碰撞。这一篇讲如何生成苹果,并且跟蛇结合起来;回顾上一篇文章戳这里ESP32: 编写贪吃蛇小游戏 一 (Arduino)
操作工具
测试使用的开发板: bpi-bit v1.2
应用到的外设: WS2812b
测试使用的软件:PlatformIO
- 不知怎么安装可看这篇文章
Arduino : 下载安装 PlatformIO 并新建工程
苹果
苹果的生成
int CreatApple(int *snakeX, int *snakeY, int snakeLen)
{
int posx;
int posy;
int f=1;
do
{
f=1;
posx = random(1, 6);
posy = random(1, 6);
for (int i = 0; i < snakeLen; i++)
{
if (posx == snakeX[i])
{
for (i = 0; i < snakeLen; i++)
{
if (posy == snakeY[i])
{
f=0;
}
}
}
}
} while (!f);
return (posx-1)+(posy-1)*5;
}
利用 random()
获取随机的位置 (X,Y),获取位置后与蛇的位置进行重叠判断,若不重叠则返回 整数
判断苹果是否被吃
bool IfAppleEat(int hx,int hy,int apple)
{
int hxy=(hx-1)+(hy-1)*5;
if (hxy==apple)
{
return true;
}
return false;
}
判断蛇头是否与苹果重叠,若重叠则说明苹果被吃
主函数
void loop()
{
// // 碰撞判断
if (snake.IsSnakeCollision(snake.hx, snake.hy))
{
strip.ClearTo(red);
strip.Show();
while (1)
;
}
// 当蛇的长度为 8 时成功
else if(snake.snakeLen==8)
{
strip.ClearTo(green);
strip.Show();
while (1)
;
}
else
{
DisplaySnake();
if (snake.Key_Scan())
{
snake.DirectionAndCount();
strip.SetPixelColor(Count(snake.snakeLenX[0], snake.snakeLenY[0]), black);
snake.tx = snake.snakeLenX[0];
snake.ty = snake.snakeLenY[0];
snake.updateSnakePosition(false, snake.tx, snake.ty);
beforeTime = clock();
}
// 当时间间隔大于 2300 ms时,前进一格
if ((clock() - beforeTime) >= 2300)
{
AutoWalk();
strip.SetPixelColor(Count(snake.snakeLenX[0], snake.snakeLenY[0]), black);
snake.tx = snake.snakeLenX[0];
snake.ty = snake.snakeLenY[0];
snake.updateSnakePosition(false, snake.tx, snake.ty);
beforeTime = clock();
}
// 显示苹果
if (IfAppleEat(snake.hx, snake.hy, apple))
{
snake.snakeLen++;
strip.SetPixelColor(apple, black);
snake.updateSnakePosition(true, snake.tx, snake.ty);
apple = (CreatApple(snake.snakeLenX, snake.snakeLenY, snake.snakeLen));
strip.SetPixelColor(apple, red);
beforeTime = clock();
}
}
}
现象
由于文件较大,所以以视频的方式展示
总结
一个简单的贪吃蛇小游戏就这样完成了。代码在我的 github 里。