我正在尝试实施一个简单的tic tac toe程序,但很难实现游戏。这是我到目前为止的代码:
from Tkinter import *
click = False
class Buttons(object):
def __init__(self,master):
frame = Frame(master)
frame.pack()
self.button1= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button1.grid(row=0,column=0)
self.button2= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button2.grid(row=0,column=1)
self.button3= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button3.grid(row=0,column=2)
self.button4= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button4.grid(row=1,column=0)
self.button5= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button5.grid(row=1,column=1)
self.button6= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button6.grid(row=1,column=2)
self.button7= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button7.grid(row=2,column=0)
self.button8= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button8.grid(row=2,column=1)
self.button9= Button(frame,text=" ",height=4,width=8,
command=self.moveYes)
self.button9.grid(row=2,column=2)
def moveYes(self):
global click
global buttons
if buttons["text"] == " " and click == False:
buttons["text"]="X"
click= True
elif buttons["text"] == " " and click == True:
buttons["text"]="O"
root = Tk()
b=Buttons(root)
root.mainloop()
当我运行它时,它说:
global name 'buttons' is not defined
我想我的第二种方法并不正确。我不明白如何访问按钮并比较值,以便我可以更改文本。
现在,我应该从双播放器格式开始,然后再转移到AI吗?
答案 0 :(得分:2)
首先,每当你发现自己重复几乎相同的一行或多行代码时,你就需要编写某种循环。
其次,您可以通过将数据作为参数传递给command
函数来避免使用全局变量 - 这将使您的错误消失。
在这种情况下,它只是单击的按钮,可以通过使用按钮作为默认参数创建一个简短的lamdba
函数来完成。这必须在创建Tkinter Button
之后,因此需要在创建后单独config()
调用。传递这样的额外数据有时称为the extra arguments trick,可以扩展为包含其他感兴趣的项目,例如按钮的行和列(甚至是整个列表)。
from Tkinter import *
class Buttons(object):
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.buttons = []
for row in xrange(3):
for col in xrange(3):
button = Button(frame, text=" ", height=4, width=8)
button.config(command=lambda b=button: self.clicked(b))
button.grid(row=row, column=col)
self.buttons.append(button)
def clicked(self, button):
if button["text"] == " ":
button["text"] = "X"
else:
button["text"] = "O"
root = Tk()
b = Buttons(root)
root.mainloop()
现在基本的图形用户界面正在运行,并且只要用户单击网格位置就会调用一个函数,您就可以开始实现“游戏”了。这可以通过向clicked()
方法添加代码来完成,该方法会检查哪些位置填充了哪些字符("X"
或"O"
)并相应地做出响应。
我认为首先实施“AI”版本最简单,因为这样做需要的工作量最少。
答案 1 :(得分:1)
我认为问题在于您尝试将函数中的global
关键字分配给不存在的变量。
文件正文中没有buttons
变量。
答案 2 :(得分:0)
当您点击某个按钮时,该程序需要知道您点击了哪个按钮,这就是您尝试访问某个全球buttons
的原因,那就不需要了,您可以将按钮和其他任何需要的内容传递给命令处理程序,例如command=lambda self.click(self.button_x)
self.button1= Button(frame,
height=4, width=8,
text=' ',
command=lambda: self.click(self.button1)
)
这里是我在上面按钮命令中使用的click()
方法
def click(self, button):
"""
Dummy logic for demo, it toggles between O and X
"""
if button['text'] == ' ' or button['text'] == 'O':
button['text'] = 'X'
else:
button['text'] = 'O'
我运行程序,它的工作原理是按钮可以在X和O之间切换,这表明按钮命令工具,我将实际的tic tac toe游戏留给你强>