Fehlercode ich weiß nicht warum (Anfänger)

Code-Stücke können hier veröffentlicht werden.
Antworten
PythonAnfänger3007
User
Beiträge: 2
Registriert: Samstag 29. Oktober 2022, 07:56

Hallo, ich bin blutiger Anfänger und habe ein kleines Space inveaders spiel programmiert. Es sind ca 180 Zeilen. Tut mir leid dass ich alle hochlade, aber ich weiß einfach nicht was das problem ist. Der Fehlercode lautet: cannot unpack non-iterable function objekt
Also wenn man verliert kann man mit enter neu starten. Wenn man das tut bricht das Spiel aber ab und es kommt der oben genannte Fehler.
Wenn ich dann neu starte ist das Hiscore Dokument leer und es kommt gleich eine Fehlermeldung (invalid literal for int() with base 10: '')
Der Code ist:
import pgzrun
import random
import math

TITLE="AlienBoom"
WIDTH=600
HEIGHT=600
score=0
f=open("hi.txt","r")
gameover=False
music.play('musio')
hiscore=int(f.read())
f.close()


player_ship=Actor("playership")
player_ship.centerx=WIDTH//2
player_ship.bottom=HEIGHT-30
player_speed=10

bullet=Actor("laserred16")
bullet_speed=45
bullet_fire=False
COOLDOWN=False

def reset_enemy_boss():
return (random.randint(0,WIDTH-25),random.randint(-200,-50))

enemy_boss=Actor("ship-1")
enemy_boss.speed=random.uniform(1,3)
enemy_boss.pos=reset_enemy_boss()
print(enemy_boss)


def reset_enemy():
return (random.randint(25,WIDTH-25),random.randint(-200,-50))

enemies=[]
for x in range(10):
enemy=Actor(random.choice(["enemy01","enemy02","enemy03","enemy04","enemy05"]))

enemy.pos=reset_enemy()
enemy.speed=random.uniform(1,3)
enemies.append(enemy)
print(enemies)

#stars
stars=[]
for s in range(100):
stars.append([random.randint(0,WIDTH),random.randint(0,HEIGHT),random.uniform(1,4)])

def update ():
global bullet_fire,score,player_speed,bullet_speed,gameover,hiscore
if gameover and keyboard.RETURN:
gameover=False
score=0
bullet_speed=45
player_speed=10
enemy_boss.speed=random.uniform(1,3)
enemy_boss.pos=reset_enemy_boss
for enemy in enemies:
enemy.pos=reset_enemy()
enemy.speed=random.uniform(1,3)
if bullet.colliderect(enemy_boss):
score+=2
bullet_fire=False
sounds.tot.play()
COOLDOWN=True
enemy_boss.pos=reset_enemy()
for enemy in enemies:
enemy.speed=random.uniform(1,3)

if gameover:
enemy_boss.speed=0
if score>hiscore:
score=hiscore



if player_ship.colliderect(enemy_boss):
gameover=True
if score>hiscore:
f=open("hi.txt","w")
f.write(str(hiscore))
player_speed=0

enemy_boss.speed=0

enemy_boss.pos=reset_enemy_boss()
enemy_boss.speed=0
bullet_speed=0
sounds.explosion.play()



if keyboard.left and player_ship.left>0:
player_ship.centerx-=player_speed
elif keyboard.right and player_ship.right<600:
player_ship.centerx+=player_speed

if not bullet_fire:
bullet.centerx=player_ship.centerx
bullet.bottom=player_ship.bottom

if keyboard.space and bullet_fire==False:
bullet_fire=True
sounds.laser.play()

if bullet_fire:
bullet.bottom-=bullet_speed
if bullet.bottom<0:
bullet_fire=False

if keyboard.up and gameover==False and player_ship.top>0:
player_ship.top-=player_speed
elif keyboard.down and gameover==False and player_ship.bottom<600:
player_ship.bottom+=player_speed

enemy_boss.top+=enemy_boss.speed
enemy_boss.centerx+=math.sin(math.radians(enemy_boss.top%360))*3
if enemy_boss.top>HEIGHT:
enemy_boss.bottom=reset_enemy()





for enemy in enemies:
enemy.top+=enemy.speed
enemy.centerx+=math.sin(math.radians(enemy.top%360))*3
if enemy.top>HEIGHT:
enemy.pos=reset_enemy()

if bullet.colliderect(enemy):
score+=1
bullet_fire=False
sounds.tot.play()
COOLDOWN=True
enemy.pos=reset_enemy()


if player_ship.colliderect(enemy):
gameover=True
f=open("hi.txt","w")
f.write(str(hiscore))
player_speed=0
for enemy in enemies:
enemy.pos=reset_enemy()
enemy.speed=0
bullet_speed=0
sounds.explosion.play()
enemy_boss.pos=reset_enemy_boss
if score>hiscore:
hiscore=score

if enemy_boss.bottom>HEIGHT:
gameover=True
f=open("hi.txt","w")
f.write(str(hiscore))
player_speed=0
for enemy in enemies:
enemy.speed=0
enemy.pos=reset_enemy()

enemy_boss.speed=0

enemy_boss.pos=reset_enemy()
enemy_boss.speed=0
bullet_speed=0
sounds.explosion.play()

#stars
for s in stars:
s[1]+=s[2]
if s[1]>HEIGHT:
s[1]=0

def draw():
screen.blit(images.background, (0,0))
enemy_boss.draw()
for s in stars:
screen.draw.filled_circle(s[:2],s[2],"white")
bullet.draw()
player_ship.draw()
for enemy in enemies:
enemy.draw()
screen.draw.text("Score: "+str(score),(10,10),fontname="pixeled")
screen.draw.text("Hiscore: "+str(hiscore),(45,45),fontname="pixeled")
if gameover:
screen.draw.textbox("press Enter to restart!",(95,280,400,80),color="white",fontname="pixeled")
screen.draw.textbox("GAME OVER",(95,200,400,80),color="red",fontname="pixeled")

pgzrun.go()



Könnt ihr mir sagen was der Fehler ist?
LG PythonAnfänger3007
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ohne den kompletten Traceback weiß hier niemand (ohne lange suchen zu müssen) wo der Fehler auftritt.
Dass Deine Highscore-Datei leer ist, liegt daran, dass Du sie Bach dem Beschreiben nicht ordentlich schließt. Das macht man am besten mit Hilfe des with-Statements.
Dieses pygame Zero scheint massiv auf magisches Verhalten zu setzen, so dass der Programmfluß verschleiert ist und man alles im globalen Namespace definiert wird. Das führt vielleicht zu schnellen Ergebnissen, aber ab einer gewissen Komplexität stößt man auf unüberwindliche Hindernisse. Vielleicht ist das Neustarten des Spiels schon so ein Hindernis.
PythonAnfänger3007
User
Beiträge: 2
Registriert: Samstag 29. Oktober 2022, 07:56

Sirius3 hat geschrieben: Samstag 29. Oktober 2022, 09:47 Dass Deine Highscore-Datei leer ist, liegt daran, dass Du sie Bach dem Beschreiben nicht ordentlich schließt. Das macht man am besten mit Hilfe des with-Statements.

Ok dsanke
Antworten