为了账号安全,请及时绑定邮箱和手机立即绑定

当我射击时乌龟停止

当我射击时乌龟停止

MMTTMM 2021-11-30 10:35:02
我遇到了一个问题,即我射击时敌方乌龟会停下来。我对 python 比较陌生,所以我知道我的代码很糟糕。我似乎无法发现为什么会发生这种情况,但我假设它与 while 循环有关。这是代码:(我添加了注释,因此很容易跳到其中的重要部分)import turtleimport os#wn is window#bp = borderbullet = 'ready'#screen setupwn = turtle.Screen()wn.bgcolor('black')wn.title('SPACE.INVADERS')#borderbp = turtle.Turtle()bp.speed(0)bp.color('green')bp.penup()bp.setposition(-300,-300)bp.pendown()count=0while count != 5:    count= (count+1)    bp.fd(600)    bp.lt(90)bp.hideturtle()#playerp = turtle.Turtle()p.color('red')p.shape('triangle')p.penup()p.speed(0)p.setposition(0,-250)p.setheading(90)#enemye = 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 speedps = 15#moving left and rightdef left_mov():    x = p.xcor()    x -= ps    p.setx(x)def right_mov():    x = p.xcor()    x += ps    p.setx(x)#shootingdef 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'#bindingsturtle.listen()turtle.onkey(left_mov, 'Left')turtle.onkey(right_mov, 'Right')turtle.onkey(shoot, 'space')#enemy movementwhile 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)
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

我假设它与 while 循环有关


是的,它不应该在那里!在像乌龟这样的事件驱动的世界中,永远不应该有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()

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


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


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信