Python 2.7 NameError:未定义(python)

Python 2.7 NameError:未定义(python),python-2.7,turtle-graphics,Python 2.7,Turtle Graphics,尝试使用海龟图形和Python构建一个简单的游戏。 我创造了敌人,把他们放在while循环中,这样每当他们碰到两边的边界时,他们就会向下移动40个单位。我把y坐标的值放在变量u中。但当我运行代码时,它会说: nameError:未定义“u” 救命 #!/usr/bin/python import turtle import os #screen wn = turtle.Screen() wn.bgcolor("black") wn.title("spaceinvaders") #boarde

尝试使用海龟图形和Python构建一个简单的游戏。 我创造了敌人,把他们放在while循环中,这样每当他们碰到两边的边界时,他们就会向下移动40个单位。我把y坐标的值放在变量
u
中。但当我运行代码时,它会说:

nameError:未定义“u”

救命

#!/usr/bin/python
import turtle
import os

#screen
wn = turtle.Screen()
wn.bgcolor("black")
wn.title("spaceinvaders")

#boarder
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-300,-300)
border_pen.pendown()
border_pen.pensize(3)

for side in range(4):
    border_pen.fd(600)
    border_pen.lt(90)

border_pen.hideturtle()

#player
player = turtle.Turtle()
player.color("blue")
player.shape("triangle")
player.penup()
player.speed(0)
player.setposition(0,-250)
player.setheading(90)
playerspeed = 15

#enemy
enemy = turtle.Turtle()
enemy.color("red")
enemy.shape("circle")
enemy.penup()
enemy.speed(0)
enemy.setposition(-200,250)
enemyspeed = 2

#move
def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -280:
        x = - 280
    player.setx(x)
def move_right():
    x = player.xcor()
    x += playerspeed
    if x > 280:
        x = +280
    player.setx(x)

#key bindings
turtle.listen()
turtle.onkey(move_left,"Left")
turtle.onkey(move_right,"Right")

#mainloop

while True:

#enemy moves
x = enemy.xcor()
x += enemyspeed
enemy.setx(x)

if enemy.xcor() < -280:
    u = enemy.ycor()
    u -= 40
    enemyspeed *= -1
    enemy.sety(u)
if enemy.xcor() > 280:
    u = enemy.ycor()
    u -= 40
    enemyspeed *= -1
    enemy.sety(u)

delay = raw_input("press enter to finish")
#/usr/bin/python
进口海龟
导入操作系统
#屏风
wn=tutle.Screen()
wn.bgcolor(“黑色”)
wn.标题(“太空入侵者”)
#寄宿生
border\u pen=海龟。海龟()
边界笔速度(0)
边框颜色(“白色”)
border_pen.penup()
边界笔设置位置(-300,-300)
border_pen.pendown()
边境养老金(3)
对于范围内的侧面(4):
border_pen.fd(600)
边界_pen.lt(90)
边界_pen.hideturtle()
#玩家
玩家=乌龟。乌龟()
播放器颜色(“蓝色”)
玩家形状(“三角形”)
player.penup()
玩家速度(0)
玩家设置位置(0,-250)
玩家设置标题(90)
球员速度=15
#敌人
敌人=乌龟
敌人。颜色(“红色”)
敌人形状(“圆圈”)
敌人
敌人,速度(0)
敌方设定位置(-200250)
敌人速度=2
#移动
def向左移动()
x=player.xcor()
x-=玩家速度
如果x<-280:
x=-280
player.setx(x)
def向右移动()
x=player.xcor()
x+=玩家速度
如果x>280:
x=+280
player.setx(x)
#密钥绑定
乌龟,听着
乌龟。上键(向左移动,“左”)
乌龟.安基(向右移动,“向右”)
#主回路
尽管如此:
#敌方行动
x=敌人。xcor()
x+=敌人速度
敌人,setx(x)
如果敌方.xcor()<-280:
u=敌人。ycor()
u-=40
敌人速度*=-1
敌人,塞蒂(美国)
如果敌方.xcor()大于280:
u=敌人。ycor()
u-=40
敌人速度*=-1
敌人,塞蒂(美国)
延迟=原始输入(“按回车键完成”)

即使@downshift注意到不正确的循环缩进,您也不应该在使用前立即设置您引用的错误,即
u

我在代码设计中看到的主要问题是在True:时使用了
,这不应该出现在事件驱动程序中。相反,敌人的移动应该通过定时器事件和程序控制来处理,并将其切换到
mainloop()
,以便其他事件能够正确地开火。我已经按照下面的思路重新编写了您的程序,并进行了一些样式和优化调整:

import turtle

# player motion event handlers

def move_left():
    turtle.onkey(None, 'Left')  # avoid overlapping events
    player.setx(max(-280, player.xcor() - playerspeed))
    turtle.onkey(move_left, 'Left')

def move_right():
    turtle.onkey(None, 'Right')
    player.setx(min(280, player.xcor() + playerspeed))
    turtle.onkey(move_right, 'Right')

# enemy motion timer event handler

def move_enemy():
    global enemyspeed

    # enemy moves
    enemy.forward(enemyspeed)

    x = enemy.xcor()

    if x < -280 or x > 280:
        enemy.sety(enemy.ycor() - 40)
        enemyspeed *= -1

    wn.ontimer(move_enemy, 10)

# screen

wn = turtle.Screen()
wn.bgcolor('black')
wn.title('spaceinvaders')

# border

STAMP_SIZE = 20

border_pen = turtle.Turtle('square', visible=False)
border_pen.shapesize(600 / STAMP_SIZE, 600 / STAMP_SIZE, 3)
border_pen.pencolor('white')
border_pen.stamp()

# player

player = turtle.Turtle('triangle', visible=False)
player.color('blue')
player.speed('fastest')
player.penup()

player.setheading(90)
player.setposition(0, -250)
player.showturtle()

playerspeed = 15

# enemy

enemy = turtle.Turtle('circle', visible=False)
enemy.color('red')
enemy.speed('fastest')
enemy.penup()

enemy.setposition(-200, 250)
enemy.showturtle()

enemyspeed = 2

# key bindings
turtle.onkey(move_left, 'Left')
turtle.onkey(move_right, 'Right')
turtle.listen()

wn.ontimer(move_enemy, 100)

turtle.mainloop()  # for Python 3 use wn.mainloop()
导入海龟
#播放器运动事件处理程序
def向左移动()
turtle.onkey(无,'左')#避免重复事件
player.setx(最大值(-280,player.xcor()-playerspeed))
乌龟。上键(向左移动,'向左')
def向右移动()
turtle.onkey(无“右”)
player.setx(最小值(280,player.xcor()+玩家速度))
乌龟。上键(向右移动,'向右')
#敌方运动计时器事件处理程序
def move_敌人():
全球敌人速度
#敌方行动
敌人,前进(敌人速度)
x=敌人。xcor()
如果x<-280或x>280:
敌方.sety(敌方.ycor()-40)
敌人速度*=-1
wn.ontimer(移动敌人,10)
#屏风
wn=tutle.Screen()
wn.bgcolor('黑色')
wn.title(“太空入侵者”)
#边界
邮票大小=20
border\u pen=turtle.turtle('square',visible=False)
边框笔形状大小(600/邮票大小,600/邮票大小,3)
镶边铅笔颜色(“白色”)
边框(钢笔)邮票()
#玩家
玩家=乌龟。乌龟('三角形',可见=假)
player.color('blue'))
玩家速度(“最快”)
player.penup()
玩家设置标题(90)
玩家设置位置(0,-250)
player.showturtle()
球员速度=15
#敌人
敌人=乌龟。乌龟('圆圈',可见=假)
敌人。颜色(‘红色’)
敌人。速度(“最快”)
敌人
敌方设定位置(-200250)
敌人
敌人速度=2
#密钥绑定
乌龟。上键(向左移动,'向左')
乌龟。上键(向右移动,'向右')
乌龟,听着
wn.ontimer(移动敌人,100)
tutle.mainloop()#对于Python 3,请使用wn.mainloop()

这将有望为您的游戏添加更多功能铺平道路。

之后,如果为True: