乌龟在我射击时停下来

Turtle stops when I shoot

我遇到了一个问题,当我射击时敌方乌龟会停下来。我对 python 比较陌生,所以我知道我的代码很糟糕。我似乎无法发现为什么会发生这种情况,但我假设它与 while 循环有关。

代码如下: (我添加了注释,所以很容易跳到它的重要部分)

import turtle
import os
#wn is window
#bp = border
bullet = 'ready'
#screen setup
wn = turtle.Screen()
wn.bgcolor('black')
wn.title('SPACE.INVADERS')


#border
bp = turtle.Turtle()
bp.speed(0)
bp.color('green')
bp.penup()
bp.setposition(-300,-300)
bp.pendown()
count=0
while count != 5:
    count= (count+1)
    bp.fd(600)
    bp.lt(90)
bp.hideturtle()

#player
p = turtle.Turtle()
p.color('red')
p.shape('triangle')
p.penup()
p.speed(0)
p.setposition(0,-250)
p.setheading(90)

#enemy
e = turtle.Turtle()
e.penup()
e.speed(0)
e.shape('square')
e.shapesize(1.25,1.25)
e.color('orange')
e.setpos(-250,250)
e.speed(1)





#p = player
#ps = player speed

ps = 15

#moving left and right
def left_mov():
    x = p.xcor()
    x -= ps
    p.setx(x)

def right_mov():
    x = p.xcor()
    x += ps
    p.setx(x)
#shooting
def shoot():
    global bullet
    if bullet == 'ready':
        bullet = 'fire'
        shot= turtle.Turtle()
        shot.penup()
        shot.speed(0)
        shot.goto(p.pos())
        shot.color('white')
        shot.shape('triangle')
        shot.shapesize(0.5)
        shot.lt(90)
        shot.speed(1)
        shot.fd(550)
        bullet = 'ready'




#bindings
turtle.listen()
turtle.onkey(left_mov, 'Left')
turtle.onkey(right_mov, 'Right')
turtle.onkey(shoot, 'space')
#enemy movement
while True:
    e.fd(500)
    e.rt(90)
    e.fd(25)
    e.rt(90)
    e.fd(500)
    e.lt(90)
    e.fd(25)
    e.lt(90)

I'm assuming its got something to do with the while loop

是的,它不应该在那里!在像乌龟这样的事件驱动世界中,永远不应该有 while True: 循环。相反,我们需要一个定期触发的计时器事件,对运动中的物体(敌人和子弹)进行增量更新,使它们看起来同时移动。以下是我使用计时器事件对您的代码进行的修改:

from turtle import Screen, Turtle

# moving left and right
def left_move():
    player.setx(player.xcor() - player_speed)

def right_move():
    player.setx(player.xcor() + player_speed)

# screen setup
screen = Screen()
screen.bgcolor('black')
screen.title('SPACE.INVADERS')

# border
border = Turtle(visible=False)
border.speed('fastest')
border.color('green')

border.penup()
border.setposition(-300, -300)
border.pendown()

for _ in range(4):
    border.forward(600)
    border.left(90)

# player
player = Turtle('triangle')
player.speed('fastest')
player.color('red')

player.penup()
player.setposition(0, -250)
player.setheading(90)

player_speed = 15

# enemy
enemy = Turtle('square')
enemy.speed('fast')
enemy.shapesize(1.25)
enemy.color('orange')
enemy.penup()

enemy.setpos(-250, 250)

enemy_speed = 6  # enemy speed
enemy_direction = 1  # enemy direction

# bullet
bullet = Turtle('triangle', visible=False)
bullet.speed('fastest')
bullet.color('white')
bullet.shapesize(0.5)
bullet.penup()
bullet.left(90)

bullet_speed = 9  # bullet speed

# shooting

def shoot():
    if not bullet.isvisible():
        bullet.goto(player.position())
        bullet.showturtle()

def move():
    global enemy_direction

    if bullet.isvisible():
        if bullet.ycor() > 275:
            bullet.hideturtle()
        else:
            bullet.forward(bullet_speed)

    # enemy movement

    enemy.forward(enemy_direction * enemy_speed)
    enemy.settiltangle(enemy.tiltangle() + 3)  # just for fun

    x, y = enemy.position()

    if x > 250 or x < -250:
        enemy_direction *= -1
        enemy.sety(y - 25)

    screen.ontimer(move, 50)

# bindings
screen.onkey(left_move, 'Left')
screen.onkey(right_move, 'Right')
screen.onkey(shoot, 'space')
screen.listen()

move()

screen.mainloop()

这应该为您提供前进所需的基本功能并添加碰撞检测(子弹到敌人、敌人到玩家、玩家到墙)和计分。

另请注意,海龟是全局实体,因此每次需要时都创建一颗新子弹是个坏主意。即使您最终允许项目符号重叠,也请为此目的保留一组可重复使用的项目符号。