2014-03-03 116 views
0

好吧,所以我经过几次不同的尝试之后,一直在嘲笑我的头发。为了给出一些背景并希望得到对这个问题的适当的了解,我将解释我的代码是如何设置的。比较两个单独对象内的两个列表

  • 我有一个指向players_的指针列表,其中包含两个HumanPlayer类对象。
  • 每个HumanPlayer都包含一个Snake_List列表属性,这些列表中的部分包含x和y数据。我想检查第一个HumanPlayer的Snake_List的x和y坐标的前面,对每一个第二个HumanPlayer的Snake_List的x和y坐标的前面。

我当前的代码看起来有点像这样在应该这样做的功能:

for(Entity* player : entityList) 
{ 
    Player* p = dynamic_cast<Player*>(player); 
    Player* p2 = dynamic_cast<Player*>(player++); 
    if(p) 
    { 
     i=p->Snake_List.begin(); 
     for(m=p2->Snake_List.begin(); m != p2->Snake_List.end(); m++) 
     { 
      if (i!=m) 
      { 
       if ((i->x == m->x) && i->y == m->y) 
       { 
        p->respawn(); 
        return; 
       } 
      } 
     } 
    } 
} 

这个编译并运行正常,但冲突没有给我想要的效果。实际上没有发生。我真的不认为我正确地引用了第二个HumanPlayer的列表,但如果有人可以帮助照亮一些光,那么将非常感谢:)

+0

你知道'p'和'p2'具有相同的值吗?你为什么试图通过无缘无故的增量操作来欺骗自己? –

+0

你知道'p'和'p2'都开始指向同一个玩家吗? –

+0

@KerrekSB这是我的问题,我不知道如何指向列表中的第二位玩家 – WearyWanderer

回答

0

如果有(只有永远不会是)只有两个Player列表中的对象,那么你就可以得到这两名球员是这样的:

auto itPlayer = entityList.begin(); 
Player* p1 = *(itPlayer++); 
Player* p2 = *itPlayer; 

这并不做任何错误检查,所以如果有在名单中少于两名球员,它会崩溃。如果你的列表中有两个以上的玩家,你需要使用一个嵌套循环来比较每个玩家与其他玩家。

您的原始版本不工作(除了在错误的地方后增)的理由是,范围为基础,为(for x : y)回报的实际对象的名单,而不是他们的迭代器。你需要迭代器来允许你从列表中的一个项目移动到下一个项目,因为指针本身可能在内存中的任何地方。

+0

哦哇,是的,使用汽车实际上是有道理的,因为如你所说,只会有两个玩家。我认为我也有一些多态性问题,因为我不得不改变最后两行来动态地将我的实体*作为​​播放器*,但这已经奏效。非常感谢你,你已经迅速帮助我躲避另一个偏头痛。 – WearyWanderer

0

难道你不想要'++播放器'吗?

对不起,我应该更详细。我相信这个问题是你后索引球员

播放器使用* P2 = dynamic_cast的(球员++);

什么时候你真的想要'++ player'之类的东西。 因此,像

Player* p2 = dynamic_cast<Player*>(player) + 1; 

所以你投给玩家第一,然后索引到下一个玩家。

+0

我刚刚尝试过,但是当我这样做时,实际上并没有运行程序崩溃 – WearyWanderer

0

我认为主要的问题是在您的代码段的顶部:

for(Entity* player : entityList) 
{ 
    Player* p = dynamic_cast<Player*>(player); 
    Player* p2 = dynamic_cast<Player*>(player++); 

你迭代entryList然后检查p头是否遇到了任何的p2蛇件。但是,您必须在这里使用后增量运算符来玩一些不寻常的技巧。

我想你实际上想做的就是检查一些特定的演奏者的蛇头是否跑进任何其他球员蛇。记住这个想法的代码可能会避免后期增量操作符的使用,并且可以很好地扩展到更多的玩家。

+0

感谢您的替代设计方法。现在我想我已经有了基本的功能,我将尝试像这样重写它,以使代码更高效。 – WearyWanderer