简单的Tictactoe计划

时间:2016-06-19 14:17:58

标签: python python-2.7 tkinter tic-tac-toe

我正在尝试实施一个简单的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吗?

3 个答案:

答案 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游戏留给你