Phyton TypeError: объект 'bosses' не вызывается при вызове уровня функции - PullRequest
0 голосов
/ 17 апреля 2020

Это ошибка:

Traceback (most recent call last):
  File "C:\Users\Starlord\source\repos\SpazInvader\SpazInvader.py", line 344, in <module>
    boss2 = level2(setting_1, enemyChar_1, bossChar_1, enemies)
  File "C:\Users\Starlord\source\repos\SpazInvader\SpazInvader.py", line 222, in level2
    e = enemy(enemyChar[1], enemyChar[2])
TypeError: 'bosses' object is not callable

Это мой код, когда я вызываю level в первый раз, игра работает правильно, но когда я вызываю его во второй раз, выдает сообщение об ошибке. Если я называю его два раза без while в конце, он генерирует два уровня одновременно безошибочно, но если я вставлю в нем while, он не работает

import turtle
import os
import math
import random
import platform


if platform.system() == "Windows":
    try:
        import winsound
    except:
        print("Winsound Module not Available")

def playSound(soundFile, time = 0):
    if platform.system() == "Windows":
        winsound.PlaySound(soundFile, winsound.SND_ASYNC)
    elif platform.system() == "Linux":
        os.system("aplay -q ()&".format(soundFile))
    else:
        os.system("afplay {}&", format(soundFile)) 

    if time > 0:
        turtle.ontimer(lambda: playSound(soundFile, time), t = int(time * 1000))


playSound("Back.wav", 219)


wn = turtle.Screen()
wn.bgcolor("Blue")
wn.title("Spaz Invaderz")
wn.bgpic("universe.gif")
wn.tracer(0)


wn.register_shape("player.gif")
wn.register_shape("invaders.gif")
wn.register_shape("phantoms.gif")
wn.register_shape("gorgodusa.gif")
wn.register_shape("grayBar.gif")
wn.register_shape("redBar.gif")
wn.register_shape("redBarretta.gif")


def genTurtle(speed, color, x, y, shape = "none"):

    object = turtle.Turtle()
    object.speed(speed)
    object.color(color)
    if shape != "none":
        object.shape(shape)
    object.penup()
    object.setposition(x, y)

    return object


display = genTurtle(0, "green", -300, -250)
display.pendown()
display.pensize(3)
for side in range(2):
    display.fd(600)
    display.lt(90)
    for side in range(1):
        display.fd(500)
        display.lt(90)
display.hideturtle()


def fillStrings(turtle, name, align, font, fontsize, type):

    turtle.write(name, align = align, font = (font, fontsize, type))


title = genTurtle(0, "white", 0, 250)
fillStrings(title, "SPACE INVADERS", "center", "Comic Sans MS", 20, "bold")
title.hideturtle()


score = 0
scores = genTurtle(0, "white", -240, 215)
scoreString = "Score: {}".format(score)
fillStrings(scores, scoreString, "center", "Arial", 14, "normal")
scores.hideturtle()


bossLife = genTurtle(0, "white", 240, 215)
bossLife.hideturtle()

player = genTurtle(0, "white", 0, -200, "player.gif")
player.setheading(90)

player.speed = 0


def moveL():
    player.speed = -1

def moveR():
    player.speed = 1

def moveP():
    x = player.xcor()
    x += player.speed
    if x > 265:
        x = 265
    if x < -265:
        x = -265
    player.setx(x)

    wn.listen()
    wn.onkeypress(moveL, "a")
    wn.onkeypress(moveR, "d")
    wn.onkeypress(fireBullet, "space")

bulletState = "ready" 
bullet = genTurtle(0, "red", 0, -3000, "triangle")
bullet.setheading(90)
bullet.shapesize(0.5, 0.5)

bulletSpeed = 5

def fireBullet():
    global bulletState
    if bulletState == "ready":
        playSound("Shoot.wav")
        bulletState = "fire"
        x = player.xcor()
        y = player.ycor()
        bullet.setposition(x, y)


class enemy(turtle.Turtle):
    def __init__(self, shape = "square", life = 0):
        super(enemy, self).__init__(shape = shape)
        self.life = life

class bosses(turtle.Turtle):
    def __init__(self, shape = "circle", life = 0, name = "??"):
        super(bosses, self).__init__(shape = shape)
        self.life = life
        self.name = name


setting_1 = [1, score]
enemyChar_1 = [5, "invaders.gif", 0, -265, 180, 0, 0.05]
bossChar_1 = ["gorgodusa.gif", 1, "Gorgodusa"]


setting_2 = [2, score]
enemyChar_2 = [10, "phantoms.gif", 0, -265, 180, 0, 0.05]
bossChar_2 = ["gorgodusa.gif", 1, "Gorgodusa"]


def level(setting, enemyChar, bossChar, enemies):

    global enemySpeed
    for i in range(enemyChar[0]):
        e = enemy(enemyChar[1], enemyChar[2])
        enemies.append(e)
    print("1")
    startX = enemyChar[3]
    startY = enemyChar[4]
    eNum = enemyChar[5]
    print("2")
    for en in enemies:
        en.penup()
        en.speed(0)
        x = startX + (70 * eNum)
        y = startY
        en.setposition(x, y)
        eNum += 1
        if eNum == 8:
            startY -= 70
            eNum = 0
    print("3")
    enemySpeed = enemyChar[6]
    print("4")
    boss = bosses(bossChar[0], bossChar[1], bossChar[2])
    boss.penup()
    boss.setposition(0, -5000)
    boss.hideturtle()
    print("5")
    enemies.append(boss)

    return boss

enemies = []

enemySpeed = 0

grayBar = genTurtle(0, "white", 0, -3000, "grayBar.gif")
grayBar.hideturtle()
redBar = genTurtle(0, "white", 0, -3000, "redBar.gif")
redBar.hideturtle()


def isCollision(a, b, dimension):
    distance = math.sqrt(math.pow(a.xcor() - b.xcor(), 2) + math.pow(a.ycor() - b.ycor(), 2))
    if distance < dimension:
        return True
    else:
        return False

boss = level(setting_1, enemyChar_1, bossChar_1, enemies)

while boss.life != 0:
    wn.update()
    moveP()

    for enemy in enemies:
        x = enemy.xcor()
        x += enemySpeed
        enemy.setx(x)

        if enemy.xcor() > 265 or enemy.xcor() < -265:
            for e in enemies:
                y = e.ycor()
                y -= 40
                e.sety(y)
            enemySpeed *= -1

        if isCollision(bullet, enemy, 30):
            playSound("Death.wav")
            enemies.remove(enemy)
            bullet.setposition(0, -3000)
            bulletState = "ready"
            enemy.setposition(0, -3000)

            score += 10
            scores.clear()
            fillStrings(scores, "Score: {}".format(score), "center", "Arial", 14, "normal")

            if isCollision(player, enemy, 30):
                playSound("Explosion.Wav")
                wn.bgpic("gameover.gif")
                player.setposition(0, -4000)
                for e in enemies:
                    enemies.remove(e)
                    e.setposition(0, -5000)
                break

    if bulletState == "fire":
        bullet.showturtle()
        y = bullet.ycor()
        y += bulletSpeed
        bullet.sety(y)

    if bullet.ycor() > 240:
        bulletState = "ready"
        bullet.hideturtle()

    if len(enemies) == 1:
        boss.penup()
        boss.setposition(0, 160)
        grayBar.setposition(200, 200)
        grayBar.showturtle()
        redBar.setposition(200, 200)
        redBar.showturtle()
        fillStrings(bossLife, "Gorgodusa", "right", "Arial", 16, "normal")
        boss.showturtle()

    if isCollision(bullet, boss, 80):
        playSound("Death.wav")
        boss.life -= 1
        redBar.clear()
        redBar.shape("redBarretta.gif")
        if boss.life == 0:
            boss.setposition(0, -5000)
            enemies.remove(boss)
            score += 40
        scores.clear()
        fillStrings(scores, "Score: {}".format(score), "center", "Arial", 14, "normal")
        bullet.setposition(0, -3000)
        bullet.hideturtle()
        bulletState = "ready"   

boss2 = level(setting_2, enemyChar_2, bossChar_2, enemies)

, но это доставляет мне неприятности.

while boss2.life != 0:
    wn.update()
    moveP()

    for enemy in enemies:
        x = enemy.xcor()
        x += enemySpeed
        enemy.setx(x)

        if enemy.xcor() > 265 or enemy.xcor() < -265:
            for e in enemies:
                y = e.ycor()
                y -= 40
                e.sety(y)
            enemySpeed *= -1

        if isCollision(bullet, enemy, 30):
            playSound("Death.wav")
            enemies.remove(enemy)
            bullet.setposition(0, -3000)
            bulletState = "ready"
            enemy.setposition(0, -3000)

            score += 10
            scores.clear()
            fillStrings(scores, "Score: {}".format(score), "center", "Arial", 14, "normal")

            if isCollision(player, enemy, 30):
                playSound("Explosion.Wav")
                wn.bgpic("gameover.gif")
                player.setposition(0, -4000)
                for e in enemies:
                    enemies.remove(e)
                    e.setposition(0, -5000)
                break

    if bulletState == "fire":
        bullet.showturtle()
        y = bullet.ycor()
        y += bulletSpeed
        bullet.sety(y)

    if bullet.ycor() > 240:
        bulletState = "ready"
        bullet.hideturtle()

    if len(enemies) == 1:
        boss2.penup()
        boss2.setposition(0, 160)
        grayBar.setposition(200, 200)
        grayBar.showturtle()
        redBar.setposition(200, 200)
        redBar.showturtle()
        fillStrings(bossLife, "Gorgodusa", "right", "Arial", 16, "normal")
        boss2.showturtle()

    if isCollision(bullet, boss, 80):
        playSound("Death.wav")
        boss2.life -= 1
        redBar.clear()
        redBar.shape("redBarretta.gif")
        if boss2.life == 0:
            boss2.setposition(0, -5000)
            enemies.remove(boss2)
            score += 40
        scores.clear()
        fillStrings(scores, "Score: {}".format(score), "center", "Arial", 14, "normal")
        bullet.setposition(0, -3000)
        bullet.hideturtle()
        bulletState = "ready"   
...