Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lehrkraefte:blc:informatik:ffprg1-2020:klassen [2020/03/02 08:13] Ivo Blöchliger [Aufgaben] |
lehrkraefte:blc:informatik:ffprg1-2020:klassen [2020/04/15 13:03] Ivo Blöchliger [Aufgaben] |
||
---|---|---|---|
Line 112: | Line 112: | ||
</ | </ | ||
+ | |||
+ | <hidden Lösungsvorschlag> | ||
+ | <code python tictactoe.py> | ||
+ | from gpanel import * | ||
+ | |||
+ | class TicTacToe: | ||
+ | # Konstruktur, | ||
+ | def __init__(self): | ||
+ | # leeres Feld, bestehend aus 3 Arrays mit 3 Einträgen | ||
+ | self.feld = [[0,0,0] for i in range(3)] | ||
+ | |||
+ | def handler(x, | ||
+ | self.onKlick(x, | ||
+ | | ||
+ | makeGPanel(0, | ||
+ | | ||
+ | |||
+ | def draw(self): | ||
+ | clear() | ||
+ | for i in range(1,3): | ||
+ | line(i, | ||
+ | line(0, | ||
+ | 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 = int(x) | ||
+ | y = int(y) | ||
+ | if (self.feld[x][y]==0): | ||
+ | self.set(x, | ||
+ | self.draw() | ||
+ | |||
+ | # Setze alle Einträge auf 0 | ||
+ | def clear(self): | ||
+ | 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 = [" ", " | ||
+ | res = "" | ||
+ | for y in range(3): | ||
+ | for x in range(3): | ||
+ | res += " " | ||
+ | if (x<2): | ||
+ | res += " | ||
+ | res += " | ||
+ | if (y<2): | ||
+ | res += " | ||
+ | return res | ||
+ | |||
+ | |||
+ | |||
+ | | ||
+ | # Setzt ein Feld, wenn es leer ist | ||
+ | def set(self, | ||
+ | if (self.feld[x][y]==0): | ||
+ | self.feld[x][y] = what | ||
+ | else: | ||
+ | raise RuntimeError(" | ||
+ | |||
+ | def isEmpty(self, | ||
+ | return self.feld[x][y]==0 | ||
+ | |||
+ | |||
+ | # Initialierung einer Instanz | ||
+ | t = TicTacToe() | ||
+ | # Ruft automatisch __str__ auf, zur Umwandlung in einen String | ||
+ | print(t) | ||
+ | t.set(1, | ||
+ | print(t) | ||
+ | t.set(0, | ||
+ | print(t) | ||
+ | t.draw() | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * Fügen Sie eine weitere Instanz-Variable hinzu, die speichert, wer gerade an der Reihe ist, damit mit der Maus abwechslungsweise ein Kreis und ein Kreuz gesetzt werden kann. | ||
+ | * Fügen Sie eine Überprüfung hinzu, ob jemand schon gewonnen hat. Sie sollten dazu möglichst wenig Code kopieren. Idee: Eine Funktion, die Start-Koordinaten und einen Vektor bekommt, in welche Richtung 3 Felder überprüft werden sollen. | ||
+ | |||
+ | <hidden minimal spielbare Version> | ||
+ | <code python tictactoe.py> | ||
+ | from gpanel import * | ||
+ | |||
+ | |||
+ | class TicTacToe: | ||
+ | # Konstruktur, | ||
+ | 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, | ||
+ | self.onKlick(x, | ||
+ | | ||
+ | makeGPanel(0, | ||
+ | | ||
+ | |||
+ | def draw(self): | ||
+ | clear() | ||
+ | for i in range(1,3): | ||
+ | line(i, | ||
+ | line(0, | ||
+ | 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, | ||
+ | if self.winner()> | ||
+ | # 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, | ||
+ | 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 = [" ", " | ||
+ | res = "" | ||
+ | for y in range(3): | ||
+ | for x in range(3): | ||
+ | res += " " | ||
+ | if (x<2): | ||
+ | res += " | ||
+ | res += " | ||
+ | if (y<2): | ||
+ | res += " | ||
+ | return res | ||
+ | |||
+ | def check(self, | ||
+ | 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, | ||
+ | if w>0: | ||
+ | return w | ||
+ | # Vertikal | ||
+ | w = self.check((i, | ||
+ | if w>0: | ||
+ | return w | ||
+ | # erste Diagonale | ||
+ | w = self.check((0, | ||
+ | if w>0: | ||
+ | return w | ||
+ | # zweite Diagonale | ||
+ | w = self.check((0, | ||
+ | if w>0: | ||
+ | return w | ||
+ | | ||
+ | |||
+ | | ||
+ | # Setzt ein Feld, wenn es leer ist | ||
+ | def set(self, | ||
+ | if (self.feld[x][y]==0): | ||
+ | self.feld[x][y] = what | ||
+ | else: | ||
+ | raise RuntimeError(" | ||
+ | |||
+ | def isEmpty(self, | ||
+ | return self.feld[x][y]==0 | ||
+ | |||
+ | |||
+ | # Initialierung einer Instanz | ||
+ | t = TicTacToe() | ||
+ | # Ruft automatisch __str__ auf, zur Umwandlung in einen String | ||
+ | t.draw() | ||
+ | |||
+ | </ | ||
+ | </ | ||