NameError: имя 'height' не определено в строке 10 - PullRequest
0 голосов
/ 16 марта 2020

Я сейчас создаю игру для школьного проекта на Python. Это то, что у меня есть, и Python говорит мне NameError: имя 'height' не определено в строке 10. Что это значит? Я провел много исследований, но до сих пор не могу понять. Кто-нибудь может мне помочь?

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

1 Ответ

0 голосов
/ 19 марта 2020

Есть несколько проблем с вашей программой. Во-первых, неверный или сомнительный синтаксис 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()

Переопределение Python встроенных элементов, таких как list - это плохо идея:

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

вместо этого:

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

Наконец, бесконечное l oop, как это не имеет места в управляемом событиями мире, таком как черепаха:

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

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

...