import pygame, sys import random pygame.init() screen = pygame.display.set_mode([640,480]) background = pygame.Surface(screen.get_size()) background.fill([0, 0, 0]) clock = pygame.time.Clock() class Bullet(pygame.sprite.Sprite): def __init__(self, image_file, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location def fire(self): if self.rect.top >= -30: self.rect.top -= 30 class Explosion(pygame.sprite.Sprite): def __init__(self, image_file, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location class Fighter(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed class Enemy(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed def move(self): if self.rect.left <= screen.get_rect().left or \ self.rect.right >= screen.get_rect().right: self.speed[0] = - self.speed[0] newpos = self.rect.move(self.speed) self.rect = newpos if self.rect.bottom < 0: self.rect.top = screen.get_rect().bottom if self.rect.top > screen.get_rect().bottom: self.rect.bottom = 0 class Energy(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed def move(self): if self.rect.left <= screen.get_rect().left or \ self.rect.right >= screen.get_rect().right: self.speed[0] = - self.speed[0] newpos = self.rect.move(self.speed) self.rect = newpos if self.rect.bottom < 0: self.rect.top = screen.get_rect().bottom if self.rect.top > screen.get_rect().bottom: self.rect.bottom = 0 myFighter = Fighter('fighter.png', [20, 20], [270,360]) screen.blit(myFighter.image, myFighter.rect) enemies = pygame.sprite.Group() for i in range(5): enemies.add(Enemy('spaceship.png', [20, 1], [100+i*100, 20+i*5])) myBullet = Bullet('missile.png', [0,-40]) expoSprite = [Explosion('explosion-0.png', [0, -400]), Explosion('explosion-1.png', [0, -400]), Explosion('explosion-2.png', [0, -400]), Explosion('explosion-3.png', [0, -400]), Explosion('explosion-4.png', [0, -400]), Explosion('explosion-5.png', [0, -400]), Explosion('explosion-6.png', [0, -400]), Explosion('explosion-7.png', [0, -400])] expoLocations = [] energies = pygame.sprite.Group() delay = 100 interval = 50 pygame.key.set_repeat(delay, interval) enemyInterval = 50 score = 0 scoreFont = pygame.font.Font(None, 20) # adding sound pygame.mixer.init() pygame.mixer.music.load("bluespace.mp3") pygame.mixer.music.set_volume(0.3) pygame.mixer.music.play(-1) shoot = pygame.mixer.Sound("shoot.wav") shoot.set_volume(0.4) expSound = pygame.mixer.Sound("explosion.wav") expSound.set_volume(0.5) # HOMEWORK STARTS BELOW startImage = pygame.image.load('start.png').convert() screen.blit(startImage, [0, 0]) pygame.display.flip() play = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.display.quit() sys.exit() # if click on the play button, then exit loop elif event.type == pygame.MOUSEBUTTONDOWN: if pygame.mouse.get_pos()[0] >= 220 and pygame.mouse.get_pos()[0] <= 455 and \ pygame.mouse.get_pos()[1] >= 280 and pygame.mouse.get_pos()[1] <= 350: play = True if play == True: break gameOver = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.display.quit() sys.exit() clock.tick(30) screen.blit(background, (0, 0)) if gameOver == True: #show game over text gameOverFont = pygame.font.Font(None, 80) gameOverText = "Game Over" gameOverSurf = gameOverFont.render(gameOverText, 1, (255, 0, 0)) screen.blit(gameOverSurf, [160, 200]) finalFont = pygame.font.Font(None, 40) finalText = "Your score is " + str(score) finalSurf = finalFont.render(finalText, 1, (255, 255, 0)) screen.blit(finalSurf, [220, 260]) restartFont = pygame.font.Font(None, 20) restartText = "Press Space to restart" restartSurf = restartFont.render(restartText, 1, (255, 0, 0)) screen.blit(restartSurf, [240, 300]) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: gameOver = False expoLocations = [] enemies = pygame.sprite.Group() for i in range(5): enemies.add(Enemy('spaceship.png', [20, 1], [100+i*100, 20+i*5])) energies = pygame.sprite.Group() enemyInterval = 20 continue if True in pygame.mouse.get_pressed(): if myBullet.rect.top <= 0: myBullet.rect.top = myFighter.rect.top myBullet.rect.centerx = myFighter.rect.centerx shoot.play() # add more enemies enemyInterval -= 1 if enemyInterval == 0: enemies.add(Enemy('spaceship.png', [10, 1], [random.randint(20, 500), 20])) enemyInterval = 50 myBullet.fire() screen.blit(myBullet.image, myBullet.rect) # use the following code instead of pygame.MOUSEMOTION for acceleration effect if abs(myFighter.rect.centerx - pygame.mouse.get_pos()[0]) > 1: myFighter.rect.centerx += int((pygame.mouse.get_pos()[0] - myFighter.rect.centerx)/10) if abs(myFighter.rect.centery - pygame.mouse.get_pos()[1]) > 1: myFighter.rect.centery += int((pygame.mouse.get_pos()[1] - myFighter.rect.centery)/10) for enemy in enemies: enemy.move() for enemy in enemies: if len(pygame.sprite.spritecollide(myFighter, enemies, True)) > 0: gameOver = True hitList = pygame.sprite.spritecollide(myBullet, enemies, True) if len(hitList) > 0: expSound.play() myBullet.rect.top = -400 for hit in hitList: expoLocations.append([(hit.rect.left-65, hit.rect.top-42), 0]) energies.add(Energy('energy.png', [random.randint(1, 4), random.randint(1, 2)], (hit.rect.left+21, hit.rect.top+18))) screen.blit(enemy.image, enemy.rect) for expo in expoLocations: if expo[1] < 7: screen.blit(expoSprite[expo[1]].image, expo[0]) expo[1] += 1 else: expoLocations.remove(expo) for energy in energies: energy.move() score += len(pygame.sprite.spritecollide(myFighter, energies, True)) screen.blit(energy.image, energy.rect) scoreText = "Score: " + str(score) scoreSurf = scoreFont.render(scoreText, 1, (100, 100, 255)) screen.blit(scoreSurf, [20, 5]) screen.blit(myFighter.image, myFighter.rect) pygame.display.flip()