所以我是python的新手,我用与您对战的Ai编写了一个井字游戏。因此一切正常,但是我使用文本框通知Ai玩家选择了什么。现在,我想升级我的游戏,以便玩家可以单击要填充的框,而不是在文本框中键入它。所以我的想法是使用onscreenclick()
,但是我遇到了一些问题。 onscreenclick()
返回在画布上单击的坐标,我想使用一个函数来确定玩家单击了哪个框
我知道了:
from turtle import *
def whichbox(x,y): #obviously i got 9 boxes but this is just an example for box 1
if x<-40 and x>-120:
if y>40 and y<120:
return 1
else:
return 0
else:
return 0
box=onscreenclick(whichbox)
print(box)
很明显,在这种情况下,我希望box为0或1,但是box的值为None
。有谁知道如何解决这一问题?它必须对变量box
进行某些操作,因为如果将return 1
替换为print("1")
,则它可以工作。我假设该变量被快速定义。我的第二个问题是,是否有可能暂停编程,直到玩家单击一个框,但更重要的是首先查看第一个问题。在此先感谢:)
答案 0 :(得分:1)
假设您已在turtle模块中命名了Screen(),则应放置
screen.onscreenclick(whichbox)
代替:
onscreenclick(whichbox)
示例:
from turtle import Turtle, Screen
turtle = Turtle()
screen = Screen()
def ExampleFunction():
return 7
screen.onscreenclick(ExampleFunction)
此外,当jasonharper说onscreenclick()函数无法返回任何值时,他是正确的。这样,您可以在函数whichbox()中包含一个打印函数,以便打印出一个值,例如:
def whichbox(x,y):
if x<-40 and x>-120:
if y>40 and y<120:
print(1)
return 1
else:
print(0)
return 0
else:
print(0)
return 0
或者,如果要将打印语句保留在whichbox()之外,则还可以执行以下操作:
screen.onscreenclick(lambda x, y: print(whichbox(x, y)))
创建一个lambda函数,该函数将onscreenclick()中的(x,y)赋予包含whichbox()的打印语句。
答案 1 :(得分:1)
这是the code I linked to in my comment中的一个简化示例。如果单击一个正方形,它将在控制台窗口中显示其编号,从0到8:
from turtle import Turtle, mainloop
CURSOR_SIZE = 20
SQUARE_SIZE = 60
def drawBoard():
for j in range(3):
for i in range(3):
square = Turtle('square', visible=False)
square.shapesize(SQUARE_SIZE / CURSOR_SIZE)
square.fillcolor('white')
square.penup()
square.goto((i - 1) * (SQUARE_SIZE + 2), (j - 1) * (SQUARE_SIZE + 2))
number = j * 3 + i
square.onclick(lambda x, y, number=number: whichsquare(number))
square.showturtle()
def whichsquare(number):
print(number)
drawBoard()
mainloop()
不涉及位置解码-我们让乌龟为我们处理。