【问题标题】:Tkinter - making specific ranges of the window into variablesTkinter - 将窗口的特定范围变成变量
【发布时间】:2018-10-23 22:37:01
【问题描述】:

我正在 Tkinter 中制作井字游戏,它目前可以运行,但我希望代码能够识别何时单击窗口中的范围(例如 0、0、200、200),以便我可以更改变量.这样做的目的是让游戏知道什么时候连续出现三个。我的问题(如您在第 28 - 29 行中看到的,如果 self.clicked...)正在尝试创建一个变量(或其他解决方案),该变量将使窗口中的框的值为 0 或 1,具体取决于它们是否已被点击。请帮忙。

from tkinter import *


tk = Tk()
width = 600
third = width / 3
canvas = Canvas(width=width, height=width)
tk.title = "Tic Tac Toe"


line1 = canvas.create_line(200, 0, 200, 600)
line2 = canvas.create_line(400, 0, 400, 600)
line3 = canvas.create_line(0, 200, 600, 200)
line4 = canvas.create_line(0, 400, 600, 400)


class XsorOs:
    def __init__(self):
        self.turn = 0
        self.clicked = []

    def click(self, row, col):
        if (row, col) not in self.clicked:
            if self.turn is 0:
                canvas.create_line(col * third, row * third, (col + 1) * third, (row + 1) * third)
                canvas.create_line((col + 1) * third, row * third, col * third, (row + 1) * third)
                self.turn += 1
                if self.clicked in range(0, 0, 200, 200):
                    print('hi')

            elif self.turn is 1:
                canvas.create_oval(col * third + 5, row * third + 5, (col + 1) * third - 5, (row + 1) * third - 5)
                self.turn -= 1
            else:
                print("Game Over")
            self.clicked.append((row, col))


def mouse_click(c, event):
    col = int(event.x / third)
    row = int(event.y / third)
    c.click(row, col)


xo = XsorOs()
canvas.pack()
canvas.bind("<Button-1>", lambda event: mouse_click(xo, event))
canvas.mainloop()

在我弄清楚该怎么做之前,打印 hi 只是一个占位符。我希望它变成“将窗口的这一部分设为 1(从 0 开始)。”

【问题讨论】:

    标签: python tkinter graphics tic-tac-toe region


    【解决方案1】:

    我建议使用 3x3 数组来存储数据,然后使用一些if 语句来检测连续的 3 个。我记得在 tkinter 中创建井字游戏,这是我使用的方法。

    from tkinter import *
    
    tk = Tk()
    width = 600
    third = width / 3
    canvas = Canvas(width=width, height=width)
    tk.title = "Tic Tac Toe"
    
    line1 = canvas.create_line(200, 0, 200, 600)
    line2 = canvas.create_line(400, 0, 400, 600)
    line3 = canvas.create_line(0, 200, 600, 200)
    line4 = canvas.create_line(0, 400, 600, 400)
    
    game_board = [['' for x in range(3)] for y in range(3)]
    
    class XsorOs:
        def __init__(self):
            self.turn = 0
            self.clicked = []
        def click(self, row, col):
            if (row, col) not in self.clicked:
                if self.turn % 2 == 0:
                    canvas.create_line(col * third, row * third, (col + 1) * third, (row + 1) * third)
                    canvas.create_line((col + 1) * third, row * third, col * third, (row + 1) * third)
                    self.turn += 1
                    game_board[row][col] = 'x'
    
                elif self.turn % 2 == 1:
                    canvas.create_oval(col * third + 5, row * third + 5, (col + 1) * third - 5, (row + 1) * third - 5)
                    self.turn += 1
                    game_board[row][col] = 'o'
            ## add some if statements to detect diagonals, horizontals and verticals in a row.
    
    def mouse_click(c, event):
        col = int(event.x / third)
        row = int(event.y / third)
        c.click(row, col)
    
    
    xo = XsorOs()
    canvas.pack()
    canvas.bind("<Button-1>", lambda event: mouse_click(xo, event))
    canvas.mainloop()
    

    【讨论】:

    • 如何检测这些?我用这个试过了,但没有用。如果 game_board[row][col] 在 range(1, 1) 中是 'x' 并且 game_board[row][col] 在 range(1, 2) 中是 'x' 并且 game_board[row][col] 是 'x'在范围(1, 3): canvas.create_line(0, 100, 600, 100)
    • 很抱歉这样写,我不知道如何在 cmets 中格式化代码。如果您可以举一个检测水平第一行的示例,那将非常有帮助。另外,它不应该是 2 范围内的 x,因为它从 0 开始吗​​?
    • 水平线很容易,有一个范围为3的x循环然后有if game_board[x][0] == 'x' and game_board[x][1] == 'x' and game_board[x][2] == 'x': do_things()
    • 仅供参考,使用“1”键左侧的引号将您的 cmets 转换为代码。
    • 谢谢。那么这是否意味着它应该是game_board = [['' for x in range(3)] for y in range(3)] 而不是game_board = [['' for x in range(2)] for y in range(2)],因为数组/列表不是从0 开始的,所以range(2) 实际上是三个?
    猜你喜欢
    • 2018-04-03
    • 2016-05-10
    • 1970-01-01
    • 2010-12-03
    • 2013-05-03
    • 2021-10-20
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多