From a3db72f76aa3b263eb5568f00c2e5faef2d14b0c Mon Sep 17 00:00:00 2001 From: oabrivard Date: Fri, 8 Aug 2025 16:45:11 +0200 Subject: [PATCH] Initial commit --- .DS_Store | Bin 0 -> 6148 bytes alien_invasion.py | 88 ++++++++++++++++++++++++++++++++++++++++++++++ bullet.py | 24 +++++++++++++ images/ship.bmp | Bin 0 -> 8694 bytes settings.py | 23 ++++++++++++ ship.py | 28 +++++++++++++++ 6 files changed, 163 insertions(+) create mode 100644 .DS_Store create mode 100644 alien_invasion.py create mode 100644 bullet.py create mode 100644 images/ship.bmp create mode 100644 settings.py create mode 100644 ship.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..48f3106bc5e0f83eeb82612232bafc3a2f8cac8a GIT binary patch literal 6148 zcmeHK&x_MQ6n?W?H;qN8ps*f>n<-7YMM|M}{a-x$ zkNCfM((ld8qG_w(MWoCtZ@xG0$E5SMGm{}AF`TD;qAn4&p^UAoXm$w4S-0fCcsMB3 z7$b^lL=(y=+RC;L%YbFze`A2xZU?J1qA7jA+WonHqi2O2C523o!P~IyfMNNa?epS#u!yISA6_aZnCJR=9_&*Mf;`QT^5#`u zrgAZq^D?beZKwmT+jgVwt>yCGgF(;h`-4@_TlW3?e$RV2c(hu%?VES*K7Jm(FV0KJ z6MzV8j7qK%Q5^M>wx2oYJ8aUF?u_=7Ppc4>#yY? zZ-R>H&g^d++2~r?dj`y3v)$SInc4|j1}p=A%K+~W9+WXKxYnq)4m9ct0Bpgn1UA1c zaE)g$Fu2x;2t?>ope_~WiXn74{GQ1R46ZfmauVk9A!|C>d&XBn^z>=gr|brzltF(q@hZcUEQS`YdT%EEbTjj9BVIgXXV eNAWRK31S`_z`)>IBRmlMBA{rnjb-4UGVlW@kCx^D literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9a94402a63dc937a1b6531c937cde4e254db31f1 GIT binary patch literal 8694 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 Ostv5N`pV)t0{$Os)sF7~ literal 0 HcmV?d00001 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)