from gpanel import * class TicTacToe: # Konstruktur, wird bei der Kreation der Instanz aufgerufen def __init__(self): # leeres Feld, bestehend aus 3 Arrays mit 3 Einträgen self.feld = [[0,0,0] for i in range(3)] self.clear() def handler(x,y): self.onKlick(x,y) makeGPanel(0, 2.99, 0, 2.99, mousePressed = handler) def draw(self): clear() for i in range(1,3): line(i,0,i,3) line(0,i,3,i) for x in range(3): for y in range(3): if self.feld[x][y]==1: move(x+0.5, y+0.5) circle(0.4) elif self.feld[x][y]==2: line(x+0.1, y+0.1, x+0.9, y+0.9) line(x+0.1, y+0.9, x+0.9, y+0.1) def onKlick(self,x,y): if self.winner()>0 or self.placed==9: # 1 Sekunde warten self.clear() self.draw() return x = int(x) y = int(y) if (self.feld[x][y]==0): self.placed += 1 self.set(x,y,self.player) self.draw() self.player = 3-self.player # Setze alle Einträge auf 0 def clear(self): self.player = 1 self.placed = 0 for x in range(3): for y in range(3): self.feld[x][y] = 0 # Standard-Methode zur Umwandlung in einen String, wird von print verwendet def __str__(self): symbols = [" ", "O", "X"] res = "" for y in range(3): for x in range(3): res += " "+symbols[self.feld[x][y]]+" " if (x<2): res += "|" res += "\n" if (y<2): res += "---+---+---\n" return res def check(self,p,v): feld = self.feld[p[0]][p[1]] if feld==0: return 0 # Liste/Array kopieren p = [p[i] for i in range(len(p))] for i in range(2): # Punkt vorruecken for j in range(2): p[j] += v[j] if self.feld[p[0]][p[1]]!=feld: return 0 return feld # Liefert 0 (kein Gewinner) oder die Nummer 1 oder 2, wenn jemand gewonnen hat def winner(self): for i in range(3): # Horizontal w = self.check((0,i),(1,0)) if w>0: return w # Vertikal w = self.check((i,0),(0,1)) if w>0: return w # erste Diagonale w = self.check((0,0),(1,1)) if w>0: return w # zweite Diagonale w = self.check((0,2),(1,-1)) if w>0: return w # Setzt ein Feld, wenn es leer ist def set(self,x,y,what): if (self.feld[x][y]==0): self.feld[x][y] = what else: raise RuntimeError("Feld (%d, %d) ist schon mit %d belegt!" % (x,y,self.feld[x][y])) def isEmpty(self,x,y): return self.feld[x][y]==0 # Initialierung einer Instanz t = TicTacToe() # Ruft automatisch __str__ auf, zur Umwandlung in einen String t.draw()