ich habe auch mal ein Tic Tac Toe-Spiel programmieren wollen, und hab es eben gemacht.
Ob der Code sehr schön und ansehnlich ist, bezweifle ich.
Ich weiß auch, dass "global" eine "böse"

Ich glaube auch das der Bug an den globals liegt, nur wie ich ihn beheben soll, weiß ich eben nicht.
Das Spiel an sich ist funktionsfähig, bei 2 Spielern funktioniert es auch. (Änderbar recht weit unten bei "playernumber=1")
Und hier ist eben der Code (für konstruktive Kritik zur Verbesserung bin ich dankbar):
Code: Alles auswählen
import Tkinter as tk
class tictactoe_field():
def __init__(self,zahl,anzahl):
self.zahl=zahl
self.but=0
self.anzahl=int(anzahl**0.5)
def create(self):
self.but=tk.Button(root,text='',width=10,height=5)
self.but.grid(row=(self.zahl-1)/self.anzahl,column=(self.zahl+(self.anzahl-1))%self.anzahl)
def change(self):
global activeplayer,playernumber
if fields[self.zahl].but["text"]=='':
fields[self.zahl].but.config(text=activeplayer)
fields[self.zahl].but["state"]='disabled'
winner(winlist,anzahl)
if activeplayer==True:
activeplayer=False
if playernumber==1:
opponent(winlist,opplist)
else:
activeplayer=True
def winner(winlist,anzahl):
finished=0
all_disabled=1
for i in winlist:
if fields[i[0]].but["text"]!='' and fields[i[0]].but["text"]==fields[i[1]].but["text"] and fields[i[0]].but["text"]==fields[i[2]].but["text"]:
winner=int(fields[i[0]].but["text"])
tk.Label.config(winlabel,text='Spieler '+str(winner)+' hat gewonnen')
for k in range(1,anzahl+1):
if fields[k].but["state"]=='normal':
fields[k].but["state"]='disabled'
finished=1
break
for k in range(1,anzahl+1):
if fields[k].but["state"]=='normal':
all_disabled=0
break
if finished==0 and all_disabled==1:
tk.Label.config(winlabel,text='Niemand hat gewonnen')
def opponent(winlist,opplist):
global activeplayer
print activeplayer
was_set=0
for i in winlist:
for k in range(len(i)):
l=(k+1)%3
m=(k+2)%3
if fields[i[k]].but["text"]!='' and fields[i[k]].but["text"]==fields[i[l]].but["text"] :
tictactoe_field.change(fields[i[m]])
was_set=1
break
if was_set==0:
for i in opplist:
if fields[i].but["text"]=='':
tictactoe_field.change(fields[i])
break
root=tk.Tk()
root.title('Tic Tac Toe')
playernumber=1
fields=dict()
anzahl=9
activeplayer=True
winlist=[[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]
opplist=[5,1,3,7,9,2,4,6,8]
for i in range(1,anzahl+1):
fields[i]=tictactoe_field(i,anzahl)
tictactoe_field.create(fields[i])
fields[i].but.config(command=lambda arg=fields[i]:tictactoe_field.change(arg))
winlabel=tk.Label(root,text='')
winlabel.grid(row=3,column=0,columnspan=3)
root.mainloop()