2017-05-28 90 views
0

嘗試使用turtle圖形和Python構建一個簡單的遊戲。我創造了敵人,並將它們放在while循環中,以便每當它們觸及任何一邊的邊界時,它們向下移動40個單位。我把y座標的值放在變量u中。但是當我運行代碼它說:NameError:未定義(python)

nameError: 'u' not defined

幫助!!

#!/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") 
+0

你的代碼適用於我,在'while True:'之後的所有內容的一個步驟中移動縮進。 – davedwards

回答

0

即使與@downshift指出,不正確的循環縮進,你不應該得到你引述u在使用前立即設置錯誤。

我在代碼設計中看到的主要問題是使用while 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() 

這樣應該可以順利添加更多的功能到你的遊戲你的道路。