我在C++中创建了一个简单的游戏,玩家必须避免被僵尸咬伤才能生存。
僵尸作为Z
字符存储在名为 zeds
的数组中。
我正在尝试编写一个函数,可以检查是否有僵尸发生碰撞,并采取相应的行动。
我已经写了这个if语句:
for (int i; i < MAXZEDS; ++i);
if (zeds[i].x == zeds[i].x && zeds[i].y == zeds[i].y)
{
--zlives;
updateLives();
}
显然它不起作用,我只是想知道我是否可以以某种方式重写它,以便在僵尸与另一个僵尸碰撞而不是自身碰撞时仅减少zlives
。
对标题表示歉意,我找不到更好的方法来总结我的问题。提前感谢任何帮助。
你需要一个双循环,这样你才能比较两个不同的僵尸。
像这样的东西。
for (int i = 0; i < MAXZEDS - 1; ++i)
{
// Looping from i + 1 ensures that we only test each pair once.
for (int j = i + 1; j < MAXZEDS; ++j)
{
if (zeds[i].x == zeds[j].x && zeds[i].y == zeds[j].y)
{
--zlives;
updateLives();
}
}
}
最简单的方法是 2 个循环。
for (int i = 0; i < MAXZEDS; ++i) {
for (int j = i+1; j < MAXZEDS; ++j) {
if (zeds[i].x == zeds[j].x && zeds[i].y == zeds[j].y)
{
--zlives;
updateLives();
}
}
}
如果 zeds
中的对象顺序不重要,并且operator<()
为 zeds
的元素类型正确定义,则可以对zeds
进行排序并检查连续元素以降低复杂性。
尝试使用嵌套for
循环:
for (int i = 0; i < MAXZEDS; i++)
{
for (int j = 0; j < MAXZEDS; j++)
{
if (i == j) continue; // Don't compare the current zed with itself
else if (zeds[i].x == zeds[j].x && zeds[i].y == zeds[j].y)
{
--zlives;
updateLives();
}
}
}
这将循环访问zeds
两次,并将数组中的每个项与其他项进行比较。我相信有更有效的方法,但这是最简单的。