2017-06-16 63 views
0

我有一個For Loop,它可以處理從主牌中獲得牌並將它們以隨機順序放入牌手套牌中。代碼是:For Loop isnt沒有完全完成

for(int a = 0; a < deckManager.DeckAllCardsPlayer.Count; a++){ 
     int b = Random.Range(0, deckManager.DeckAllCardsPlayer.Count); 
      if(!PlayerDeck.Contains(deckManager.DeckAllCardsPlayer[b])){ 
      PlayerDeck.Add(deckManager.DeckAllCardsPlayer[b]); 
      deckManager.DeckAllCardsPlayer.RemoveAt(b); 
     } 
    } 

在主卡組中有16張卡,但是這個for循環只有8卡。有人可以找出原因嗎?最初,它多次添加一些卡片,這就是爲什麼我添加了'!PlayerDeck.Contains'聲明的原因。我不知道爲什麼它只做16中的8個。

+1

不要從正在迭代的集合中移除項目。只需洗牌吧。 [這裏的東西可能有所幫助](https://stackoverflow.com/q/273313/301857)。 –

回答

4

問題是deckManager.DeckAllCardsPlayer.Count在每次迭代中越來越小。試試這個:

while (deckManager.DeckAllCardsPlayer.Count > 0) { 
    int b = Random.Range(0, deckManager.DeckAllCardsPlayer.Count); 
    PlayerDeck.Add(deckManager.DeckAllCardsPlayer[b]); 
    deckManager.DeckAllCardsPlayer.RemoveAt(b); 
} 

我刪除了條件,因爲它不應該是必要的。 (除非起始甲板有重複?如果是這樣,只需重新放入。)

+0

我喜歡使用while循環表達的意圖 - 明確表示DeckAllCardsPlayer正在縮小,並且一直持續下去,直到它爲空。 –

3

您從16張卡開始,但每次移除一張。

因此,雖然每次迭代減少一次,但deckManager.DeckAllCardsPlayer.Count的值變爲下降

經過8次迭代後,a爲7,但DeckAllCardsPlayer的大小已減少到8.因此,該循環在下一回閤中終止。

一個解決辦法是採取計達陣,並存儲在一個整數:

int totalCards = deckManager.DeckAllCardsPlayer.Count; 
for(int a = 0; a < totalCards; a++){ 
    ... etc. 

雖然有很多其他方式,具體取決於您要公開的邏輯。

這個問題可能會有所啓發:Is the condition in a for loop evaluated each iteration?

1

的上界或循環的限制,你從甲板中取出卡片正在發生變化。 要只有2行代碼更改修復它, 試試這個

int count = deckManager.DeckAllCardsPlayer.Count; 
for(int a = 0; a < count; a++){ 
     int b = Random.Range(0, deckManager.DeckAllCardsPlayer.Count); 
      if(!PlayerDeck.Contains(deckManager.DeckAllCardsPlayer[b])){ 
      PlayerDeck.Add(deckManager.DeckAllCardsPlayer[b]); 
      deckManager.DeckAllCardsPlayer.RemoveAt(b); 
     } 
    } 
0
int count = deckManager.DeckAllCardsPlayer.Count; 
for(int a = 0; a < count; a++){ 
     int b = Random.Range(0, deckManager.DeckAllCardsPlayer.Count); 
      if(!PlayerDeck.Contains(deckManager.DeckAllCardsPlayer[b])){ 
      PlayerDeck.Add(deckManager.DeckAllCardsPlayer[b]); 
      deckManager.DeckAllCardsPlayer.RemoveAt(b); 
     } 
    } 

您必須使用計數變量。因爲deckManager.DeckAllCardsPlayer.Count將在運行deckManager.DeckAllCardsPlayer.RemoveAt(b)後更改。我希望它能爲你工作。

1

假設PlayerDeck & deckManager.DeckAllCardsPlayer都列表,然後只是這樣做:

PlayerDeck.AddRange(deckManager.DeckAllCardsPlayer.OrderBy(x => Random.value)); 
deckManager.DeckAllCardsPlayer.Clear(); 

那麼你不必擔心刪除元素,而你遍歷(你應該永遠不會做)。