Dynamisch erzeugtes TicTacToe-Feld

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6880
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hi,

ein anderer Thread hat mich dazu angeregt, auch mal ein TicTacToe-Spiel zu implementieren. Ich habe angefangen mit einer Klasse, die ein quadratisches Feld mit beliebig großer Seitenlänge erstellt und schon weiß, welche Felderkombinationen zum Sieg führen können: Also alle Horizontalen, Vertikalen und bei den Diagonalen diejenigen, die durch's komplette Spielfeld verlaufen.

Das ganze funktioniert zwar, jedoch bin ich vom Code nicht ganz begeistert. Da ich bisher relativ wenige mathematische Sachen mit Python gemacht habe, kann ich mir vorstellen, dass noch die eine oder andere Optimierung möglich ist. Der Thread ist also als Feedback-Request gedacht. ;) Würde mich freuen, ein paar Anregungen zu erhalten. :)

Code
BlackJack

Also die Diagonalen sind suboptimal. Es gibt genau zwei und die kann man auch problemlos direkt bestimmen ohne dass man alles mögliche ausprobieren muss.

Letztlich würde ich das aber nicht vorberechnen. Irgendwann braucht man die Daten um die Felder zu testen und da könnte man auch gleich die Indices beim Testen erzeugen. Der Speicherverbrauch wiegt den Laufzeitgewinn, den man *vielleicht* hat, IMHO nicht auf.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Vorschlag:

Code: Alles auswählen

class Square:
    def __init__(self, n):
        self.n, self.fields = n, [0] * (n * n)
    
    def __getitem__(self, (x, y)):
        return self.fields[x + y * self.n]
    
    def row(self, y):
        for x in range(self.n): yield self[x, y]
        
    def col(self, x):
        for y in range(self.n): yield self[x, y]
    
    def dia(self, other):
        for x in range(self.n):
            yield self[self.n - x - 1 if other else x, x]
Stefan
Antworten