Крестики-нолики черепахи питона

так что я новичок в 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"), это сработает. Я предполагаю, что переменная определяется быстро. Второй вопрос, который у меня есть, заключается в том, можно ли приостановить программу до тех пор, пока игрок не нажмет на поле, но важнее сначала рассмотреть первую проблему. Заранее спасибо:)

whichbox не может вернуться None. Кроме того, отрицательная координата x подозрительна. Разве вы не можете напечатать x и y, когда вызывается whatbox?
Jean-François Fabre 21.02.2019 22:31

вам нужно получить координаты x, y и отправить их в whatbox.

mauve 21.02.2019 22:32

да, я могу напечатать x и y, но это не то, к чему я стремлюсь. Извините, если этот вопрос глупый или очевидный, но, как я уже сказал, я не очень хорошо разбираюсь в программировании, так как я могу поместить x и y в переменную, не закончив программу?

twinnxx 21.02.2019 22:35

Это не тот пакет, который я использую, но я говорю, что вы ничего не отправляете в whatbox. Если результаты onscreenclick равны (x,y), вам нужно будет сделать: box = whichbox(onscreenclick[0], onscreenclick[1]) или изменить то, что ожидает функция. Как это сейчас написано, вы отправляете переменную whatbox (которая не является переменной) в функцию onscreenclick

mauve 21.02.2019 22:55
onscreenclick() просто запоминает указанную функцию для последующего использования всякий раз, когда происходит щелчок. Он не возвращает и принципиально НЕ МОЖЕТ возвращать что-либо о конкретном клике, потому что клика еще не произошло. Все, что вы хотите сделать в ответ на щелчок, должно полностью содержаться в вашей функции whichbox() — возвращать что-либо из нее бессмысленно.
jasonharper 21.02.2019 23:48

Вы неправильно понимаете, что делает onscreenclick((). Но это не имеет значения, поскольку это неправильный способ решить эту проблему. Вместо этого используйте сетку из девяти квадратных черепах и их отдельных обработчиков onclick(), чтобы избежать математики декодирования. Вот простой пример Клянусь, вчера я дал аналогичный комментарий к аналогичному вопросу от того же OP, но все это исчезло. Дежавю.

cdlane 23.02.2019 07:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
6
454
2

Ответы 2

Предполагая, что вы назвали свой экран () в модуле черепахи, вы должны затем поместить

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()

Декодирование позиции не требуется — мы позволяем черепашке сделать это за нас.

Другие вопросы по теме