diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..48f3106 Binary files /dev/null and b/.DS_Store differ diff --git a/alien_invasion.py b/alien_invasion.py new file mode 100644 index 0000000..d658390 --- /dev/null +++ b/alien_invasion.py @@ -0,0 +1,88 @@ +import sys +import pygame +from settings import Settings +from ship import Ship +from bullet import Bullet +from pygame.sprite import Group + + +class AlienInvasion: + """Overall class to manage game assets and behavior.""" + + def __init__(self): + pygame.init() + self.clock = pygame.time.Clock() + self.settings = Settings() + self.screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN) + self.settings.screen_width = self.screen.get_rect().width + self.settings.screen_height = self.screen.get_rect().height + pygame.display.set_caption("Alien Invasion") + self.bg_color = self.settings.bg_color + self.ship = Ship(self) + self.bullets = Group() + + def run_game(self): + """Start the main loop for the game.""" + while True: + # Check for events and update the game state. + self._check_events() + self.ship.update() + self._update_bullets() + # Redraw the screen during each pass through the loop. + self._update_screen() + self.clock.tick(60) + + def _check_events(self): + """Respond to keypresses and mouse events.""" + for event in pygame.event.get(): + if event.type == pygame.QUIT: + sys.exit() + elif event.type == pygame.KEYDOWN: + self._check_keydown_events(event) + elif event.type == pygame.KEYUP: + self._check_keyup_events(event) + + def _check_keydown_events(self, event): + """Respond to key presses.""" + if event.key == pygame.K_RIGHT: + self.ship.moving_right = True + elif event.key == pygame.K_LEFT: + self.ship.moving_left = True + elif event.key == pygame.K_q: + sys.exit() + elif event.key == pygame.K_SPACE: + self._fire_bullet() + + def _check_keyup_events(self, event): + """Respond to key releases.""" + if event.key == pygame.K_RIGHT: + self.ship.moving_right = False + elif event.key == pygame.K_LEFT: + self.ship.moving_left = False + + def _fire_bullet(self): + """Fire a bullet if the limit is not reached.""" + if len(self.bullets) < self.settings.bullets_allowed: + # Create a new bullet and add it to the bullets group. + new_bullet = Bullet(self) + self.bullets.add(new_bullet) + + def _update_bullets(self): + """Update position of bullets and remove old bullets.""" + self.bullets.update() + for bullet in self.bullets.copy(): + if bullet.rect.bottom <= 0: + self.bullets.remove(bullet) + + def _update_screen(self): + """Update images on the screen and flip to the new screen.""" + self.screen.fill(self.bg_color) + for bullet in self.bullets.sprites(): + bullet.draw_bullet() + self.ship.blitme() + pygame.display.flip() + +if __name__ == '__main__': + # Make a game instance and run the game. + ai = AlienInvasion() + ai.run_game() diff --git a/bullet.py b/bullet.py new file mode 100644 index 0000000..cb0c09a --- /dev/null +++ b/bullet.py @@ -0,0 +1,24 @@ +import pygame +from pygame.sprite import Sprite + +class Bullet(Sprite): + """A class to manage bullets fired from the ship.""" + + def __init__(self, ai_game): + """Create a bullet object at the ship's current position.""" + super().__init__() + self.screen = ai_game.screen + self.settings = ai_game.settings + self.color = self.settings.bullet_color + self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height) + self.rect.midtop = ai_game.ship.rect.midtop + self.y = float(self.rect.y) + + def update(self): + """Move the bullet up the screen.""" + self.y -= self.settings.bullet_speed + self.rect.y = self.y + + def draw_bullet(self): + """Draw the bullet to the screen.""" + pygame.draw.rect(self.screen, self.color, self.rect) diff --git a/images/ship.bmp b/images/ship.bmp new file mode 100644 index 0000000..9a94402 Binary files /dev/null and b/images/ship.bmp differ diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..c066102 --- /dev/null +++ b/settings.py @@ -0,0 +1,23 @@ +class Settings: + """A class to store all settings for Alien Invasion.""" + + def __init__(self): + """Initialize the game's static settings.""" + self.screen_width = 1200 + self.screen_height = 800 + self.bg_color = (230, 230, 230) + + # Ship settings + self.ship_speed = 1.5 + + # Bullet settings + self.bullet_speed = 3.0 + self.bullet_width = 3 + self.bullet_height = 15 + self.bullet_color = (60, 60, 60) + self.bullets_allowed = 3 + + # Alien settings + self.alien_speed = 1.0 + self.fleet_drop_speed = 10 + self.fleet_direction = 1 # 1 represents right; -1 represents left diff --git a/ship.py b/ship.py new file mode 100644 index 0000000..6a90b47 --- /dev/null +++ b/ship.py @@ -0,0 +1,28 @@ +import pygame + +class Ship: + """A class to manage the ship.""" + + def __init__(self, ai_game): + """Initialize the ship and set its starting position.""" + self.screen = ai_game.screen + self.settings = ai_game.settings + self.image = pygame.image.load('images/ship.bmp') + self.rect = self.image.get_rect() + self.rect.midbottom = self.screen.get_rect().midbottom + self.x = float(self.rect.x) + self.moving_right = False + self.moving_left = False + + def update(self): + """Update the ship's position.""" + # Update the ship's x value, not the rect. + if self.moving_right and self.rect.right < self.screen.get_rect().right: + self.x += self.settings.ship_speed + if self.moving_left and self.rect.left > 0: + self.x -= self.settings.ship_speed + self.rect.x = self.x + + def blitme(self): + """Draw the ship at its current location.""" + self.screen.blit(self.image, self.rect)