Reputation: 53
'''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
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