这是我认为是问题所在的代码部分。考虑到这一点,我有两个问题,第一个是:“如何操作多个对象(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()
答案 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()
我假设您在测试之前写了太多代码,而剩下的调试任务不可能完成。编写小节,对其进行测试,然后进行构建。