私は現在、Python 3.5.2を使用して単純なスペースインベーダーPythonゲームを作成しようとしています。現在はすべて動作しますが、弾丸が私のエイリアンの側面に当たったときは、プログラムはエラーを表示します。 これは、コードPygame 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]])
弾丸は、外国人の側に達すると、プログラムは停止し、次のエラーが表示されています。
Traceback (most recent call last):
File "Python35\game.py", line 36, in <module>
alienpos.remove(i)
ValueError: list.remove(x): x not in list
はStackOverflowの時にこの主題について同様の質問がたくさんありますが、提案のどれも非常に任意の助けにされていません。あなたが必要とする情報が他にもあれば、私はコメントしてもらえます。前もって感謝します!リストからalien
を削除するが、後であなたはまだ他のbullets
や他のbullet
でこれalien
をチェックするため
「i」は以前の 'bulletpos'で削除されましたか? 'i'が削除されたときに' for j'ループを終了してください。または削除する前に 'i 'がまだalienposにあるかどうかをテストする – fredtantini
PyGameには、' pygame.Rect() 'を使って衝突をチェックする特殊な関数があります。また、オブジェクトのグループを保持する 'pygame.sprite.Group()'を持ち、衝突をチェックして要素を自動的に削除することができます。 – furas
Pythonでは、新しいリストを作成し、for-loopで、オリジンのリストから要素を削除するよりも、保持したい要素を追加するほうがいいです。 'for-loop'の後にoryginalリストの代わりに新しいリストを割り当てます。 – furas