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
Fehlercode ich weiß nicht warum (Anfänger)
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.
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.
-
- User
- Beiträge: 2
- Registriert: Samstag 29. Oktober 2022, 07:56