2017-11-06 4 views
-1

Ich schreibe eine Python-Version des Brettspiels Onitama, und ich versuche zur Zeit, eine Funktion zu schreiben, um die Karten zu mischen:Index außerhalb des zulässigen Bereichs Fehler in Deck Umordnungsalgorithmus

temp_deck = onitama_deck.deck 
print(temp_deck) 
print(len(onitama_deck.deck)) 
print(len(temp_deck)) 
for i in range(len(temp_deck)): 
    next_card = temp_deck[random.randrange(0, len(temp_deck))] 
    deck.deck[i] = next_card 
    temp_deck.remove(next_card) 
print(onitama_deck.deck) 

Beide onitama_deck.deck und temp_deck sind Listen, aber wenn ich das Programm mit einem Deck laufen die Werte von 1 bis 10 enthält, erhalte ich die folgende Ausgabe:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
10 
10 
Traceback (most recent call last): 
    File "onitama.py", line 33, in <module> 
    deck.shuffle() 
    File "onitama.py", line 25, in shuffle 
    onitama_deck.deck[i] = next_card 
IndexError: list assignment index out of range 

zuerst habe ich mich gefragt, warum ich war zu groß, so Ich habe versucht, beide Listen zu drucken. Aus irgendeinem Grund Iteration jeweils die niedrigste ungerade Zahl von temp_deck entfernt wird, und dann onitama_deck.deck wird gleich temp_deck, wie folgt aus:

iteration: 1 
temp_deck: [2, 3, 4, 5, 6, 7, 8, 9, 10] 
deck: [2, 3, 4, 5, 6, 7, 8, 9, 10] 

iteration: 2 
temp_deck: [2, 4, 5, 6, 7, 8, 9, 10] 
deck: [2, 4, 5, 6, 7, 8, 9, 10] 

iteration: 3 
temp_deck: [2, 4, 6, 7, 8, 9, 10] 
deck: [2, 4, 6, 7, 8, 9, 10] 

iteration: 4 
temp_deck: [2, 4, 6, 8, 9, 10] 
deck: [2, 4, 6, 8, 9, 10] 

iteration: 5 
temp_deck: [2, 4, 6, 8, 10] 
deck: [2, 4, 6, 8, 10] 

Und dann bekomme ich den Index aus Bereichsfehler. Kannst du den Fehler in meiner Logik trotzdem erklären? Danke für die Hilfe.

+1

Wie erwarten Sie, dass wir Ihnen helfen, wenn Sie den Code nicht anzeigen, von dem der Fehler stammt? – Julien

+0

Warum nicht einfach random.shuffle() verwenden, dafür ist es gedacht. –

Antwort

2

Das Problem ist, dass temp_deck keine Kopie des Decks ist, aber es ist ein Verweis auf das gleichen Deck:

temp_deck = onitama_deck.deck 

Um eine Kopie zu machen, können Sie dies ändern:

temp_deck = list(onitama_deck.deck) 
Verwandte Themen