【问题标题】:Python turtle: if statement with position sometimes works and sometimes doesn'tPython turtle:带有位置的if语句有时有效,有时无效
【发布时间】:2020-06-17 23:32:02
【问题描述】:

我正在制作一款冒险/棋盘游戏,如果玩家踩到该物品,则可以在其中收集物品。所以我做了函数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() 事件调用的。基本上,每当我单击播放器对象时,它都会移动,然后检查位置。

【问题讨论】:

  • 请不要将代码作为图片。
  • 也不要比较布尔值 == True 或 == False,并避免使用全局变量。坐标是整数还是浮点数?
  • 我对图片感到非常抱歉,我是该网站的新手,我只是在发布后才阅读它的指示。至于布尔值,我想要一个变量来存储玩家拾取物品的信息,以便之后不会考虑 if 语句。我从 pos() 方法获取玩家坐标,当我打印出来时,它们似乎是整数。
  • 尝试创建minimal reproducible example 并将代码作为文本发布。这样做,我可能会重新提出问题
  • 阅读this article 了解调试代码的技巧。

标签: python if-statement boolean global turtle-graphics


【解决方案1】:

首先,海龟会在一个浮点平面上爬行,所以这样的测试有时会奏效,有时会失败:

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)

如果没有更多代码可以使用,我无法测试上述内容,但希望你能明白。

【讨论】:

  • 感谢您的回答,但还是有一些问题。事实证明,pos() 函数的近似值非常糟糕,以至于我不得不检查一系列值。但它仍然不起作用。我将编辑问题,以便您可以看到更新的代码。再次感谢您的宝贵时间!
  • @Teolul,在您更新的代码中,这是一个错误:-320 &lt; player_y &lt; -330 考虑负数的性质并反转值。
  • 我不敢相信我没有看到。现在一切正常。再次感谢您的帮助,下次我会努力提高观察力!
猜你喜欢
  • 2017-02-06
  • 1970-01-01
  • 2011-04-18
  • 2011-02-14
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多