为什么在另一个函数中重新定义一个函数不起作用?(Python龟)

2024-10-01 17:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个游戏,敌人的乌龟(程序中称为badturt)追逐用户的乌龟。用户可以通过发送攻击(另一只海龟)使其海龟攻击敌方海龟

在2级,有两只敌方乌龟在追逐用户的乌龟。为了让一只敌方乌龟停止移动(在它被攻击/击中后),我尝试重新定义使敌方乌龟移动的函数,这是在另一个函数中完成的。 (我重新定义为“无”)

attack = turtle.Turtle()
#...attributes

def turtleattack():
    global lvl
    global q
    global w
    global e
    #... positioning attack
    for i in range(75):
        attack.forward(10)
        if lvl == 1:
            Chase(badturt)
        if lvl == 2:
            Chase(badturt)
            Chase(badturt2)
        if lvl == 3:
            Chase(badturt)
            Chase(badturt2)
            Chase(badturt3)
        IfAttackHit()
bg.onkeypress(turtleattack, 'z')
bg.listen()


def Chase(bt): #makes bad turt (bt) chase turt
    bt.setheading(bt.towards(turt))
    bt.forward(11)

def StopChase(bt):
    global lvl
    global win
    #global Chase <---------------- program stops running if I write it in
    if lvl == 1:
        #...
    if lvl == 2:
        def Chase(bt):
            None
        if q == 2 and w == 2:
            lvl = 3
            writeinfo()
    if lvl == 3:
        def Chase(bt):
            None
        if q == 3 and w == 3 and e == 3:
            #... (winning the game)

def ChaseAgain(bt): #makes badturt chase again when it moves onto next lvl
    def Chase(bt):
        bt.setheading(badturt.towards(turt))
        bt.forward(11)
    Chase(bt)


def IfAttackHit():
    global win
    global lvl
    global q
    global w
    global e
    if lvl == 1:
        if badturt.distance(attack) < 20:
            badturt.hideturtle()
            attack.hideturtle()
            badturt.goto(300,350)
            q = 1
            StopChase(badturt) #<---- doesn't work
    if lvl == 2:
        if badturt.distance(attack) < 20:
            badturt.hideturtle()
            attack.hideturtle()
            badturt.goto(300,350)
            q = 2
            StopChase(badturt)
        if badturt2.distance(attack) < 20:
            badturt2.hideturtle()
            badturt2.goto(-300,350)
            attack.hideturtle()
            w = 2
            StopChase(badturt2)
    if lvl == 3:
        #same format as lvl 2 but with addition of badturt3


while True:
    if lvl == 1:
         while True:
            CheckDamage()
            if turthealth == 0:
                LOSE()
                break
            IfAttackHit()
            Chase(badturt)
            if q == 1:
                break
    break
    if lvl == 2:
        ChaseAgain(badturt) #make it move again
        ChaseAgain(badturt2)
        badturt.goto(300,350)
        badturt.showturtle()
        badturt2.showturtle()
        while True:
            CheckDamage()
            if turthealth == 0:
                LOSE()
                break
            IfAttackHit()
            Chase(badturt)
            Chase(badturt2)
    break
    if lvl == 3:
        #same format as lvl 2 but with addition of badturt3
        break

这不管用。是因为它嵌套在另一个函数中吗?StopChase()从未被调用过吗?功能是否重新定义,以便敌方海龟再次开始移动

另外,我的老师告诉我,我必须编写“global Chase”来在另一个函数中重新定义它,但当我这样做时,程序在该点停止运行-当我将光标移动到turtle屏幕上时,它只显示加载光标,屏幕上没有任何事情发生/它冻结。(这样做是不对的,还是我笔记本电脑上的python程序有问题?)

我还尝试重新定义Chase(),使badturt只向前移动0(基本上使它什么也不做),但这也不起作用

请让我知道我做错了什么,或者是否有其他方法让badturt停止移动


Tags: if定义defglobalbt海龟breakattack
2条回答

田阮是绝对正确的,你绝对应该听从他的建议。我只想详细说明你的第一个问题。即使它可能不好,使用全局函数重新定义函数也应该有效。以下是我尝试的一个最小示例:

def f():
    print("f")

def g():
    global f
    def f():
        print("f_prime")

f()
g()
f()

打电话时,我得到:

f
f_prime

程序停止的原因必须在其他地方解释,但您没有提供您遇到的错误(如果有)

当您重新定义非类方法时,重新定义是永久性的,这意味着它适用于一切。你可能不想那样

在Chase方法中写入条件有什么不好的地方


您的代码中存在各种错误的编码做法:

  • 通常应避免使用global。您应该创建具有属性的类和类的实例,并传递这些实例
  • 方法不是大写的。类是大写的
  • 由于break,您有一些无法访问的代码
  • 当不应该发生任何事情时,使用pass代替None

相关问题 更多 >

    热门问题