Arduino : 编写贪吃蛇小游戏 二

文章目录

  • 前言
  • 操作工具
  • 苹果
    • 苹果的生成
    • 判断苹果是否被吃
  • 主函数
  • 现象
  • 总结
  • 参考资料

前言

上一篇讲的是 蛇的显示、移动和碰撞。这一篇讲如何生成苹果,并且跟蛇结合起来;回顾上一篇文章戳这里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 里。其实做完这个小游戏,感觉有些不完美的地方,例如当蛇的长度为 8 时,会出现数据混乱,灯会乱点亮,所以我用游戏成功去掩盖这个问题。但是这是治标不治本的方法,贪吃蛇的长度过不了 8 。可能这个方面是动态数组的问题,我暂时还不清楚怎么解决。但其实感觉可以有用其他方法去解决这个问题。所以同时想请教大佬怎么解决这个问题。

参考资料

Chentoday-Github

你可能感兴趣的:(bpibit,esp32,arduino)