python - 如何修复我的敌人不会消失的错误?
问题描述
我想做一个太空侵略者游戏,但我的敌人如果被击中并不会消失。有谁知道如何修理它?
我已经尝试了一个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
;等等
推荐阅读
- asp.net-mvc - 在 nginx 反向代理后面设置 ASP NET Core MVC 应用程序的虚拟路径
- php - 如何在php中修复未设置的json对象
- vb.net - VB中有没有办法读取密钥,但如果没有按下任何键,代码将继续
- database - 在 Access 中为最终用户创建动态“复选框”查询
- c# - 我的 Win2D CanvasControl 不会根据其内容的尺寸自动调整自身大小。(UWP)
- laravel - Laravel 5.8,按角色超时会话
- php - 每个循环内部的 PHP 用户定义函数
- javafx-8 - javafx 如何将可用枚举列表添加到 ComboBoxTableCell?
- reactjs - useRef 挂钩未触发重新渲染
- java - 编译时引用类型相等