так что я новичок в python, и я запрограммировал крестики-нолики с ИИ, который играет против вас. Итак, все работает, но я использовал текстовые поля, чтобы сообщить ИИ, что выбрал игрок. Теперь я хочу обновить свою игру, чтобы игрок мог щелкнуть поле, которое он хочет заполнить, вместо того, чтобы вводить его в текстовое поле. Итак, моя идея состояла в том, чтобы использовать 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)
Очевидно, что в этом случае я хочу, чтобы поле было равно 0 или 1, но вместо этого значение поля равно None. Кто-нибудь знает, как это исправить? Он должен что-то делать с переменной box, потому что если заменить return 1 на print("1"), это сработает. Я предполагаю, что переменная определяется быстро. Второй вопрос, который у меня есть, заключается в том, можно ли приостановить программу до тех пор, пока игрок не нажмет на поле, но важнее сначала рассмотреть первую проблему. Заранее спасибо:)
вам нужно получить координаты x, y и отправить их в whatbox.
да, я могу напечатать x и y, но это не то, к чему я стремлюсь. Извините, если этот вопрос глупый или очевидный, но, как я уже сказал, я не очень хорошо разбираюсь в программировании, так как я могу поместить x и y в переменную, не закончив программу?
Это не тот пакет, который я использую, но я говорю, что вы ничего не отправляете в whatbox. Если результаты onscreenclick равны (x,y), вам нужно будет сделать: box = whichbox(onscreenclick[0], onscreenclick[1]) или изменить то, что ожидает функция. Как это сейчас написано, вы отправляете переменную whatbox (которая не является переменной) в функцию onscreenclick
onscreenclick() просто запоминает указанную функцию для последующего использования всякий раз, когда происходит щелчок. Он не возвращает и принципиально НЕ МОЖЕТ возвращать что-либо о конкретном клике, потому что клика еще не произошло. Все, что вы хотите сделать в ответ на щелчок, должно полностью содержаться в вашей функции whichbox() — возвращать что-либо из нее бессмысленно.
Вы неправильно понимаете, что делает onscreenclick((). Но это не имеет значения, поскольку это неправильный способ решить эту проблему. Вместо этого используйте сетку из девяти квадратных черепах и их отдельных обработчиков onclick(), чтобы избежать математики декодирования. Вот простой пример Клянусь, вчера я дал аналогичный комментарий к аналогичному вопросу от того же OP, но все это исчезло. Дежавю.






Предполагая, что вы назвали свой экран () в модуле черепахи, вы должны затем поместить
screen.onscreenclick(whichbox)
вместо:
onscreenclick(whichbox)
Пример:
from turtle import Turtle, Screen
turtle = Turtle()
screen = Screen()
def ExampleFunction():
return 7
screen.onscreenclick(ExampleFunction)
Кроме того, Джейсон Харпер прав, когда говорит, что функция onscreenclick() не может вернуть никакого значения. Таким образом, вы можете включить функцию печати в свою функцию whatbox(), чтобы распечатать значение, например:
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)))
который создает лямбда-функцию, которая возвращает (x, y) из onscreenclick() в оператор печати, содержащий whatbox().
Вот урезанный пример из код, на который я ссылался в своем комментарии. Если вы нажмете на квадрат, он выведет в окно консоли его номер от 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()
Декодирование позиции не требуется — мы позволяем черепашке сделать это за нас.
whichboxне может вернутьсяNone. Кроме того, отрицательная координата x подозрительна. Разве вы не можете напечатать x и y, когда вызывается whatbox?