#python #tkinter #tic-tac-toe
#python #tkinter #крестики-нолики
Вопрос:
итак, я создаю приложение для игры в крестики-нолики, чтобы узнать больше о Tkinter, и оно относительно работает, за исключением того факта, что x не может выиграть! Я закодировал o и x одинаково, но x не регистрируется. пришлось отрезать большую часть кода из-за переполнения стека, поэтому btn означает, что кнопка и флаг — это количество, а также щелчок, который я использовал для перехода от x к o.
код:
def btnClick(btns):
global click, flag, player2_name, player1_name, playerb, pa
if btns["text"] == " " and click == True:
btns["text"] = "X"
click = False
p1wins = player1_name.get() "wins!"
p2wins = player2_name.get() "wins!"
win()
flag = 1
elif btns["text"] == " " and click == False:
btns["text"] = "O"
click = True
win()
flag = 1
else:
tkinter.messagebox.showinfo("Tic-Tac-Toe", "Button already Clicked!")
def disableButton():
btn1.configure(state=DISABLED)
btn2.configure(state=DISABLED)
btn3.configure(state=DISABLED)
btn4.configure(state=DISABLED)
btn5.configure(state=DISABLED)
btn6.configure(state=DISABLED)
btn7.configure(state=DISABLED)
btn8.configure(state=DISABLED)
btn9.configure(state=DISABLED)
def win():
if (flag == 8):
tkinter.messagebox.showinfo("Tic-Tac-Toe", "It is a Tie")
elif (btn1['text'] == 'x' and btn2['text'] == 'x' and btn3['text'] == 'x' or
btn4['text'] == 'x' and btn5['text'] == 'x' and btn6['text'] == 'x' or
btn7['text'] == 'x' and btn8['text'] == 'x' and btn9['text'] == 'x' or
btn1['text'] == 'x' and btn5['text'] == 'x' and btn9['text'] == 'x' or
btn3['text'] == 'x' and btn5['text'] == 'x' and btn7['text'] == 'x' or
btn1['text'] == 'x' and btn2['text'] == 'x' and btn3['text'] == 'x' or
btn1['text'] == 'x' and btn4['text'] == 'x' and btn7['text'] == 'x' or
btn2['text'] == 'x' and btn5['text'] == 'x' and btn8['text'] == 'x' or
btn7['text'] == 'x' and btn6['text'] == 'x' and btn9['text'] == 'x'):
disableButton()
tkinter.messagebox.showinfo("Tic-Tac-Toe", "congrats %s!!" % (player1_name.get()))
elif (btn1['text'] == 'O' and btn2['text'] == 'O' and btn3['text'] == 'O' or
btn4['text'] == 'O' and btn5['text'] == 'O' and btn6['text'] == 'O' or
btn7['text'] == 'O' and btn8['text'] == 'O' and btn9['text'] == 'O' or
btn1['text'] == 'O' and btn5['text'] == 'O' and btn9['text'] == 'O' or
btn3['text'] == 'O' and btn5['text'] == 'O' and btn7['text'] == 'O' or
btn1['text'] == 'O' and btn2['text'] == 'O' and btn3['text'] == 'O' or
btn1['text'] == 'O' and btn4['text'] == 'O' and btn7['text'] == 'O' or
btn2['text'] == 'O' and btn5['text'] == 'O' and btn8['text'] == 'O' or
btn7['text'] == 'O' and btn6['text'] == 'O' and btn9['text'] == 'O'):
disableButton()
tkinter.messagebox.showinfo("Tic-Tac-Toe", "congrats %s!!" % (player2_name.get()))
Комментарии:
1. Вы настраиваете
X
и проверяетеx
. Эти символы не идентичны.2. Кстати, вместо
btn1
/btn2
/ etc подумайте о том, чтобы иметь список кнопок, так что этоbtns[0]
,btns[1]
, и т.д.; таким образом, вы можете перебирать их программно (for btn in btns: btn.configure(state=DISABLED)
)3. … аналогичным образом, вы могли бы выполнять другие проверки таким образом, вместо того, чтобы записывать их вручную. (Пример для горизонтального направления:
for row in (0,1,2): if btns[row*3 0]['text'] == btns[row*3 1] == btns[row*3 2] and btns[row*3]['text'] != " ": reportWin(btns[row*3]['text']); break
) — это также позволяет вам выполнять только один проход сравнения вместо одного дляX
s и другого дляO
s).