Reputation: 13
So I've just been writing a dodger game for practice using pygame and python. I've read a lot of tutorials and looked at other similar games to help me. Basically, aliens come down from the top of the screen (they're supposed to be random sizes and speeds and their location is supposed to be random as well) and the player uses their mouse to move the spaceship to dodge the falling aliens.
I have an if statement that is supposed to multiply the aliens coming down from the top but when I run the game only one alien falls and when it reaches the end of the screen it just disappears. No other aliens appear. The program is still running so the game hasn't ended.
Here is my full code.
import pygame
import random
import sys
from pygame.locals import *
alienimg = pygame.image.load('C:\\Python27\\alien.png')
playerimg = pygame.image.load('C:\\Python27\\spaceship.png')
def playerCollision(playerRect, aliens): # a function for when the player hits an alien
for a in aliens:
if playerRect.colliderect(a['rect']):
return True
return False
def screenText(text, font, screen, x, y): #text display function
textobj = font.render(text, 1, (255, 255, 255))
textrect = textobj.get_rect()
textrect.topleft = (x,y)
screen.blit(textobj, textrect)
def main(): #this is the main function that starts the game
pygame.init()
screen = pygame.display.set_mode((500,500))
clock = pygame.time.Clock()
pygame.mouse.set_visible(False)
pygame.display.set_caption('Dodge the Aliens')
font = pygame.font.SysFont("monospace", 45)
pressed = pygame.key.get_pressed()
aliens = []
score = 0
alienAdd = 0
addedaliens = 0
gameOver = False
moveLeft = moveRight = moveUp = moveDown = False
topScore = 0
while gameOver==False: #while loop that actually runs the game
score += 1
playerImage = pygame.image.load('C:\\Python27\\spaceship.png').convert() # the player images
playerRect = playerImage.get_rect()
screen.blit(playerImage, [300, 250])
alienImage = pygame.image.load('C:\\Python27\\alien.png').convert() #alien images
alienRect = alienImage.get_rect()
screen.blit(alienImage, [ 50, 50 ])
pygame.display.flip()
for event in pygame.event.get(): #key controls
if event.type == KEYDOWN and event.key == pygame.K_ESCAPE: #escape ends the game
gameOver = True
elif event.type == MOUSEMOTION:
playerRect.move_ip(event.pos[0] - playerRect.centerx, event.pos[1] - playerRect.centery)
screen.fill((0,0,0))
pygame.display.flip()
if not gameOver:
alienAdd += 1
if alienAdd == 6: # randomly adding aliens of different sizes and speeds
aliendAdd = 0
alienSize = random.randint(8, 25)
newAlien = {'rect': pygame.Rect(random.randint(0, 500 - alienSize), 0 -alienSize, alienSize, alienSize),
'speed': random.randint(1, 8),
'surface':pygame.transform.scale(alienImage, (alienSize, alienSize)),
}
aliens.append(newAlien)
if moveLeft and playerRect.left > 0:
playerRect.move_ip(-1 * 5, 0)
if moveRight and playerRect.right < 500:
playerRect.move_ip(5, 0)
if moveUp and playerRect.top > 0:
playerRect.move_ip(0, -1 * 5)
if moveDown and playerRect.bottom < 500:
playerRect.move_ip(0, 5)
for a in aliens:
if not gameOver:
a['rect'].move_ip(0, a['speed'])
for a in aliens[:]:
if a['rect'].top > 500:
aliens.remove(a) #removes the aliens when they get to the bottom of the screen
screenText('Score %s' % (score), font, screen, 10, 0)
screen.blit(playerImage, playerRect)
pygame.display.update()
for a in aliens:
screen.blit(a['surface'], a['rect'])
pygame.display.flip()
if playerCollision(playerRect, aliens):
if score > topScore:
topScore = score
gameOver = True
clock.tick(30)
screenText('Game Over!', font, screen, (750 / 6), ( 750 / 6))
screenText('Press ENTER To Play Again.', font, screen, ( 750 / 6) - 80, (750 / 6) + 50)
pygame.display.update()
if __name__ == "__main__":
main()
Also, sidenote, whenever I put my code in here I go down every line and indent it. Is there an easier way to do that?
Upvotes: 1
Views: 337
Reputation: 2562
You have a typo in aliendAdd = 0
, it should be alienAdd = 0
. This is causing you to keep incrementing alienAdd
more and more and not hit your if statement of alienAdd == 6
again.
Upvotes: 3