2017-05-28 13 views
0

亀のグラフィックスと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の後ろにある全てのインデントを一つのステップで動かした後に私のために働きます。 – davedwards

答えて

0

はさえ指摘@downshift間違ったループインデントで、あなたはuが使用されて直前に設定されているとして、あなたが引用されたエラーを得ているべきではありません。

私があなたのコードデザインに見られる主な問題は、イベント駆動型プログラムでは発生しないwhile True:の使用です。むしろ、敵の動きはタイマーイベントによって処理され、プログラムコントロールはmainloop()になり、他のイベントが正しく発生するようになります。私は、以下のものを線に沿って、あなたのプログラムを手直しして、いくつかのスタイルとoptimizaionひねりを加えました:

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

これがうまくいけば、あなたのゲームに多くの機能を追加することに、あなたのパスを滑らかにする必要があります。

関連する問題