Advertisement
xgeovanni

Alien Assault

Aug 7th, 2012
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.86 KB | None | 0 0
  1. # Alien Assualt
  2. # A bullet hell alien invasion game.
  3. # Bobby Clarke
  4.  
  5. #Imports
  6. import pygame, sys, os, random, math, easygui
  7. from pygame.locals import *
  8. pygame.init()
  9.  
  10. screen = pygame.display.set_mode((600, 450))
  11. pygame.display.set_caption("Alien Assualt")
  12.  
  13. clock = pygame.time.Clock()
  14.  
  15. # Glitchy Lazer Mode
  16. #pygame.key.set_repeat(1, 1)
  17.  
  18.  
  19. def adv_range(limit1, limit2 = None, increment = 1.):
  20.     """
  21.    Range function that accepts floats (and integers).
  22.  
  23.    Usage:
  24.    adv_range(-2, 2, 0.1)
  25.    adv_range(10)
  26.    adv_range(10, increment = 0.5)
  27.  
  28.    The returned value is an iterator.  Use list(adv_range) for a list.
  29.    """
  30.  
  31.     if limit2 is None:
  32.         limit2, limit1 = limit1, 0.
  33.     else:
  34.         limit1 = float(limit1)
  35.  
  36.     count = int(math.ceil(limit2 - limit1)/increment)
  37.     return (limit1 + n*increment for n in range(count))
  38.  
  39. def setup(num_of_enemies, enemyclass):
  40.     enemies = []
  41.     for i in range(0, num_of_enemies):
  42.         distance = i * round(400 / num_of_enemies)
  43.         direction = random.choice((True, False)) #True is right, left is false
  44.         enemies.append(enemyclass(x = random.randint(100, 440), y = distance , right = direction))
  45.  
  46.     return enemies
  47.  
  48. class player():
  49.     """The player"""
  50.     def __init__(self, x = screen.get_width() / 2 -  35, y = screen.get_height() - 45, img = "Images/player.png", speed = 3):
  51.         self.x = x
  52.         self.y = y
  53.         self.img = pygame.image.load(img)
  54.         self.rightkeys = (K_RIGHT, K_d, K_KP6) #Keys making it move left
  55.         self.leftkeys = (K_LEFT, K_a, K_KP4) #Keys making it move right
  56.         self.left = False
  57.         self.right = False
  58.         self.speed = speed
  59.  
  60.     def move(self):
  61.         if self.right and self.x <= screen.get_width() - 60:
  62.             self.x += self.speed # Move right
  63.         if self.left and self.x >= 0:
  64.             self.x -= self.speed # Move left
  65.  
  66.     def fire(self, shot, shots):
  67.         shots.append(shot(self))
  68.         return shots
  69.  
  70. class shot():
  71.     def __init__(self, player, enemy = False):
  72.         self.x = player.x + 25
  73.         self.y = player.y
  74.  
  75.         if enemy:
  76.             img = "Images/enemyshot.png"
  77.         else:
  78.             img = "Images/shot.png"
  79.  
  80.         self.img = pygame.image.load(img)
  81.         self.enemy = enemy
  82.         self.delete = False
  83.  
  84.     def move(self, speed = 5):
  85.         if self.enemy:
  86.             self.y += speed
  87.         else:
  88.             self.y -= speed
  89.  
  90.         if self.y <= 0 or self.y > screen.get_height():
  91.             self.delete = True
  92.  
  93.  
  94.  
  95. class enemy():
  96.     def __init__(self, x = random.randint(0, screen.get_width() - 30), y = 0, img = "Images/enemy.png", left = True, right = False, speed = random.randint(4, 7)):
  97.         self.x = x
  98.         self.y = y
  99.         self.img = pygame.image.load(img)
  100.         self.speed = speed
  101.  
  102.         if right:
  103.             left = False
  104.  
  105.         self.left =  left
  106.         self.right = right
  107.  
  108.     def move(self):
  109.         if self.left:
  110.             self.x -= self.speed
  111.         elif self.right:
  112.             self.x += self.speed
  113.         if self.x < 0:
  114.             self.right = True
  115.             self.left = False
  116.         elif self.x > screen.get_width() - 60:
  117.             self.right = False
  118.             self.left = True
  119.  
  120.     def fire(self, shot, shots):
  121.         shots.append(shot(self, enemy = True))
  122.         return shots
  123.  
  124. def play(player, enemies, shotclass, secs):
  125.     shots = []
  126.     key = None
  127.     playing = True
  128.  
  129.     while playing:
  130.         clock.tick(60)
  131.         screen.fill((0, 0, 0)) # Black
  132.  
  133.         player.move()
  134.  
  135.         for shot1 in shots:
  136.             shot1.move()
  137.  
  138.             for shot2 in shots:
  139.                 if shot1.x in adv_range(shot2.x, shot2.x + 10) and shot1.y in adv_range(shot2.y, shot2.y + 10) or shot2.x in adv_range(shot1.x, shot1.x + 10) and shot2.y in adv_range(shot1.y, shot1.y + 10):
  140.                     if not shot1 == shot2 and(shot1.enemy == True and shot2.enemy == False) or (shot1.enemy == False and shot2.enemy == True):
  141.                         shot1.delete = True
  142.                         shot2.delete = True
  143.  
  144.         #Blits
  145.  
  146.         screen.blit(player.img, (player.x, player.y))
  147.  
  148.         for shot in shots:
  149.             for enemy in enemies:
  150.                 if shot.x in adv_range(enemy.x, enemy.x + 60) and shot.y in adv_range(enemy.y, enemy.y + 20) and not shot.enemy:
  151.                     enemies.remove(enemy)
  152.                     try:
  153.                         shots.remove(shot)
  154.                     except:
  155.                         pass
  156.  
  157.             if shot.enemy and shot.x in adv_range(player.x, player.x + 60) and shot.y in adv_range(player.y, player.y + 45):
  158.                 return False, secs
  159.  
  160.             if shot.delete:
  161.                 try:
  162.                     shots.remove(shot)
  163.                 except:
  164.                     pass
  165.             screen.blit(shot.img, (shot.x, shot.y))
  166.  
  167.         for enemy in enemies:
  168.             screen.blit(enemy.img, (enemy.x, enemy.y))
  169.             enemy.move()
  170.             if random.randint(1, 10 * len(enemies)) == 1:
  171.                 shots = enemy.fire(shotclass, shots)
  172.  
  173.         #   #   #   #   #
  174.  
  175.         pygame.display.update()
  176.  
  177.         if not enemies:
  178.             return True, secs
  179.  
  180.         for event in pygame.event.get():
  181.             if event.type == pygame.QUIT:
  182.                 playing = False
  183.  
  184.             elif event.type == KEYDOWN:
  185.                 if event.key in player.rightkeys:
  186.                     player.right = True
  187.                 elif event.key in player.leftkeys:
  188.                     player.left = True
  189.                 elif event.key == K_SPACE:
  190.                     shots = player.fire(shotclass, shots)
  191.  
  192.             elif event.type == KEYUP:
  193.                 if event.key in player.rightkeys:
  194.                     player.right = False
  195.                 elif event.key in player.leftkeys:
  196.                     player.left = False
  197.  
  198.             elif event.type == USEREVENT:
  199.                 secs += 1
  200.  
  201. def main(playerclass, enemyclass, shotclass):
  202.     win = False
  203.     enemynum = 0
  204.     deaths = 0
  205.     secs = 0
  206.  
  207.     while enemynum not in range(5, 21):
  208.         enemynum = easygui.enterbox("How many enemies do you want? (5 - 20)", "Alien Assualt")
  209.  
  210.         try:
  211.             enemynum = int(enemynum)
  212.         except ValueError:
  213.             enemynum = 0
  214.         except TypeError:
  215.             sys.exit()
  216.  
  217.     pygame.time.set_timer(USEREVENT, 1000) #Fire a user event every second, for the timer
  218.  
  219.     while not win:
  220.         win, secs = play(playerclass(), setup(enemynum, enemyclass), shotclass, secs)
  221.         deaths += 1
  222.  
  223.     if secs < 60:
  224.         time = "{0} seconds".format(secs)
  225.     else:
  226.         time = "{0} minute(s) and {1} second(s)".format(math.floor(secs / 60), secs % 60)
  227.  
  228.     easygui.msgbox("You won in {0} and died {1} times.".format(time, deaths))
  229.  
  230. if __name__ == "__main__":
  231.     main(player, enemy, shot)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement