回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我用python turtle开发这个简单的射击游戏已经有几天了,我遇到了一个我找不到答案的错误。
我想要的是,玩家每杀死5次,就会出现一个额外的敌人。但是当我被杀死5次时,无数的错误信息开始涌入。
错误消息是:<code>isvisible() missing 1 required positional argument: 'self'</code>
它指向我的<code>enemy_attack</code>函数,在该函数中,我使用<code>isvisible()</code>命令测试敌人是否被射杀,以使其从另一个随机位置重生。提前谢谢你的帮助。
我为没有评论而道歉</p>
<pre><code>import turtle
import time
import random
from random import randint
game_over = False
kill_counter = 0
enemy_spawn_number = 5
def close():
turtle.bye()
speed = 10
enemy_speed = 0.5
lives = 3
wn = turtle.Screen()
wn.title("Defend.")
wn.bgcolor("black")
wn.setup(width=600, height=600)
wn.tracer(0)
player = turtle.Turtle()
player.speed(0)
player.shape("triangle")
player.color("white")
player.penup()
player.goto(0,0)
life1 = turtle.Turtle()
life1.speed(0)
life1.shape("triangle")
life1.color("yellow")
life1.penup()
life1.goto(265,-260)
life1.setheading(-90)
life2 = life1.clone()
life2.goto(240,-260)
life3 = life2.clone()
life3.goto(215,-260)
over_message = turtle.Turtle()
over_message.speed(0)
over_message.shape("square")
over_message.color("white")
over_message.penup()
over_message.goto(0,0)
over_message.ht()
killcount = over_message.clone()
killcount.goto(250,250)
killcount.ht()
killcount.write("Kill Count: 0", align="right", font=("Courier", 15, "normal"))
def go_up():
player.setheading(90)
player.forward(speed)
def go_right():
player.setheading(0)
player.forward(speed)
def go_left():
player.setheading(180)
player.forward(speed)
def go_down():
player.setheading(-90)
player.forward(speed)
wn.listen()
wn.onkeypress(go_up, "w")
wn.onkeypress(go_right, "d")
wn.onkeypress(go_left, "a")
wn.onkeypress(go_down, "s")
wn.onkeypress(close, "Escape")
collectible = turtle.Turtle()
collectible.speed(0)
collectible.shape("square")
collectible.color("blue")
collectible.penup()
collectible.goto(0,100)
bullet = turtle.Turtle()
bullet.shape("square")
bullet.color("grey")
bullet.shapesize(0.5,1)
bullet.hideturtle()
bullet.penup()
bullet.goto(500,500)
shooting = False
def shoot():
global shooting
if bullet.isvisible() == False:
player_x = player.xcor()
player_y = player.ycor()
player_facing = player.heading()
bullet.goto(player_x,player_y)
bullet.setheading(player_facing)
shooting = True
bullet.showturtle()
enemies = []
enemies.append(turtle.Turtle())
for enemy in enemies:
enemy.speed(0)
enemy.shape("circle")
enemy.color("red")
enemy.penup()
enemy.goto(0,350)
def enemy_attack():
global game_over
for enemy in enemies:
if enemy.isvisible() == True:
enemy.setheading(enemy.towards(player))
enemy.forward(enemy_speed)
wn.ontimer(enemy_attack, 10)
else:
if game_over == False:
rand_direction = randint(0,3)
if rand_direction == 0:
x = randint(-240, 200)
enemy.goto(x,450)
enemy.st()
enemy_attack()
elif rand_direction == 1:
x = randint(-240, 200)
enemy.goto(x,-450)
enemy.st()
enemy_attack()
elif rand_direction == 2:
y = randint(-210, 210)
enemy.goto(-450,y)
enemy.st()
enemy_attack()
elif rand_direction == 3:
y = randint(-210, 210)
enemy.goto(450,y)
enemy.st()
enemy_attack()
enemy_attack()
wn.onkey(shoot, "space")
while True:
wn.update()
if player.distance(collectible) < 20:
x = randint(-290, 290)
y = randint(-290, 290)
collectible.goto(x,y)
if bullet.xcor()>310 or bullet.xcor()<-310 or bullet.ycor()>310 or bullet.ycor()<-300:
shooting = False
bullet.hideturtle()
if shooting == True:
bullet.forward(0.2)
if player.xcor()>285:
playerX = player.xcor()
playerX = playerX-5
playerY = player.ycor()
player.goto(playerX,playerY)
elif player.xcor()<-285:
playerX = player.xcor()
playerX = playerX+5
playerY = player.ycor()
player.goto(playerX,playerY)
elif player.ycor()>285:
playerY = player.ycor()
playerY = playerY-5
playerX = player.xcor()
player.goto(playerX,playerY)
elif player.ycor()<-285:
playerY = player.ycor()
playerY = playerY+5
playerX = player.xcor()
player.goto(playerX,playerY)
for enemy in enemies:
if bullet.distance(enemy) < 20:
bullet.hideturtle()
enemy.hideturtle()
enemy.goto(0,350)
kill_counter = kill_counter+1
killcount.clear()
killcount.write("Kill Count: {}".format(kill_counter), align="right", font=("Courier", 15, "normal"))
if kill_counter == enemy_spawn_number:
enemies.append(turtle.Turtle)
for enemy in enemies:
enemy.speed(0)
enemy.shape("circle")
enemy.color("red")
enemy.penup()
enemy.goto(0,350)
enemy_spawn_number += 5
if enemy.distance(player) < 20:
enemy.ht()
player.goto(0,0)
lives = lives-1
if lives == 2:
life3.ht()
elif lives == 1:
life2.ht()
elif lives == 0:
life1.ht()
time.sleep(0.1)
if lives == 0:
game_over = True
collectible.ht()
player.ht()
for enemy in enemies:
enemy.ht()
over_message.write("Game Over! Press Esc to exit.", align="center", font=("Courier", 24, "normal"))```
</code></pre>