Ich versuche derzeit, ein einfaches Space Invaders Python-Spiel mit Python 3.5.2 zu erstellen. Momentan läuft alles, aber wenn das Geschoss auf die Seite meines Aliens trifft, zeigt das Programm einen Fehler an. Dies ist der CodePygame Collision Error Python 3
import pygame
from pygame.locals import *
pygame.init()
width, height = 640, 480
keys=[False, False, False, False]
playerpos=[290,400]
alienpos=[]
bulletpos=[]
for i in range(100, 600, 100):
for j in range(0, 150, 50):
alienpos.append([i, j])
screen = pygame.display.set_mode((width, height))
space = pygame.image.load("space.jpg")
alien = pygame.image.load("alien.png")
bullet = pygame.image.load("bullet.png")
space = pygame.transform.scale(space,(width,height))
player = pygame.image.load("spacecraft.png")
flag1 = 0
flag2 = 0
switch = True
while 1:
screen.fill(0)
screen.blit(space,(0,0))
for i in alienpos:
for j in bulletpos:
if i[1]<=j[1] and i[1]+28 >= j[1] and i[0]<=j[0] and i[0]+28 >= j[0]:
alienpos.remove(i)
screen.blit(alien, i)
if (i[0] + 1) > 600:
flag1 = 1
elif (i[0] - 1) < 1:
flag1 = 0
if flag1 == 0:
i[0] += 1
elif flag1 == 1:
i[0] -= 1
if not len(bulletpos)==0:
for pos in bulletpos:
if pos[1] > 0:
screen.blit(bullet, pos)
pos[1] -= 1
pos=([playerpos[0], playerpos[1]])
screen.blit(player, playerpos)
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key==K_w:
keys[0]=True
elif event.key==K_a:
keys[1]=True
elif event.key==K_s:
keys[2]=True
elif event.key==K_d:
keys[3]=True
if event.type == pygame.KEYUP:
if event.key==pygame.K_w:
keys[0]=False
elif event.key==pygame.K_a:
keys[1]=False
elif event.key==pygame.K_s:
keys[2]=False
elif event.key==pygame.K_d:
keys[3]=False
if event.type == pygame.QUIT:
pygame.quit()
exit(0)
if keys[1]:
playerpos[0]-=5
elif keys[3]:
playerpos[0]+=5
elif keys[0]:
bulletpos.append([playerpos[0], playerpos[1]])
Wenn die Kugel auf der Seite der Ausländer trifft, stoppt das Programm und die folgende Fehlermeldung angezeigt.
Traceback (most recent call last):
File "Python35\game.py", line 36, in <module>
alienpos.remove(i)
ValueError: list.remove(x): x not in list
Es gibt viele ähnliche Fragen zu diesem Thema bei Stackoverflow, aber keiner der Vorschläge haben keine Hilfe viel gewesen. Wenn es weitere Informationen gibt, die Sie alle benötigen, würde ich mich freuen, Sie zu kommentieren. Danke im Voraus!
Konnte 'i' durch einen vorherigen' bulletpos' entfernt werden? Versuchen Sie Folgendes: Beenden Sie die 'for j'-Schleife, wenn' i' entfernt wurde; oder testen, ob "i" immer noch in "alienpos" vor dem Entfernen – fredtantini
PyGame hat spezielle Funktionen, um Kollisionen mit 'pygame.Rect()' zu überprüfen. Und es hat 'pygame.sprite.Group()', die eine Gruppe von Objekten enthält und Kollisionen überprüfen und Elemente automatisch entfernen kann. – furas
In Python besser neue Liste erstellen und in for-Schleife Elemente hinzufügen, die Sie behalten möchten, als Elemente aus oryginal Liste zu entfernen. Und nach 'for-loop' ordnen Sie eine neue Liste anstelle einer origine-Liste zu. – furas