Python черепаха: если утверждение с позицией иногда работает, а иногда нет - PullRequest
0 голосов
/ 05 марта 2020

Я делаю приключение / настольную игру, где игрок может собрать предмет, если он наступит на него. Поэтому я сделал функцию check_item(), чтобы проверить это:

def check_is_inside_screen(check_x, check_y):
    if check_x < -450 or check_x > 450 or check_y < -350 or check_y > 300:
        return False
    return True

def check_item(player_x, player_y):

    global pick_armor, pick_key, pick_sword

    if not pick_armor and -395 < player_x < -405 and 270 < player_y < 280:
        armor.hideturtle()
        pick_armor = True
    elif not pick_sword and 395 < player_x < 405 and 270 < player_y < 280:
        sword.hideturtle()
        pick_sword = True
    elif not pick_key and 395 < player_x < 405 and -320 < player_y < -330:
        key.goto(400, 325)
        pick_key = True

def move(move_x, move_y):
    player.forward(-100)
    px, py = player.pos()
    if not check_is_inside_screen(px, py):
        player.forward(100)
        return
    check_item(px, py)

def movePlayer():
    player.onclick(move, 1)

Дело в том, что иногда это работает, а иногда нет. Я играю в тестовую игру, и иногда armor черепаха успешно скрыта, иногда просто нет. Также объект sword обычно не скрыт, а key просто не работает. Я пытался избавиться от логических параметров, но ничего не работает. Также может быть полезно знать, что функция вызывается внутри функции move(), которая вызывается из события onclick(). По сути, всякий раз, когда я нажимаю на объект игрока, он перемещается и после этого проверяет позицию.

1 Ответ

1 голос
/ 06 марта 2020

Во-первых, черепахи ползают на плоскости с плавающей запятой , поэтому такие тесты иногда будут работать, а иногда и не пройдут:

x == -400 and y == 275

, поскольку x может вернуться как -400.0001. Вы можете привести точки к целым числам:

int(x) == -400 and int(y) == 245

или проверить, попадают ли позиции в диапазон значений.

Во-вторых, этот код в вашей функции move() подозрительный:

    player.forward(100)
    return
    tx, ty = player.pos()
    check_item(tx, ty)

Не должно быть кода после return на том же уровне отступа - он никогда не будет выполнен. Я ожидал бы, что ваш код будет выглядеть примерно так:

def check_item(x, y):

    global pick_armor, pick_key, pick_sword

    x = int(x)
    y = int(y)

    if not pick_armor and x == -400 and y == 275:
        armor.hideturtle()
        pick_armor = True
    elif not pick_sword and x == 400 and y == 275:
        sword.hideturtle()
        pick_sword = True
    elif not pick_key and x == 400 and y == -325:
        key.goto(400, 300)
        pick_key = True

def move(x, y):

    player.forward(-100)

    tx, ty = player.pos()

    if not -450 <= tx <= 450 or not -375 <= ty <= 325:
        player.backward(-100)
        return

    check_item(tx, ty)

def movePlayer():

    player.onclick(move, 1)

Я не смог бы протестировать вышеописанное без большего количества вашего кода для работы, но, надеюсь, вы поймете идею.

...