簡體   English   中英

比較兩個單獨對象中的兩個列表

[英]Comparing two lists inside two separate objects

好的,所以經過多次嘗試,我一直在努力解決這個問題。 為了提供一些背景知識,並希望對這個問題有一個適當的了解,我將解釋如何設置我的代碼。

  • 我有一個指向player_的指針列表,其中包含兩個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的列表,但是如果有人可以幫忙照亮它,將不勝感激:)

您不想要“ ++ player”嗎?

抱歉,我應該更詳細些。 我認為這個問題是您在使用 ,你的球員索引

播放器* p2 = dynamic_cast(player ++);

當您真正想要“ ++ player”之類的東西時。 所以像

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

因此,您首先投射到播放器,然后索引到下一個播放器。

我認為主要的問題是您的代碼片段的頂部:

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

您迭代entryList ,然后檢查p的頭部是否遇到p2任何蛇形碎片。 但是,您必須在此處使用后增量運算符來玩一些不尋常的技巧。

我認為您真正想做的是檢查某個給定玩家的蛇頭是否撞到其他任何玩家的蛇頭。 考慮到這一點編寫代碼可能會避免后遞增運算符的使用,並且可以很好地擴展到更多的玩家。

如果列表中只有(並且永遠只有)兩個Player對象,那么您可以像這樣獲得兩個Player:

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

這不會進行任何錯誤檢查,因此如果列表中的玩家少於兩個,它將崩潰。 如果列表中可以有兩個以上的玩家,則需要使用嵌套循環將每個玩家與其他每個玩家進行比較。

原始版本無法正常工作的原因(除了在錯誤位置的后遞增)是基於范圍的for (for x : y)返回列表中的實際對象,而不是其迭代器。 您需要迭代器,以允許您遞增以從列表中的一項移至下一項,因為指針本身可以在內存中的任何位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM