首页 > 解决方案 > 如何让我的鼠标左键在 tkinter、python 的棋盘井字游戏中画一个圆圈

问题描述

这是我的代码,玩家可以在其中选择圆的位置。现在的目标是我的鼠标左键单击指示圆圈的位置。我对 def motion 有一个想法,但我不知道如何展望它。任何想法

'''代码'''

import tkinter              
root=tkinter.Tk(
#let's create background

finestra = tkinter.Canvas(root,
borderwidth = 0, 
background = 'blue',
cursor = 'circle', 
height=600, 
width=600)
def ini_finestra(finestra):
    finestra
    finestra.pack()
ini_finestra(finestra)

alturay=0
dx=0

def ini_graella(): #draw the board
# create horizontal line

    finestra.create_line(75,75+alturay ,
                    525, 75+alturay,                   
                    fill = 'red',
                    width = '5')
# draw vertical line
    finestra.create_line(75+dx,75 ,
                    75+dx,525 ,                   
                    fill = 'red',
                    width = '5')
linia=4     
while linia>0:
    ini_graella()
    linia=linia-1
    alturay=alturay+150
    dx=dx+150
    
    AX=0
    AY=0
    def marca_casella1():
        finestra.create_oval(75+75,75+75,
                       225,225+AX,
                       fill='green',
                        width='0')

    
def player_1():
    finestra.create_oval(75+150*(torn_player_1_fila-1),75+150*(torn_player_1_columna-1),
                        (150+75)+150*(torn_player_1_fila-1),(225)+150*(torn_player_1_columna-1),
                        fill="green",
                        width=3)
def player_2():   
    finestra.create_oval(75+150*(torn_player_2_fila-1),75+150*(torn_player_2_columna-1),
                        (150+75)+ 150*(torn_player_2_fila-1),(150+75)+150*(torn_player_2_columna-1),
                        fill="grey",
                         width=3)
posicion=2
while posicion>0:
    torn_player_1_fila=int(input("Player 1 elige la fila de tu ficha"))
    torn_player_1_columna=int(input("Player 1 elige la columna tu ficha"))
    torn_player_2_fila=int(input("Player 2 elige la fila de tu ficha"))
    torn_player_2_columna=int(input("Player 2 elige la columna de tu ficha"))
    player_1()
    player_2()
    posicion=posicion-2
    

finestra.mainloop()

你知道我应该做什么吗?

标签: pythontkintertic-tac-toe

解决方案


def draw_circle_in_box(x, y):
    offset_x, offset_y = 75, 75
    box_size = 150

    box_x_id = (x - offset_x) // box_size
    box_y_id = (y - offset_y) // box_size

    if box_x_id > 2 or box_x_id < 0 or box_y_id > 2 or box_y_id < 0:
        return # Out of bounds

    finestra.create_oval(box_x_id * box_size + offset_x,
                         box_y_id * box_size + offset_y,
                         box_x_id * box_size + offset_x + box_size,
                         box_y_id * box_size + offset_y + box_size,
                         fill="grey",
                         width=3)


def click_callback(event):
    draw_circle_in_box(event.x, event.y)


finestra.bind("<Button-1>", click_callback)

至于具有正确颜色的圆圈,并且您注册它已被正确的玩家输入,您应该click_callback()变成一个将成为游戏类的一部分的方法,它可以像您一样访问当前玩家将其存储为属性。除了全局变量(由于许多原因,这被认为是不好的做法)之外,没有其他简单的方法可以让您知道给它什么颜色。

我没有为你实现它,因为它意味着要大量重构你的代码,而且我不会为你编写看起来像是学校项目的东西。如果你不能让你的新代码工作,请打开另一个线程。


推荐阅读