Это ошибка:
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"