import pygame, random import math pygame.init()   screen = pygame.display.set_mode((640, 480)) Objects = pygame.sprite.Group() Bullets = pygame.sprite.Group() landSprites = pygame.sprite.Group() flakSprites = pygame.sprite.Group() planeSprites = pygame.sprite.Group() enemySprites = pygame.sprite.Group() scoreSprite = pygame.sprite.Group()   NORTH = 0 EAST = 1 SOUTH = 2 WEST = 3   UP = 0 RIGHT = 1 DOWN = 2 LEFT = 3   READYTOFIRE = 0 RELOADING = 1 FIRING = 2   def getTheta(angle):     return angle * math.pi/180   class Bullet(pygame.sprite.Sprite):     def __init__(self, parent):         pygame.sprite.Sprite.__init__(self)         self.image = pygame.Surface((3, 3)).convert()         self.image.fill((0, 0, 0))         self.rect = self.image.get_rect()           self.direction = parent.direction         self.acceleration = parent.dx                   self.x = parent.x         self.y = parent.y         self.dx = 0         self.dy = 7                   self.rect.center = (self.x, self.y)           self.countDownTimer = 180           self.setSpeed()         self.update()         self.update()         def update(self):         self.x += self.dx         self.y += self.dy           self.rect.center = (self.x, self.y)               if self.x > screen.get_width() or self.x < 0:             self.kill()         if self.y > screen.get_height() or self.y < 0:             self.kill()         def setSpeed(self):         theta = getTheta(self.direction)         ddx = self.acceleration * math.cos(theta)         ddy = self.acceleration * math.sin(theta)         ddy *= -1         self.dx += ddx         self.dy += ddy           class Gun(pygame.sprite.Sprite):     def __init__(self, parent):         pygame.sprite.Sprite.__init__(self)                 self.bullets = 30         self.clips = 5           self.fireSpeed = 10         self.firePause = 0                 self.reloadTime = 180         self.reloadPause = 180           self.state = READYTOFIRE           self.parent = parent               def fire(self):         # check if the gun is ready to fire             # if ready:         if self.state == READYTOFIRE:             # check if we have bullets             if self.bullets > 0:                 # set state                 self.state = FIRING                 # fire a bullet!                 bullet = Bullet(self.parent)                 Bullets.add(bullet)                   # reset the firePause cooldown time                 self.firePause = self.fireSpeed                                 # subtract the bullet from the self.bullets ammo                 self.bullets -= 1                             # if no bullets in the gun             else:                 self.state = RELOADING       def update(self):           # IF RELOADING         if self.state == RELOADING:             pygame.display.set_caption("Current reloadPause:" + str(self.reloadPause))                         self.reloadPause -= 1                         # if it is finished reloading                 # add ammo to the gun                 # change the state             if self.reloadPause <= 0:                 self.state = READYTOFIRE                 self.bullets = 30                 self.firePause = 0                 self.reloadPause = 180             # IF FIRING         if self.state == FIRING:             self.firePause -= 1               # if it is finished cooling off                 # reset the firePause back to the top                 # reset the state to fire again             if self.firePause <= 0:                 self.firePause = self.fireSpeed                 self.state = READYTOFIRE             class Plane(pygame.sprite.Sprite):     def __init__(self):         pygame.sprite.Sprite.__init__(self)         self.image = pygame.image.load("plane1.PNG")         self.image.set_colorkey((255, 255, 255))         self.image = self.image.convert()         self.rect = self.image.get_rect()           self.x = screen.get_width()/2         self.y = screen.get_height() -20         self.dx = 0         self.dy = 0         self.direction = NORTH         self.gun = Gun(self)         Objects.add(self.gun)                     if not pygame.mixer:             print "problem with sound"         else:             pygame.mixer.init()             self.sndYay = pygame.mixer.Sound("yay.ogg")             self.sndThunder = pygame.mixer.Sound("thunder.ogg")             self.sndEngine = pygame.mixer.Sound("engine.ogg")             self.sndEngine.play(-1)                                 def update(self):                   self.x += self.dx         self.y += self.dy         self.rect = self.image.get_rect()         self.rect.center = (self.x, self.y)           keys = pygame.key.get_pressed()                                           if keys[pygame.K_LEFT]:             self.x += -8                                                 elif keys[pygame.K_RIGHT]:             self.x += 8             if keys[pygame.K_UP]:             self.gun.fire()             print "fire"               class Flak(pygame.sprite.Sprite):     def __init__(self):         pygame.sprite.Sprite.__init__(self)         self.image = pygame.image.load("Flak.gif")         self.image.set_colorkey((255, 255, 255))         self.image = self.image.convert()         self.rect = self.image.get_rect()         self.reset()                 self.dy = 5         def update(self):         self.rect.centery += self.dy         if self.rect.top > screen.get_height():             self.reset()                 def reset(self):         self.rect.top = 0         self.rect.centerx = random.randrange(0, screen.get_width())       class Enemy(pygame.sprite.Sprite):     def __init__(self):         pygame.sprite.Sprite.__init__(self)                 self.image = pygame.image.load("Enemy.png")         self.image.set_colorkey((255, 255, 255))         self.image = self.image.convert()         self.rect = self.image.get_rect()         self.direction = SOUTH         self.rect.inflate (-50, -50)         self.reset()       def update(self):         self.rect.centerx += self.dx         self.rect.centery += self.dy         if self.rect.top > screen.get_height():             self.reset()         def reset(self):         self.rect.bottom = 0         self.rect.centerx = random.randrange(0, screen.get_width())         self.dy = random.randrange(5, 10)         self.dx = random.randrange(-2, 2)     class Field(pygame.sprite.Sprite):     def __init__(self):         pygame.sprite.Sprite.__init__(self)         self.image = pygame.image.load("BackGround.gif")         self.rect = self.image.get_rect()         self.dy = 5         self.reset()             def update(self):         self.rect.bottom += self.dy         if self.rect.bottom >= 1440:             self.reset()         def reset(self):         self.rect.top = -960   class Scoreboard(pygame.sprite.Sprite):     def __init__(self):         pygame.sprite.Sprite.__init__(self)         self.lives = 5         self.score = 0         self.font = pygame.font.SysFont("None", 50)             def update(self):         self.text = "planes: %d, score: %d" % (self.lives, self.score)         self.image = self.font.render(self.text, 1, (255, 255, 0))         self.rect = self.image.get_rect()           def game():     pygame.display.set_caption("Ace Pilot.")       #added the counter here so it could be called later for extra lives.     counter = 1       background = pygame.Surface(screen.get_size())     background.fill((0, 0, 0))     screen.blit(background, (0, 0))     plane = Plane()     flak = Flak()     enemy1 = Enemy()     enemy2 = Enemy()     enemy3 = Enemy()     field = Field()     scoreboard = Scoreboard()             landSprites = pygame.sprite.Group(field)     flakSprites = pygame.sprite.Group(flak)     planeSprites = pygame.sprite.Group(plane)     enemySprites = pygame.sprite.Group(enemy1, enemy2, enemy3)     scoreSprite = pygame.sprite.Group(scoreboard)       clock = pygame.time.Clock()     keepGoing = True     while keepGoing:         clock.tick(30)         pygame.mouse.set_visible(False)         for event in pygame.event.get():             if event.type == pygame.QUIT:                 keepGoing = False                   #check collisions                 if plane.rect.colliderect(flak.rect):             plane.sndThunder.play()             scoreboard.lives -= 1             if scoreboard.lives <= 0:                 keepGoing = False             for theEnemy in hitEnemy:                 flak.reset()                         if scoreboard.score == (1000 * counter):                 counter += 1                 scoreboard.lives += 1                 print counter                     hitEnemy = pygame.sprite.spritecollide(plane, enemySprites, False)         if hitEnemy:             plane.sndThunder.play()             scoreboard.lives -= 1             if scoreboard.lives <= 0:                 keepGoing = False             for theEnemy in hitEnemy:                 theEnemy.reset()                             landSprites.update()         flakSprites.update()         planeSprites.update()         enemySprites.update()         scoreSprite.update()                 landSprites.draw(screen)         flakSprites.draw(screen)         planeSprites.draw(screen)         enemySprites.draw(screen)         scoreSprite.draw(screen)                 pygame.display.flip()             plane.sndEngine.stop()     #return mouse cursor     pygame.mouse.set_visible(True)     return scoreboard.score     def instructions(score):     pygame.display.set_caption("Ace Pilot!")       plane = Plane()     field = Field()         allSprites = pygame.sprite.Group(field, plane)     insFont = pygame.font.SysFont(None, 50)     insLabels = []     instructions = (     "Ace Pilot.     Last score: %d" % score ,     "Instructions:  You're an Ace pilot,",     "stop the coming waves of planes.",     "",     "Shoot the advancing enemy and",     "look out for flak cannons.",         "",     "If you're shot down you can upgrade",     "your plane and fight again.",     "",     "Fight Hard!",     "",     "click to start, escape to quit..."     )         #A - Action (broken into ALTER steps)         #A - Assign values to key variables         for line in instructions:         tempLabel = insFont.render(line, 1, (255, 255, 0))         insLabels.append(tempLabel)           keepGoing = True     clock = pygame.time.Clock()     pygame.mouse.set_visible(False)               #L - Set up main loop     while keepGoing:           #T - Timer to set frame rate         clock.tick(30)             #E - Event handling                 for event in pygame.event.get():             if event.type == pygame.QUIT:                 keepGoing = False                 donePlaying = True             if event.type == pygame.MOUSEBUTTONDOWN:                 keepGoing = False                 donePlaying = False             elif event.type == pygame.KEYDOWN:                 if event.key == pygame.K_ESCAPE:                     keepGoing = False                     donePlaying = True                                                             # update objects         landSprites.update()         Bullets.update()         flakSprites.update()         planeSprites.update()         enemySprites.update()         scoreSprite.update()         Objects.update()                     #R - Refresh display         landSprites.draw(screen)         Bullets.draw(screen)         flakSprites.draw(screen)         planeSprites.draw(screen)         enemySprites.draw(screen)         scoreSprite.draw(screen)         allSprites.draw(screen)         pygame.display.flip()                 for i in range(len(insLabels)):             screen.blit(insLabels[i], (50, 30*i))           pygame.display.flip()                 plane.sndEngine.stop()             pygame.mouse.set_visible(True)     return donePlaying         def main():     donePlaying = False     score = 0     while not donePlaying:         donePlaying = instructions(score)         if not donePlaying:             score = game()           if __name__ == "__main__":     main()           pygame.quit()