我想弄清楚如何编写一个循环来检查圆圈相对于可变数量的矩形的位置,以便苹果不会放在蛇的顶部,但我遇到了一些麻烦考虑清楚。我试过:
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
个单元格,您可以生成一个介于0
和N - [蛇的部分数]
之间的数字,然后将这个数字X
映射到最小的数字Y
使得这个整数不指代蛇部分占据的单元格并且X = Y + S
其中S
是由小于Y
的数字引用的蛇部分占用的单元格数。
但它更复杂。第三种方法是“作弊”,选择更容易执行的更严格的要求。例如,如果你知道细胞体有
N
个细胞长,那么只在距离蛇头N + 1
个细胞的细胞上生成苹果(你可以通过生成角度来做到这一点)。
关于c++ - 循环检查苹果位置与蛇体位置的对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776107/