I have been recently writing a python game with pygame. Basically, it is a game in which you have to collect as much 'powerups' as possible, and if you have more than the other player, you can 'eat' him. However, while it works for the first player, whenever the second player gets more than the first, the first one just disappears. Here is my code:
import pygame,sys,random
from pygame.locals import *
class Player(pygame.sprite.Sprite):
playerscore = 0
def __init__(self,loc,x,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(loc)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.movex = 0
self.movey = 0
self.walls = None
allsprites_list.add(self)
def update(self):
self.rect.x += self.movex
block_hit_list = pygame.sprite.spritecollide(self, self.walls, False)
for block in block_hit_list:
if self.rect.x > 0:
self.rect.right = block.rect.left
else:
self.rect.left = block.rect.right
self.rect.y += self.movey
block_hit_list = pygame.sprite.spritecollide(self, self.walls, False)
for block in block_hit_list:
if self.rect.y > 0:
self.rect.bottom = block.rect.top
else:
self.rect.top = block.rect.bottom
eatingupdate()
for player in player_hit_list:
if self.playerscore > player.playerscore:
allsprites_list.remove(player)
elif self.playerscore < player.playerscore:
allsprites_list.remove(self)
def movement(self,event,playertype):
self.playertype = playertype
if self.playertype == 1:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.movex = -10
elif event.key == pygame.K_RIGHT:
self.movex = 10
elif event.key == pygame.K_UP:
self.movey = -10
elif event.key == pygame.K_DOWN:
self.movey = 10
if self.playertype == 2:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
self.movex = -10
elif event.key == pygame.K_d:
self.movex = 10
elif event.key == pygame.K_w:
self.movey = -10
elif event.key == pygame.K_s:
self.movey = 10
def winning(self):
self.image = pygame.image.load('Data/dotl.png')
player_list.remove(self)
def losing(self):
self.image = pygame.image.load('Data/circle.png')
player_list.add(self)
class Powerup(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('Data/powerup.png')
self.rect = self.image.get_rect()
def eatingupdate():
if player1.playerscore > player2.playerscore:
player2.losing()
player1.winning()
elif player2.playerscore > player1.playerscore:
player1.losing()
player2.winning()
class Wall(pygame.sprite.Sprite):
def __init__(self, x, y, width, height):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.image.fill((255,255,255))
self.rect = self.image.get_rect()
self.rect.y = y
self.rect.x = x
pygame.init()
powerup_list = pygame.sprite.Group()
allsprites_list = pygame.sprite.Group()
player_list = pygame.sprite.Group()
wall_list = pygame.sprite.Group()
pygame.mixer.init()
pygame.mixer.music.load('Data/song.wav')
pygame.mixer.music.set_volume(0.7)
pygame.mixer.music.play(-1)
player1 = Player('Data/circle.png',1390,430)
player1.walls = wall_list
player2 = Player('Data/circle.png',20,430)
player2.walls = wall_list
clock = pygame.time.Clock()
background_img = pygame.image.load('Data/background.jpg')
size = background_img.get_size()
pygame.display.set_caption('The TROLL Game')
display = pygame.display.set_mode(size)
clock = pygame.time.Clock()
wall = Wall(0, 0, 10, 900)
wall_list.add(wall)
allsprites_list.add(wall)
wall = Wall(10, 0, 1440, 10)
wall_list.add(wall)
allsprites_list.add(wall)
wall = Wall(1430,0,10,900)
wall_list.add(wall)
allsprites_list.add(wall)
wall = Wall(0,845,1440,10)
wall_list.add(wall)
allsprites_list.add(wall)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
player1.movement(event,1)
player2.movement(event,2)
powerupadd = 5
if len(powerup_list) > 10:
powerupadd = 0
else:
powerupadd += 1
for i in range(powerup):
powerup = Powerup()
powerup.rect.x = random.randrange(background_img.get_width())
powerup.rect.y = random.randrange(background_img.get_height())
powerup_list.add(powerup)
allsprites_list.add(powerup)
powerupadd -= 1
poweruphit_list1 = pygame.sprite.spritecollide(player1,powerup_list,True)
powerup_list2 = pygame.sprite.spritecollide(player2,powerup_list,True)
player_hit_list = pygame.sprite.spritecollide(player1 or player2,player_list, False)
for powerup in poweruphit_list1:
player1.playerscore += 1
for powerup in poweruphit_list2:
player2.playerscore += 1
player1.update()
player2.update()
display.blit(background_img,(0,0))
allsprites_list.draw(display)
pygame.display.update()
clock.tick(60)
Are there any careless mistakes? Any help is appreciated.