Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
isvisible()缺少1个必需的位置参数:';自我';Python海龟图形错误_Python_Turtle Graphics - Fatal编程技术网

isvisible()缺少1个必需的位置参数:';自我';Python海龟图形错误

isvisible()缺少1个必需的位置参数:';自我';Python海龟图形错误,python,turtle-graphics,Python,Turtle Graphics,我用python turtle开发这个简单的射击游戏已经有几天了,我遇到了一个我找不到答案的错误。 我想要的是,玩家每杀死5次,就会出现一个额外的敌人。但是当我被杀死5次时,无数的错误信息开始涌入。 错误消息是:isvisible()缺少1个必需的位置参数:“self” 它指向我的敌人\u攻击功能,我使用isvisible()命令来测试敌人是否被射杀,以便从另一个随机位置复活。提前谢谢你的帮助。 我为没有评论而道歉 import turtle import time import random

我用python turtle开发这个简单的射击游戏已经有几天了,我遇到了一个我找不到答案的错误。 我想要的是,玩家每杀死5次,就会出现一个额外的敌人。但是当我被杀死5次时,无数的错误信息开始涌入。 错误消息是:
isvisible()缺少1个必需的位置参数:“self”
它指向我的
敌人\u攻击
功能,我使用
isvisible()
命令来测试敌人是否被射杀,以便从另一个随机位置复活。提前谢谢你的帮助。 我为没有评论而道歉

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"))```
导入海龟
导入时间
随机输入
从随机导入randint
游戏结束=错误
kill_计数器=0
敌方产卵数量=5
def close():
乌龟,再见
速度=10
敌方速度=0.5
生命=3
wn=tutle.Screen()
wn.头衔(“辩护”)
wn.bgcolor(“黑色”)
wn.设置(宽度=600,高度=600)
wn.tracer(0)
玩家=乌龟。乌龟()
玩家速度(0)
玩家形状(“三角形”)
播放器颜色(“白色”)
player.penup()
玩家。转到(0,0)
life1=海龟。海龟()
寿命1.速度(0)
生命1.形状(“三角形”)
生命1.颜色(“黄色”)
life1.penup()
生活1.后藤(265,-260)
寿命1.设置标题(-90)
life2=life1.clone()
life2.goto(240,-260)
life3=life2.clone()
生活3.后藤(215,-260)
over_message=turtle.turtle()
过多信息。速度(0)
上方消息形状(“方形”)
信息上方。颜色(“白色”)
over_message.penup()
over_message.goto(0,0)
over_message.ht()
killcount=over_message.clone()
killcount.goto(250250)
killcount.ht()
killcount.write(“killcount:0”,align=“right”,font=(“Courier”,15,“normal”))
def go_up():
玩家设置标题(90)
球员向前(速度)
def go_right():
播放器设置标题(0)
球员向前(速度)
def go_left():
游戏者.设置标题(180)
球员向前(速度)
def go_down():
玩家设置标题(-90)
球员向前(速度)
听着
wn.ON按键(向上“w”)
右键按下(向右“d”)
wn.onkeypress(向左“a”)
按下键(向下“s”)
wn.onkeypress(关闭,“退出”)
收藏品=海龟。海龟()
收藏。速度(0)
可收藏。形状(“方形”)
收藏。颜色(“蓝色”)
可收藏的
可收藏。后藤(0100)
子弹=乌龟。乌龟()
子弹形状(“方形”)
项目符号颜色(“灰色”)
子弹形状尺寸(0.5,1)
子弹
bullet.penup()
bullet.goto(500500)
射击=假
def shoot():
全球拍摄
如果bullet.isvisible()==False:
player_x=player.xcor()
player_y=player.ycor()
player_face=player.heading()
子弹。转到(玩家x,玩家y)
项目符号。设置标题(玩家面向)
射击=正确
bullet.showturtle()
敌人=[]
敌人。追加(海龟。海龟()
对于敌人中的敌人:
敌人,速度(0)
敌人形状(“圆圈”)
敌人。颜色(“红色”)
敌人
敌人,后藤(0350)
定义敌人的攻击()
全球游戏结束
对于敌人中的敌人:
如果敌方.isvisible()==真:
敌方设置方向(敌方朝向(玩家))
敌人前进(敌人的速度)
wn.ontimer(敌人的攻击,10)
其他:
如果game_over==False:
rand_方向=randint(0,3)
如果rand_方向==0:
x=randint(-240200)
敌人,后藤(x,450)
敌方
敌人的攻击
elif rand_方向==1:
x=randint(-240200)
敌人。后藤(x,-450)
敌方
敌人的攻击
elif rand_方向==2:
y=randint(-210210)
敌人。转到(-450,y)
敌方
敌人的攻击
elif rand_方向==3:
y=randint(-210210)
敌人,后藤(450,y)
敌方
敌人的攻击
敌人的攻击
wn.onkey(拍摄,“空间”)
尽管如此:
wn.update()
如果玩家距离(可收藏)<20:
x=randint(-290290,290)
y=randint(-290290,290)
可收藏。转到(x,y)
如果bullet.xcor()大于310或bullet.xcor()310或bullet.ycor()285:
playerX=player.xcor()
playerX=playerX-5
playerY=player.ycor()
游戏者。后藤(游戏者,游戏者)
elif player.xcor()285:
playerY=player.ycor()
playerY=playerY-5
playerX=player.xcor()
游戏者。后藤(游戏者,游戏者)

elif player.ycor()我运行代码,它大部分时间运行正常

在某个时刻它出错了

Traceback (most recent call last):
  File "/home/furas/main.py", line 198, in <module>
    enemy.speed(0)
  File "/usr/lib/python3.7/turtle.py", line 2167, in speed
    return self._speed
AttributeError: 'int' object has no attribute '_speed'
所以它添加了类Turtle而不是Turle的实例

添加
()
后,我没有这个错误,但似乎还有其他问题,因为在杀死5个敌人后,它会冻结。需要进行一些调试(或使用
print()
)才能找到问题所在


编辑:如果我在开始时添加两个敌人,我会遇到同样的问题。问题可能是它可能会运行两次
wn.ontimer
,这可能会运行另外两次
wn.ontimer
,所以最后它可能没有时间执行它们


编辑:如果我在函数末尾只使用wn.ontimer(敌方攻击,10)并删除其他敌方攻击(),代码效果会更好。但这一次,敌人大多同时出现,当我杀死其中一个敌人时,它就会将他们全部移除。它可能需要更多的改变

def enemy_attack():
    global game_over
    for enemy in enemies:
        if enemy.isvisible() == True:
            enemy.setheading(enemy.towards(player))
            enemy.forward(enemy_speed)
        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()

    wn.ontimer(enemy_attack, 10)

我看到的主要问题是@furas所指的:
敌方攻击()
通过递归和定时器调用自身<代码>海龟。海龟
不带括号调用。我认为无论哪种方式调用
敌方攻击()
都不是一个好主意,应该在主程序循环中调用它

使用
ontimer()
的一个问题是,您需要确定时间
def enemy_attack():
    global game_over
    for enemy in enemies:
        if enemy.isvisible() == True:
            enemy.setheading(enemy.towards(player))
            enemy.forward(enemy_speed)
        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()

    wn.ontimer(enemy_attack, 10)
if bullet.isvisible() == False:
    if enemy.isvisible() == True:
        if game_over == False:
if shooting == True:
if not bullet.isvisible():
    if enemy.isvisible():
        if not game_over:
if shooting:
from turtle import Screen, Turtle
from random import randint

ENEMY_SPEED = 1
PLAYER_SPEED = 4
BULLET_SPEED = 6

SMALL_FONT = ('Courier', 15, 'normal')
LARGE_FONT = ('Courier', 24, 'normal')

def go_up():
    player.setheading(90)
    player.forward(PLAYER_SPEED)

def go_right():
    player.setheading(0)
    player.forward(PLAYER_SPEED)

def go_left():
    player.setheading(180)
    player.forward(PLAYER_SPEED)

def go_down():
    player.setheading(-90)
    player.forward(PLAYER_SPEED)

def enemy_attack():

    for enemy in enemies:

        if enemy.isvisible():
            enemy.setheading(enemy.towards(player))
            enemy.forward(ENEMY_SPEED)
        else:
            rand_direction = randint(0, 3)

            if rand_direction == 0:
                x = randint(-240, 200)
                enemy.goto(x, 325)
            elif rand_direction == 1:
                x = randint(-240, 200)
                enemy.goto(x, -325)
            elif rand_direction == 2:
                y = randint(-210, 210)
                enemy.goto(-325, y)
            elif rand_direction == 3:
                y = randint(-210, 210)
                enemy.goto(325, y)

            enemy.showturtle()

def shoot():
    if not bullet.isvisible():
        bullet.goto(player.position())
        bullet.setheading(player.heading())
        bullet.showturtle()

kill_counter = 0
enemy_spawn_number = 5
lives = 3

def move():
    global kill_counter, enemy_spawn_number, lives

    enemy_attack()

    if player.distance(collectible) < 20:
        collectible.goto(randint(-260, 260), randint(-260, 260))

    if bullet.isvisible():
        if not (-310 < bullet.xcor() < 310 and -310 < bullet.ycor() < 310):
            bullet.hideturtle()
        else:
            bullet.forward(BULLET_SPEED)

    playerX, playerY = player.position()

    if playerX > 285:
        player.setx(playerX - 5)
    elif playerX < -285:
        player.setx(playerX + 5)
    elif playerY > 285:
        player.sety(playerY - 5)
    elif playerY < -285:
        player.sety(playerY + 5)

    for enemy in enemies:
        if bullet.isvisible() and bullet.distance(enemy) < 15:
            bullet.hideturtle()
            enemy.hideturtle()
            enemy.sety(325)

            kill_counter += 1
            killcount.clear()
            killcount.write("Kill Count: {}".format(kill_counter), align='right', font=SMALL_FONT)

            if kill_counter == enemy_spawn_number:
                enemy = enemy_prototype.clone()
                enemy.showturtle()

                enemies.append(enemy)

                for enemy in enemies:
                    enemy.sety(325)

                enemy_spawn_number += 5

        if enemy.distance(player) < 20:
            enemy.hideturtle()
            player.goto(0, 0)

            lives -= 1

            if lives == 2:
                life3.hideturtle()
            elif lives == 1:
                life2.hideturtle()
            elif lives == 0:
                life1.hideturtle()

    if lives == 0:
        collectible.hideturtle()
        player.hideturtle()

        for enemy in enemies:
            enemy.hideturtle()

        over_message.write("Game Over! Press Esc to exit.", align='center', font=LARGE_FONT)
    else:
        screen.ontimer(move, 70)

    screen.update()

screen = Screen()
screen.setup(width=600, height=600)
screen.title("Defend.")
screen.bgcolor('black')
screen.tracer(0)

player = Turtle()
player.shape('triangle')
player.color('white')
player.penup()

life1 = Turtle()
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()
over_message.hideturtle()
over_message.color('white')
over_message.penup()

killcount = over_message.clone()
killcount.goto(270, 270)
killcount.write("Kill Count: 0", align='right', font=SMALL_FONT)

collectible = Turtle()
collectible.shape('square')
collectible.color('blue')
collectible.penup()
collectible.goto(randint(-260, 260), randint(-260, 260))

bullet = Turtle()
bullet.hideturtle()
bullet.shape('square')
bullet.shapesize(0.5, 1)
bullet.color('grey')
bullet.penup()
bullet.goto(500, 500)

enemy_prototype = Turtle()
enemy_prototype.hideturtle()
enemy_prototype.shape('circle')
enemy_prototype.color('red')
enemy_prototype.penup()
enemy_prototype.sety(325)

enemy = enemy_prototype.clone()
enemy.showturtle()

enemies = [enemy]

screen.onkeypress(go_up, 'w')
screen.onkeypress(go_right, 'd')
screen.onkeypress(go_left, 'a')
screen.onkeypress(go_down, 's')
screen.onkeypress(screen.bye, 'Escape')
screen.onkeypress(shoot, 'space')
screen.listen()

move()

screen.mainloop()
life1.goto(265,-260)
life2.goto(240,-260)
life3.goto(215,-260)
killcount.goto(250,250)
x = randint(-240, 200)
x = randint(-240, 200)
y = randint(-210, 210)
y = randint(-210, 210)
x = randint(-290, 290)
y = randint(-290, 290)
if bullet.xcor()>310 or bullet.xcor()<-310 or bullet.ycor()>310 or bullet.ycor()<-300:
if player.xcor()>285:
elif player.xcor()<-285:
elif player.ycor()>285:
elif player.ycor()<-285:
screen.setup(width=600, height=600)