名称错误:第10行未定义名称“高度”

2024-10-05 22:00:18 发布

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

我目前正在为一个关于Python的学校项目创建一个游戏。这就是到目前为止我所知道的,Python告诉我NameError:第10行没有定义名称“height”。这是什么意思?我做了很多研究,但我还是搞不懂。有人能帮我吗

import turtle
enter code here`import random

def main():
  wn=turtle.Screen();
  Gameturtle=turtle.Turtle()

  Setupuser(Gameturtle,wn)
  Setupcontrols(Gameturtle,wn)
  Randomanglegenerator(turtle,len,height)

  li = []
  InsertEnemyturtleintolist(li)
  while (True):
    Hitchecker(Gameturtle, li)

def Setupuser(myTurtle,window):
  window.bgcolor("white")
  #width=x height=y
  window.setup (width=400, height=400, startx=100, starty=100)
  myTurtle.speed(2)
  myTurtle.shape('turtle')
  myTurtle.penup()
  myTurtle.delay(0)
  myTurtle.left(90)

  myTurtle.mainloop()

  window.exitonclick ()

def Hitchecker(myTurtle, enemyTurtles):
  for eturtle in enemyTurtles:
    distance=myTurtle.distance(eturtle)
    if distance <= 1:
       print("You lost a life >:^D")

def InsertEnemyturtleintolist(list):
  Enemy=turtle.Turtle()
  Enemy.shape=("triangle")
  Enemy.speed(5)
  Enemy.penup()
  Enemy.left(90)
  Enemy.showturtle()
  list.append(Enemy)

def Setupcontrols(turtle, window):
  window.onkey(lambda: turtle.goto(turtle.xcor(), turtle.ycor()+15), 'w')
  window.onkey(lambda: turtle.goto(turtle.xcor()-15, turtle.ycor()), 'a')
  window.onkey(lambda: turtle.goto(turtle.xcor()+15, turtle.ycor()), 'd')
  window.onkey(lambda: turtle.goto(turtle.xcor(), turtle.ycor()-15), 's')

  window.listen()


def Randomanglegenerator(turtle,len,height):

 XYcord = random.randrange(1,5)
 print(XYcord)
 if XYcord==2 or 4:
    Enemy.setheading(90)

main()

Tags: lambdadefliwindowdistanceheightturtlegoto
1条回答
网友
1楼 · 发布于 2024-10-05 22:00:18

你的程序有几个问题。首先,无效或有问题的Python语法:

if XYcord==2 or 4:
wn=turtle.Screen();

应该是这样的:

if XYcord == 2 or XYcord == 4:
wn = turtle.Screen()

这些方法是等效的,您应该使用其中一种方法,而不是同时使用两种方法。并且mainloop()是“海龟”软件包中的屏幕方法或函数,而不是海龟实例的方法:

myTurtle.mainloop()
window.exitonclick()

相反,你应该:

window.mainloop()

或:

window.exitonclick()

重新定义像list这样的Python内置是一个糟糕的想法:

def InsertEnemyturtleintolist(list):
    ...
    list.append(Enemy)

相反,你应该:

def InsertEnemyturtleintolist(myEnemiesList):
    ...
    myEnemiesList.append(Enemy)

最后,像这样的无限循环在海龟这样的事件驱动世界中没有一席之地:

while (True):

我们需要将其替换为计时器事件。以下是我对您的代码的重写,以解决上述问题并使其基本正常工作:

from turtle import Screen, Turtle
from random import randrange

def main():
    screen = Screen()
    turtle = Turtle()

    SetupUser(turtle, screen)
    SetupControls(turtle, screen)

    RandomAngleGenerator(turtle)

    enemies = []
    for _ in range(5):
        InsertEnemyTurtleIntoList(enemies, turtle)

    HitChecker(turtle, screen, enemies)

    screen.mainloop()

def SetupUser(myTurtle, myScreen):
    myScreen.bgcolor('white')
    myScreen.setup(width=400, height=400, startx=100, starty=100)

    myTurtle.speed('slow')
    myTurtle.shape('turtle')
    myTurtle.penup()

def SetupControls(myTurtle, myScreen):
    myScreen.onkey(lambda: myTurtle.sety(myTurtle.ycor() + 15), 'w')
    myScreen.onkey(lambda: myTurtle.setx(myTurtle.xcor() - 15), 'a')
    myScreen.onkey(lambda: myTurtle.setx(myTurtle.xcor() + 15), 'd')
    myScreen.onkey(lambda: myTurtle.sety(myTurtle.ycor() - 15), 's')

    myScreen.listen()

def HitChecker(myTurtle, myScreen, enemyTurtles):
    dead = False

    for myEnemy in enemyTurtles:
        if myTurtle.distance(myEnemy) <= 10:
            print("You lost a life >:^D")
            dead = True
            break

    if dead:
        myScreen.onkey(None, 'w')
        myScreen.onkey(None, 'a')
        myScreen.onkey(None, 'd')
        myScreen.onkey(None, 's')
    else:
        myScreen.ontimer(lambda: HitChecker(myTurtle, myScreen, enemyTurtles), 100)

def InsertEnemyTurtleIntoList(array, myTurtle):
    enemy = Turtle()
    enemy.hideturtle()
    enemy.shape('triangle')
    enemy.speed('normal')
    enemy.penup()
    enemy.left(90)
    enemy.showturtle()

    while enemy.distance(myTurtle) < 30:
        enemy.setposition(randrange(-190, 190), randrange(-190, 190))

    array.append(enemy)

def RandomAngleGenerator(myTurtle):

    turns = randrange(1, 3)

    for _ in range(turns):
        myTurtle.left(90)

main()

我确信它还没有完成你想要它做的所有事情,但是这应该给你一个可行的起点来完成你的程序

相关问题 更多 >