2017-05-28 4 views
0

Der Versuch, ein einfaches Spiel mit Turtle-Grafiken und Python zu bauen. Ich habe Feinde erstellt und sie in die while-Schleife gelegt, so dass sie, wenn sie die Grenzen auf beiden Seiten berühren, um 40 Einheiten nach unten gehen. Ich gebe den Wert von y-Koordinate in eine Variable u ein. Aber wenn ich den Code ausführen, heißt es:NameError: nicht definiert (Python)

nameError: 'u' not defined

Hilfe !!

#!/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

Ihr Code funktioniert für mich nach dem Verschieben der Einrückung in einem Schritt für alles nach 'while True:' – davedwards

Antwort

0

Auch mit der falschen Schleife Einbuchtung, die beachtet @downshift, sollten Sie nicht den Fehler bekommen haben Sie zitiert u sofort gesetzt wird, bevor sie verwendet werden.

Das Hauptproblem, das ich mit Ihrem Code-Design sehe, ist die Verwendung von while True:, die in einem ereignisgesteuerten Programm nicht auftreten sollte. Vielmehr sollte die Bewegung des Feindes über ein Timer-Ereignis gehandhabt werden und die Programmsteuerung auf mainloop() umgestellt werden, damit andere Ereignisse korrekt ausgelöst werden können. Ich habe Ihr Programm in diese Richtung unter überarbeitet und einige Stilen und optimizaion zwickt gemacht:

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

Dieser hoffentlich Ihren Weg zum Hinzufügen von mehr Funktionalität, um Ihr Spiel glätten sollte.

Verwandte Themen