c++ - 循环检查苹果位置与蛇体位置的​​对比

标签 c++ position sfml

我想弄清楚如何编写一个循环来检查圆圈相对于可变数量的矩形的位置,以便苹果不会放在蛇的顶部,但我遇到了一些麻烦考虑清楚。我试过:

do 
   apple.setPosition(randX()*20+10, randY()*20+10); // apple is a CircleShape
while (apple.getPosition() == snakeBody[i].getPosition());

虽然在这种情况下,如果它检测到与蛇 body 的一个矩形发生碰撞,它最终可能只是将苹果放在 body 的先前位置。我如何让它同时检查所有位置,这样它就不能纠正自己只是为了有机会再次重复同样的问题?

最佳答案

生成满足要求的随机数有3种方式(我能想到):

  • 第一种方法,也是更简单的方法,就是您要尝试做的:如果不成功则重试。
    但是,您应该更改条件,以便它一次检查所有禁止的单元格:

    bool collides_with_snake(const sf::Vector2f& pos, //not sure if it's 2i or 2f
                             const /*type of snakeBody*/& snakeBody,
                             std::size_t partsNumber) {
      bool noCollision = true;
      for( std::size_t i = 0 ; i < partsNumber && noCollision ; ++i )
        noCollision = pos != snakeBody[i].getPosition()
      return !noCollision;
    }
    
    //...
    do 
      apple.setPosition(randX()*20+10, randY()*20+10);
    while (collides_with_snake(apple.getCollision(), snakeBody,
                               /* snakeBody.size() ? */));
    
  • 第二种方法是尝试生成较少的数字并找到一个函数将这些数字映射到您想要的集合。例如,如果您的网格有 N 个单元格,您可以生成一个介于 0N - [蛇的部分数] 之间的数字,然后将这个数字 X 映射到最小的数字 Y 使得这个整数不指代蛇部分占据的单元格并且 X = Y + S 其中 S 是由小于 Y 的数字引用的蛇部分占用的单元格数。
    但它更复杂。

  • 第三种方法是“作弊”,选择更容易执行的更严格的要求。例如,如果你知道细胞体有 N 个细胞长,那么只在距离蛇头 N + 1 个细胞的细胞上生成苹果(你可以通过生成角度来做到这一点)。

关于c++ - 循环检查苹果位置与蛇体位置的​​对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776107/

相关文章:

c++ - 没有键盘输入的 SFML 动画

c++ - 如何在 C++ 中正确组织和实现 SFML 音频?

c++ - 键入 'File' 到键入 'std::string'

c++ - 如何避免动态链接有完整路径?

css - 为 :hover, 文本位置提供 100% 宽度

javascript - 如何删除位置为 : sticky 的不需要的间隙

c++ - 音乐没有开始

c++ - 清理字符串以打印到终端的惯用方法?

c++ - 迭代月份使用的循环数组公式

jQuery Quicksend关于位置计算的问题