处理在函数内定义的多个Python乌龟

时间:2018-10-07 14:05:17

标签: python turtle-graphics

这是我认为是问题所在的代码部分。考虑到这一点,我有两个问题,第一个是:“如何操作多个对象(Python乌龟)?”我正在尝试使用列表和.append()解决这个问题。这将导致以下问题:

if enemy.index(enemy).ycor() < -100:
NameError: name 'enemy' is not defined

我认为这与不可能在函数内定义Turtle对象有关(我想)。这就引出了我的第二个问题:“如何在函数内部创建Turtle对象?”

def spawn(t,shape,color,x,y):
        t = turtle.Turtle() 
        t.speed(0)
        t.up()
        t.goto(x,y)
        t.shape(shape)
        t.color(color)
def go_upx():
    if enemy.index(enemy).heading() != 90:
        enemy.index(enemy).seth(90) 

def go_downx():
    if enemy.index(enemy).heading() != 270:
        enemy.index(enemy).seth(270)

def go_leftx():
    if enemy.index(enemy).heading() != 180:
        enemy.index(enemy).seth(180)
def move():
    if enemy.index(enemy).heading() == 90:
        y = enemy.index(enemy).ycor()
        enemy.index(enemy).sety(y + 20)

    if enemy.index(enemy).heading() == 270:
        y = enemy.index(enemy).ycor()
        enemy.index(enemy).sety(y - 20)

    if enemy.index(enemy).heading() == 180:
        x = enemy.index(enemy).xcor()
        enemy.index(enemy).setx(x - 20)

def enemies_direction():
    en_direction = random.randint(1,3)
    if 1 == en_direction:
        go_upx()
    if 2 == en_direction:
        go_leftx()
    if 3 == en_direction:
        go_downx()

enemies = []
#Main Loop
while True:
    wn.update()
    for x in range(0,10):
        for enemy in enemies:
            randy = random.randint(-90,300)
            enemies.append(spawn(enemy.index(enemy),"circle","blue",490,randy))
            enemies_direction()
            if enemy.xcor<-600:
                enemy.pop(enemy.index(enemy))
    BgLimits()           
    move()
    time.sleep(delay)

wn.mainloop()

1 个答案:

答案 0 :(得分:0)

  

如何在函数内部创建乌龟?

可以在函数内部或像其他对象一样在顶层创建海龟。您的问题出在代码的其他地方。一个警告,乌龟不会像其他对象一样被垃圾收集(它们永远存在于乌龟库的列表中),因此最好重用它们,而不是不断地产生新的对象。

  

在这里,我们有一部分代码被称为问题

这是我看到的与此代码有关的问题 s

while True:

在事件驱动的环境(如turtle)中绝对不应存在while True: -使用计时器事件。

if enemy.xcor<-600:

Python逻辑不正确,应该是:

if enemy.xcor() < -600:

在这种情况下:

enemies.append(spawn(...))

正如@JohnnyMopp提到的,spawn()返回None,因此enemies是这些列表。您需要spawn()返回新的乌龟。在这里:

enemy.pop(...)

您似乎在混淆enemy迭代变量(一只乌龟)和enemies全局乌龟列表。 (您可以pop()列表,但不能是乌龟。)

其他问题包括混合初始化循环和主循环-两个不同的循环。

以下是我对您的代码试图做的最好的猜测:

from turtle import Screen, Turtle
from random import choice, randint

def spawn(shape, color, x, y):
    t = Turtle(shape, visible=False)
    t.speed('fastest')
    t.color(color)
    t.penup()
    t.goto(x, y)
    t.showturtle()

    return t

def go_upx(enemy):
    enemy.seth(90)

def go_downx(enemy):
    enemy.seth(270)

def go_leftx(enemy):
    enemy.seth(180)

def move(enemy):
    if enemy.heading() == 90:
        y = enemy.ycor()
        enemy.sety(y + 20)

    if enemy.heading() == 180:
        x = enemy.xcor()
        enemy.setx(x - 20)

    if enemy.heading() == 270:
        y = enemy.ycor()
        enemy.sety(y - 20)

def enemy_direction(enemy):
    direction_function = choice([go_upx, go_downx, go_leftx])

    direction_function(enemy)

wn = Screen()
wn.setup(640, 640)
wn.tracer(False)

enemies = []

for _ in range(10):
    rand_y = randint(-300, 300)
    enemy = spawn("circle", "blue", 300, rand_y)
    enemy_direction(enemy)
    enemies.append(enemy)

def move_all():

    for enemy in enemies:
        if -320 <= enemy.ycor() <= 320 and enemy.xcor() >= -320:
            pass  # still on the screen
        else:
            enemy.hideturtle()
            enemies.pop(enemies.index(enemy))

        move(enemy)
        enemy_direction(enemy)
        wn.update()

    if enemies:
        wn.ontimer(move_all, 100)  # still enemies left to move
    else:
        wn.tracer(True)  # all done, restore normal graphics mode

move_all()

wn.mainloop()

我假设您在测试之前写了太多代码,而剩下的调试任务不可能完成。编写小节,对其进行测试,然后进行构建。