Code: Alles auswählen
from itertools import cycle
from functools import partial
import tkinter as tk
FENSTER_TITLE = "TickTackToe Spiel"
class TickTackToe(object):
LEER = "leer.png"
KREIS = "kreis.png"
KREUZ = "kreuz.png"
REIHEN = [
[(0,0), (0,1), (0,2)],
[(1,0), (1,1), (1,2)],
[(2,0), (2,1), (2,2)],
[(0,0), (1,0), (2,0)],
[(0,1), (1,1), (2,1)],
[(0,2), (1,2), (2,2)],
[(0,0), (1,1), (2,2)],
[(0,2), (1,1), (2,0)],
]
def __init__(self, fenster):
self.fenster = fenster
self.images = {
None: tk.PhotoImage(file=self.LEER),
'Kreis': tk.PhotoImage(file=self.KREIS),
'Kreuz': tk.PhotoImage(file=self.KREUZ),
}
self.knoepfe = dict()
self.runden = 0
self.spieler = cycle(['Kreis', 'Kreuz'])
self.feld_bauen()
def feld_bauen(self):
self.melde_text_var = tk.StringVar(self.fenster, "Neues Spiel")
meldung = tk.Label( self.fenster, textvariable=self.melde_text_var,
font=('Helvetica', 12, 'bold'))
meldung.pack(pady=4)
knopf_rahmen = tk.Frame(self.fenster)
knopf_rahmen.pack()
for reihe in range(3):
for zeile in range(3):
knopf_widget = tk.Button(knopf_rahmen, image=self.images[None],
highlightthickness=0, bg='white', command=partial(self.knopf_druck, (reihe, zeile)))
knopf_widget.grid(row=reihe, column=zeile)
knopf_widget.status = None
self.knoepfe[reihe, zeile] = knopf_widget
self.reset_button = tk.Button(self.fenster, text="Wiederholung?",
bg="yellow", command=self.reset_command)
def set_status(self, key, status):
self.knoepfe[key].status = status
self.knoepfe[key]['image'] = self.images[status]
def reset_command(self):
for key in self.knoepfe:
self.set_status(key, None)
self.runden = 0
self.melde_text_var.set("Neues Spiel")
self.reset_button.pack_forget()
def knopf_druck(self, knopf):
print("Knopf gedrückt:", knopf)
status = next(self.spieler)
self.set_status(knopf, status)
if any(all(self.knoepfe[r].status == status for r in row)
for row in self.REIHEN):
self.melde_text_var.set("Gewinner: {}".format(status))
self.reset_button.pack(pady=4)
else:
self.runden += 1
if self.runden==9:
self.melde_text_var.set("Unentschieden")
self.reset_button.pack(pady=4)
def main():
fenster = tk.Tk()
fenster.title(FENSTER_TITLE)
app = TickTackToe(fenster)
fenster.mainloop()
if __name__ == '__main__':
main()