2015-04-28 36 views
0

我用C++创建了一个简单的游戏,玩家必须避免被僵尸咬伤才能生存。数组问题(if(zeds [i] .x == zeds [i] .x))

僵尸存储为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如果一个僵尸与其他僵尸但不是碰撞本身。

道歉的标题我找不到一个更好的方式来总结我的问题。预先感谢您的帮助。

+4

不会'zeds [i] .x == zeds [i] .x'永远是真的吗? –

+0

确实,这是我的问题。 – dotonthewall1

+2

你需要创建两个循环不仅一个... –

回答

2

你需要一个双循环,所以你可以比较两个不同的僵尸。
就像这样。

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(); 
     } 
    } 
} 
+0

非常感谢:) – dotonthewall1

2

最简单的方法是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和检查连续元素来获得更低的复杂性。

1

尝试使用嵌套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这两次迭代和每个项目彼此项目阵列中的进行比较。我相信有更有效的方法,但这是最简单的。

相关问题