Das Problem kommt von der Art, wie Sie die Variablen aus der Klasse Strategy
definiert haben. Durch sie auf diese Weise zu definieren:
class Strategy(object):
turn_number = 1
moves = []
opponent_moves = []
total_points = 0
opponent_points = 0
Alle werden diese Variablen durch alle Instanzen der Klasse geteilt werden Strategy
(oder irgendetwas davon die Unterklassen). Das macht es so, dass self.opponent_moves
die Züge vom Gegner nicht speichert, es speichert die Züge von beiden Spielern (da sie diese Variable teilen, wenn jedes die Methode update
aufruft), deshalb gibt die Methode get_move
von TitForTat
den letzten Zug aus dem zurück SecondStrat
anstelle des letzten Zuges vom Gegner.
Ihr Problem zu lösen, definieren sie nur als Klassenvariablen innerhalb der __init__
:
class Strategy(object):
def __init__(self):
self.turn_number = 1
self.moves = []
self.opponent_moves = []
self.total_points = 0
self.opponent_points = 0
Und es wird gut funktionieren.
Ich weiß, was das Problem ist, aber ich habe keine Ahnung, warum es passiert, damit jemand anderes uns beide erleuchten kann. – Ulisha
Problem kommt mit der Vererbung. Sowohl "TitForTat" als auch "Defector" scheinen die Ressourcen von "Strategy" zu teilen. Mit anderen Worten, sie rufen dieselbe "update" -Methode auf, die die selbe 'self.opponent_moves' modifiziert, so dass 'self.opponent_moves' nicht die gegnerischen Züge hat, sondern die Züge von beiden Spielern, die Methode' get_move' renderend von 'TitForTat', um immer den Wechsel vom' SecondStrat' zu bekommen. – Ulisha