SpaceFace
SpaceFace

Reputation: 53

Pygame Space Invaders Bug

'''There's a minor bug in this Space Invaders Code, everything works fine and well at the start , until all of a sudden sometimes, mostly at the end of the game, some of the enemy spaceships suddenly moves extremely fast and wayy faster than the other enemies, but follows the same path as the others..If I manage to shoot down the fast spaceships, more of them start moving at the very same fast speed, how it that??I have attached the code down below:'''

import pygame
import random
import math
from pygame import mixer
# Initialize and create a Game Window
pygame.init()
screen = pygame.display.set_mode(size=(800,600))

#Caption and Icon
pygame.display.set_caption('Space Invaders')
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)

#Background
background = pygame.image.load('background.png')
#BackgroundSound
mixer.music.load('background.wav')
mixer.music.play(-1)

#Player
playerImg = pygame.image.load('player.png')
playerX=360
playerY=470
playerX_change = 0

#Enemy
enemyImg=[]
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies=6
for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load('enemy.png'))
    enemyX.append(random.randint(0,736))
    enemyY.append(random.randint(40,120))
    enemyX_change.append(4)
    enemyY_change.append(20)

#Bullet
bulletImg = pygame.image.load('bullet.png')
bulletX=0
bulletY=480
bulletX_change = 0
bulletY_change = -10
bulletstate = 'ready'  # Bullet is 'ready' if its ready to shoot and 'fire' means a bullet is fired
#Number of Bullets
no_of_bullets=0

#Score
score_value=0
Score_font = pygame.font.Font("freesansbold.ttf" , 32)
textX=10
textY=10
#Number of bullets
def Show_score(x,y):
    score=Score_font.render("Score: " + str(score_value) , True , (255,255,255))
    screen.blit(score , (x,y))   

def player(x,y):
    screen.blit(playerImg , (playerX , playerY))
    
def enemy(x, y, i):
    screen.blit(enemyImg[i] , (enemyX[i] , enemyY[i]))

def bullet_fire(x,y):
    global bulletstate
    bulletstate='fire'
    screen.blit(bulletImg ,(x+16 , y+10))
    
def Collision(bulletX , bulletY , enemyX , enemyY):
    distance=math.sqrt((math.pow(enemyX-bulletX,2)) + (math.pow(bulletY-enemyY,2)))
    if distance<29:
        return True
    else:
        return False 
def game_over():
    font1 = pygame.font.Font("BUBBLEGUMS.ttf" , 68)
    gameover=font1.render("GAME OVER "  , True , (255,255,255))
    screen.blit(gameover , (100,200))
def numberofbullets():
    font2=pygame.font.Font("blow.ttf",35)
    number_of_bullets=font2.render("Number of Bullets Shot: " + str(no_of_bullets) , True , (0,255,255))
    screen.blit(number_of_bullets , (170,375))
      

#Game Loop
running=True
while running:
    # BackgroundImage
    screen.blit(background ,(0,0))
    
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            
                       
    #Keystroke
        if event.type == pygame.KEYDOWN:
             
            if event.key ==pygame.K_LEFT:
                playerX_change -=6
                
            if event.key == pygame.K_RIGHT:
                playerX_change +=6
                
                
            if bulletstate=='ready':
                if event.key == pygame.K_SPACE:
                    no_of_bullets+=1
                    bulletX=playerX
                    bullet_fire(bulletX,bulletY)
                    bullet_sound = mixer.Sound('laser.wav')
                    bullet_sound.play()
        if event.type ==pygame.KEYUP:
            if event.key ==pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change=0
                        
                            
  
    #Checking for Boundaries of Spaceship
    playerX +=playerX_change
    if playerX>=736:
        playerX=736
    elif playerX<=0:
        playerX=0 
    
    # Enemy Movement
    for i in range(num_of_enemies):
        if enemyY[i]>440:
            for j in range(num_of_enemies):
                enemyY[j]=2000
            game_over()
            numberofbullets()
            break
                
        
        enemyX[i] +=enemyX_change[i]
        if enemyX[i]>735:
            enemyX_change[i]+=-4  
            enemyY[i] +=enemyY_change[i]      
        elif enemyX[i]<0:
            enemyX_change[i]+=4
            enemyY[i] +=enemyY_change[i]
                
        #Collision
        collision = Collision(bulletX, bulletY, enemyX[i], enemyY[i])
        if collision:
            collision_sound = mixer.Sound('explosion.wav')
            collision_sound.play()
            bulletY=480
            bulletstate='ready'
            enemyX[i]=random.randint(0,800)
            enemyY[i]=random.randint(40,120)
            score_value+=100
            
        enemy(enemyX[i],enemyY[i] ,i)

    #Bullet Movement
    if bulletY<=0:
        bulletY=480
        bulletstate='ready'
                
        
    if bulletstate=='fire':
        bullet_fire(bulletX, bulletY)
        bulletY+=bulletY_change
            
       
    player(playerX,playerY)   
    Show_score(textX, textY)
    pygame.display.update()

Upvotes: 0

Views: 79

Answers (1)

Alfredo Mauri
Alfredo Mauri

Reputation: 81

The problem of your code is that when your write this:

enemyX[i] +=enemyX_change[i]
    if enemyX[i]>735:
        enemyX_change[i]+=-4  
        enemyY[i] +=enemyY_change[i]      
    elif enemyX[i]<0:
        enemyX_change[i]+=4
        enemyY[i] +=enemyY_change[i]

every time the enemy reaches an edge enemyX_change[i] should be set to the opposite of what it was before, not by adding or subtracting 4, but directly by setting it to 4 or -4. Also you should set enemyX[i] to be 735 when the enemy reaches the left side and 0 when he reaches the right side.

If you change that piece of code with this one everything should work fine:

if enemyX[i]>735:
        enemyX[i] = 735
        enemyX_change[i] = -4  
        enemyY[i] +=enemyY_change[i]      
    elif enemyX[i]<0:
        enemyX[i] = 0
        enemyX_change[i] = 4
        enemyY[i] +=enemyY_change[i]

Upvotes: 1

Related Questions