python - 如何修复我的敌人不消失的错误?

标签 python python-3.x turtle-graphics

我想制作一款《太空入侵者》游戏,但我的敌人被击中后不会消失。有谁知道如何解决吗?

我已经尝试了 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()

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

最佳答案

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

    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;等等

enter image description here

关于python - 如何修复我的敌人不消失的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56610128/

相关文章:

python - 你能解释一下这是如何工作的吗?

python - 在 Python 3.4 中生成具有重复项的随机数的随机列表

python - tkinter 消息框未显示在 Windows 任务栏上

python - 如何在python中创建一个继承自turtle Module的子类

python - 使用递归绘制嵌套三角形

python - 使用python在teensy bord和系统之间进行串行通信

python - 如何将列表的第一项附加到该列表的所有排列的末尾?

python-3.x - 在 debian 11 Bullseye 上使用 Ansible 安装损坏的软件包

python - turtle 颜色不随变量和列表而改变

python - 动态比较常见事件的列表