亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我射擊時烏龜停止

當我射擊時烏龜停止

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 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號