【问题标题】:How to fix bug where my enemies don't disappear?如何修复我的敌人不会消失的错误?
【发布时间】:2019-06-15 11:53:07
【问题描述】:

我想制作一款 Space Invaders 游戏,但我的敌人即使被击中也不会消失。有人知道怎么解决吗?

我已经尝试了for 循环(如您所见),但它不起作用:

import turtle as tr
wn = tr.Screen()
wn.tracer(0)
bullet = tr.Turtle()
player = tr.Turtle()
enimis = []
y = -250
def shoot():
    player.direction = "up"
wn.onkey(shoot,"space")
while True:    
    if len(enimis) == 0:
        for u in range(-210,210,60):
            for o in range(100,260,60):
                enimi = tr.Turtle()
                enimi.setpos(u,o)
                enimis.append(enimi)
    if player.direction == "up":
        bullet.penup()
        x = player.xcor()
        bullet.setpos(x,y)
        bullet.pendown()
        for p in range(550):
            bullet.setpos(x,y+p)
            for k in enimis:
                if bullet.distance(k) < 25:
                    score += 10
                    if score > highscore:
                        highscored = True
                    else:
                        highscored = False
                    del k
                    hit = True
                    break
                else:
                    hit = False
    wn.update()

没有任何错误信息,敌人只是没有消失。

【问题讨论】:

    标签: python python-3.x turtle-graphics


    【解决方案1】:

    我不明白为什么由于此错误而导致代码根本无法运行时,您还坚持让死去的敌人消失:

        if player.direction == "up":
    AttributeError: 'Turtle' object has no attribute 'direction'
    

    你也不能击中敌人,因为你的玩家和敌人都不能移动,而且玩家一开始也没有指向敌人。太多神奇的想法而没有足够的代码。

    要回答您的问题,这是行不通的:

    for k in enimis:
        if bullet.distance(k) < 25:
            # ...
            del k
            # ...
            break
    

    要么需要:

    for k in enimis:
        if bullet.distance(k) < 25:
            # ...
            enimis.remove(k)  # remove by value
            # ...
            break
    

    或:

    for k in range(len(enimis)):
        if bullet.distance(enimis[k]) < 25:
            # ...
            del enimis[k]  # remove by index
            # ...
            break
    

    以下是我对您的代码的完整重写,以使其基本可以播放:玩家可以左右移动;子弹射击,击中敌人,得分,敌人消失;分数显示在屏幕上;等等

    from turtle import Screen, Turtle
    
    BASELINE = -250
    FONT = ('Arial', 18, 'bold')
    
    def left():
        player.setx(player.xcor() - 5)
    
    def right():
        player.setx(player.xcor() + 5)
    
    def shoot():
        global firing
    
        firing = True
    
    firing = False
    enemies = []
    score = 0
    
    bullet = Turtle('triangle')
    bullet.hideturtle()
    bullet.speed('fastest')
    bullet.shapesize(0.5)
    bullet.setheading(90)
    bullet.penup()
    
    player = Turtle('turtle')
    player.hideturtle()
    player.speed('fastest')
    player.color('green')
    player.setheading(90)
    player.penup()
    player.sety(BASELINE)
    player.showturtle()
    
    marker = Turtle()
    marker.hideturtle()
    marker.penup()
    marker.goto(-300, 300)
    marker.write("Score: {}".format(score), align='center', font=FONT)
    
    def play():
        global firing, score
    
        if not enemies:
            screen.tracer(False)
    
            for x in range(-210, 210, 60):
                for y in range(100, 260, 60):
                    enemy = Turtle('turtle')
                    enemy.color('red')
                    enemy.setheading(270)
                    enemy.penup()
                    enemy.setpos(x, y)
                    enemies.append(enemy)
    
            screen.tracer(True)
    
        if firing:
    
            bullet.setx(player.xcor())
            bullet.sety(BASELINE)
            bullet.showturtle()
    
            for p in range(0, 550, 5):
    
                bullet.sety(BASELINE + p)
    
                for enemy in enemies:
                    if bullet.distance(enemy) < 20:
                        score += 10
                        marker.undo()
                        marker.write("Score: {}".format(score), align='center', font=FONT)
                        enemy.clear()
                        enemy.hideturtle()
                        enemies.remove(enemy)
                        break
                else:  # no break
                    continue
    
                break
    
            bullet.clear()
            bullet.hideturtle()
    
            firing = False
    
        screen.ontimer(play, 100)
    
    screen = Screen()
    
    screen.onkey(shoot, 'space')
    screen.onkey(left, 'Left')
    screen.onkey(right, 'Right')
    screen.listen()
    
    play()
    
    screen.mainloop()
    

    仍然需要:左右移动敌人;使子弹射击和玩家/敌人的移动同时发生;加回highscore;等等

    【讨论】:

      猜你喜欢
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多