diff --git a/star_wars/Img/Grenade+1.mp3 b/star_wars/Img/Grenade+1.mp3 new file mode 100644 index 0000000..512d897 Binary files /dev/null and b/star_wars/Img/Grenade+1.mp3 differ diff --git a/star_wars/Img/Gun+Silencer.mp3 b/star_wars/Img/Gun+Silencer.mp3 new file mode 100644 index 0000000..5096ed8 Binary files /dev/null and b/star_wars/Img/Gun+Silencer.mp3 differ diff --git a/star_wars/Img/Han-Solo.png b/star_wars/Img/Han-Solo.png new file mode 100644 index 0000000..626b1a0 Binary files /dev/null and b/star_wars/Img/Han-Solo.png differ diff --git a/star_wars/Img/Star_wars_demonstration.gif b/star_wars/Img/Star_wars_demonstration.gif new file mode 100644 index 0000000..eb8dd6a Binary files /dev/null and b/star_wars/Img/Star_wars_demonstration.gif differ diff --git a/star_wars/Img/controls.jpg b/star_wars/Img/controls.jpg new file mode 100644 index 0000000..e12989a Binary files /dev/null and b/star_wars/Img/controls.jpg differ diff --git a/star_wars/Img/han-solo.gif b/star_wars/Img/han-solo.gif new file mode 100644 index 0000000..a467069 Binary files /dev/null and b/star_wars/Img/han-solo.gif differ diff --git a/star_wars/Img/hello_there.gif b/star_wars/Img/hello_there.gif new file mode 100644 index 0000000..7f15452 Binary files /dev/null and b/star_wars/Img/hello_there.gif differ diff --git a/star_wars/Img/im.png b/star_wars/Img/im.png new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/star_wars/Img/im.png @@ -0,0 +1 @@ + diff --git a/star_wars/Img/soldier.png b/star_wars/Img/soldier.png new file mode 100644 index 0000000..14c8dfd Binary files /dev/null and b/star_wars/Img/soldier.png differ diff --git a/star_wars/Img/star_wars.png b/star_wars/Img/star_wars.png new file mode 100644 index 0000000..5be8df2 Binary files /dev/null and b/star_wars/Img/star_wars.png differ diff --git a/star_wars/Img/stormtrooper.gif b/star_wars/Img/stormtrooper.gif new file mode 100644 index 0000000..2d52be5 Binary files /dev/null and b/star_wars/Img/stormtrooper.gif differ diff --git a/star_wars/Img/stormtrooper_dance.gif b/star_wars/Img/stormtrooper_dance.gif new file mode 100644 index 0000000..6071577 Binary files /dev/null and b/star_wars/Img/stormtrooper_dance.gif differ diff --git a/star_wars/Img/theme_music.mp3 b/star_wars/Img/theme_music.mp3 new file mode 100644 index 0000000..b965fc1 Binary files /dev/null and b/star_wars/Img/theme_music.mp3 differ diff --git a/star_wars/Img/victory.mp3 b/star_wars/Img/victory.mp3 new file mode 100644 index 0000000..3f18fed Binary files /dev/null and b/star_wars/Img/victory.mp3 differ diff --git a/star_wars/README.md b/star_wars/README.md new file mode 100644 index 0000000..e4c9dd5 --- /dev/null +++ b/star_wars/README.md @@ -0,0 +1,81 @@ +ORIGINAL REPO: https://github.com/pedrollamas/Star_wars_pygame + +# đŽ Star Wars: Space Duel! đŽ +![Hello there](Img/hello_there.gif) + +Dive into the Star Wars galaxy and get ready for an epic showdown between two legendary characters: Han Solo and a relentless Stormtrooper. Take control of your character, dodge enemy shots, and showcase your skills with the laser pistol. +## Description +This is an arcade-style game đšī¸ created with ![Pygame](https://img.shields.io/badge/Pygame-%23FFCA1C?style=for-the-badge&logo=pygame&logoColor=white). You can play 1ī¸âŖ đ 1ī¸âŖ with a friend using the same keyboard. + +I used Tech with Tim tutorial and used it as a base, here is the link https://www.youtube.com/watch?v=jO6qQDNa2UY + + +Each player has 10 lives âĨī¸ and will take on the role of either Han Solo or a Stormtrooper. + +My objective with this game was to learn the basics of ![Pygame](https://img.shields.io/badge/Pygame-%23FFCA1C?style=for-the-badge&logo=pygame&logoColor=white), in order to create different mini-games đ§Šđ˛ in the future for fun. + +I hope you enjoy it, and I invite you to collaborate to improve it or create new games if you wish. +## Demonstration +There are two playable characters: +| ![Han Solo](Img/han-solo.gif) | ![Stormtrooper](Img/stormtrooper_dance.gif) | +|:---:|:---:| +| **Han Solo** | **Stormtrooper** | + +The quality of the gif is low, you'll find out later on when you download it that it is better đ¤ + +
+ +
+ +## Instructions +To play the Star Wars game in your local environment, follow these steps: + +### Clone the Repository + +1. Open a terminal or command prompt on your system. +2. Navigate to the location where you want to clone the repository. +3. Run the following command to clone the repository: + +``` +git clone https://github.com/pedrollamas/Star_wars_pygame.git +``` + +### Install Dependencies +1. Make sure you have Python installed on your system. +2. Navigate to the root folder of the cloned repository. +3. Run the following command to install the dependencies: +``` +pip install -r requirements.txt +``` +### Run the Game +In the same location as the root folder, run the following command to start the game: +``` +python star_wars.py +``` +Once the command is executed, the game will open in a new window, and you can start playing. + +## Controls +![Controls](Img/controls.jpg) +#### For the Stormtrooper: + +Move Up: W +Move Down: S +Move Left: A +Move Right: D +Shoot: Caps lock key (Press to shoot) + +#### For Han Solo: +Move Up: Up Arrow +Move Down: Down Arrow +Move Left: Left Arrow +Move Right: Right Arrow +Shoot: Spacebar (Press to shoot) + +To close the game, simply click the â button in the window. If you want to play again, wait for 4 seconds and the game will automatically restart đ + +## Contact: +* Feel free to send me an email, generate an issue or pull. My goal is for everyone who likes the idea, to contribute and start developing small fun games. +* đŦ Send me an email at pedrollamaslopez@hotmail.com +* đ¨âđŧđ¤ Connect with me on Linkedin at https://www.linkedin.com/in/pedrollamaslopez/ + +đ**Enjoy the game and may the Force be with you!**đ diff --git a/star_wars/requirements.txt b/star_wars/requirements.txt new file mode 100644 index 0000000..247ea34 --- /dev/null +++ b/star_wars/requirements.txt @@ -0,0 +1 @@ +pygame==2.4.0 diff --git a/star_wars/star_wars.py b/star_wars/star_wars.py new file mode 100644 index 0000000..463ca9a --- /dev/null +++ b/star_wars/star_wars.py @@ -0,0 +1,201 @@ +# Libraries. +import pygame +import os + +pygame.init() # To initialize the game +pygame.font.init() # To load the font library +pygame.mixer.init() # To load the sounds. + +# We load the theme music and play while it runs. +pygame.mixer.music.load("Img/theme_music.mp3") +pygame.mixer.music.play(-1) + +# We define the width and height of the game. +WIDTH, HEIGHT = 1000,600 +WIN = pygame.display.set_mode((WIDTH, HEIGHT)) +pygame.display.set_caption("Stormtrooper VS Han Solo") + +# We define the colors to have a clear code since it uses RGB. +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) +RED = (255, 0, 0) +YELLOW = (255, 255, 0) +BLUE = (0, 170, 255) + +# We define the rectangle that acts as the border for the characters. +BORDER = pygame.Rect(WIDTH//2 - 5, 0, 10, HEIGHT) + +# We add the sound variables +BULLET_HIT_SOUND = pygame.mixer.Sound(os.path.join('Img', 'Grenade+1.mp3')) +BULLET_FIRE_SOUND = pygame.mixer.Sound(os.path.join('Img', 'Gun+Silencer.mp3')) +VICTORY_SOUND = pygame.mixer.Sound(os.path.join('Img', 'victory.mp3')) + + +# We define the font used to show the health. +HEALTH_FONT = pygame.font.SysFont('Fixedsys', 40) +# We define the font used to show the winner. +WINNER_FONT = pygame.font.SysFont('Fixedsys', 100) + +# We define this in order for the game to not depend on how fast our system can run it. We define how often we want the game to update. +FPS = 60 +# We define the velocity they are moving when they press keys. +VEL = 5 +# We define the velocity of the bullets. +BULLET_VEL = 6 +# We define the max bullets each player can use. +MAX_BULLETS = 10 +SOLDIER_WIDTH, SOLDIER_HEIGHT = 90, 140 +SOLO_WIDTH, SOLO_HEIGHT = 150, 120 + +# We create the event of getting hit by the bullet. +SOLDIER_HIT = pygame.USEREVENT + 1 +SOLO_HIT = pygame.USEREVENT + 2 + +# Import the images for the characters. +SOLDIER_IMAGE = pygame.image.load(os.path.join('Img', 'soldier.png')) +SOLDIER = pygame.transform.scale(SOLDIER_IMAGE, (SOLDIER_WIDTH, SOLDIER_HEIGHT)) + +SOLO_IMAGE = pygame.image.load(os.path.join('Img', 'Han-Solo.png')) +SOLO = pygame.transform.scale(SOLO_IMAGE, (SOLO_WIDTH, SOLO_HEIGHT)) + +# We generate the backround because we checked white and the yellow bullets were hard to see. +SPACE = pygame.transform.scale(pygame.image.load(os.path.join('Img', 'star_wars.png')), (WIDTH, HEIGHT)) + +def draw_window(solo, soldier, solo_bullets, soldier_bullets, solo_health, soldier_health): + WIN.blit(SPACE, (0, 0)) # Fill the background. + pygame.draw.rect(WIN, WHITE, BORDER) + + # We define the text and position of the health. + solo_health_text = HEALTH_FONT.render("Han Solo: " + str(solo_health), 1, WHITE, BLACK) + soldier_health_text = HEALTH_FONT.render("Stormtrooper: " + str(soldier_health), 1, WHITE, BLACK) + WIN.blit(solo_health_text, (WIDTH - solo_health_text.get_width() - 10, 10)) + WIN.blit(soldier_health_text, (10, 10)) + + WIN.blit(SOLDIER, (soldier.x, soldier.y)) + WIN.blit(SOLO, (solo.x, solo.y)) + + # We define the rectangle that represents the bullet and color for each character. + for bullet in soldier_bullets: + pygame.draw.rect(WIN, BLUE, bullet) + for bullet in solo_bullets: + pygame.draw.rect(WIN, RED, bullet) + + pygame.display.update() # We always need to update pygame to display our changes. + +# We create a function to not repeat it every time. +def soldier_handle_movement(keys_pressed, soldier): + if keys_pressed[pygame.K_a] and soldier.x - VEL > 0: # LEFT + soldier.x -= VEL + if keys_pressed[pygame.K_d] and soldier.x + VEL + soldier.width < BORDER.x: # RIGHT + soldier.x += VEL + if keys_pressed[pygame.K_w] and soldier.y - VEL > 0: # UP # We subtract when going up because in pygame the top left corner is (0,0) + soldier.y -= VEL + if keys_pressed[pygame.K_s] and soldier.y + VEL + soldier.height < HEIGHT - 15: # DOWN # We make sure we don't allow it to go of the border with (-15). + soldier.y += VEL +# We do the same with the other character. +def solo_handle_movement(keys_pressed, solo): + if keys_pressed[pygame.K_LEFT] and solo.x - VEL > BORDER.x + BORDER.width: # LEFT + solo.x -= VEL + if keys_pressed[pygame.K_RIGHT] and solo.x + VEL + solo.width < WIDTH: # RIGHT + solo.x += VEL + if keys_pressed[pygame.K_UP] and solo.y - VEL > 0: # UP + solo.y -= VEL + if keys_pressed[pygame.K_DOWN] and solo.y + VEL + solo.height < HEIGHT - 15: # DOWN + solo.y += VEL + +# We define the function for the bullets movement. +def handle_bullets(soldier_bullets, solo_bullets, soldier, solo): + for bullet in soldier_bullets: + bullet.x += BULLET_VEL + if solo.colliderect(bullet): + pygame.event.post(pygame.event.Event(SOLO_HIT)) + soldier_bullets.remove(bullet) + elif bullet.x > WIDTH: + soldier_bullets.remove(bullet) + + for bullet in solo_bullets: + bullet.x -= BULLET_VEL + if soldier.colliderect(bullet): + pygame.event.post(pygame.event.Event(SOLDIER_HIT)) + solo_bullets.remove(bullet) + elif bullet.x < 0: + solo_bullets.remove(bullet) +# We define the function to show the winner and restart the game. +def draw_winner(text): + draw_text = WINNER_FONT.render(text, 1, RED, BLACK) + WIN.blit(draw_text, (WIDTH/2 - draw_text.get_width()/2, HEIGHT/2 - draw_text.get_height()/2)) + + pygame.display.update() + pygame.time.delay(4000) + +# Our main function for the game. +def main(): + solo = pygame.Rect(700, 300, SOLO_WIDTH, SOLO_HEIGHT) # we define the spaceships position + soldier = pygame.Rect(100, 300, SOLDIER_WIDTH, SOLDIER_HEIGHT) + + solo_bullets = [] + soldier_bullets = [] + + # We define the health of players. + solo_health = 10 + soldier_health = 10 + + clock = pygame.time.Clock() + run = True + while run: + clock.tick(FPS) # Ensures our game runs maximum at 60 FPS(defined at the begining) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + run = False + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_CAPSLOCK and len(soldier_bullets) < MAX_BULLETS: # We add the condition to not shoot bulllets if its over the limit we defined. + bullet = pygame.Rect(soldier.x + soldier.width, soldier.y + soldier.height//2 - 2, 10, 5) # We define where the bullets come from which is at the edge of the character and the middle. + soldier_bullets.append(bullet) + BULLET_FIRE_SOUND.play() + + if event.key == pygame.K_SPACE and len(solo_bullets) < MAX_BULLETS: + bullet = pygame.Rect(solo.x, solo.y + solo.height//2 - 2, 10, 5) + solo_bullets.append(bullet) + BULLET_FIRE_SOUND.play() + + if event.type == SOLO_HIT: + solo_health -= 1 + BULLET_HIT_SOUND.play() + + if event.type == SOLDIER_HIT: + soldier_health -= 1 + BULLET_HIT_SOUND.play() + + # We define the text depending on the character that wins. + winner_text = "" + if solo_health <= 0: + winner_text = "Stormtrooper Wins!" + + if soldier_health <= 0: + winner_text = "Han Solo Wins!" + + if winner_text != "": + pygame.mixer.music.stop() # We stop the theme music. + draw_winner(winner_text) + VICTORY_SOUND.play() # Reproduce the sound of victory. + pygame.time.delay(4000) # We add delay so it gives it time to sound and restart. + VICTORY_SOUND.stop() + break + + + keys_pressed = pygame.key.get_pressed() # to know the keys are currently being pressed. + soldier_handle_movement(keys_pressed, soldier) + solo_handle_movement(keys_pressed, solo) + + handle_bullets(soldier_bullets, solo_bullets, soldier, solo) + + + draw_window(solo, soldier, solo_bullets, soldier_bullets, solo_health, soldier_health) + +main() + +# We define this in order for the game to run when we execute this file. +if __name__ == "__main__": + main() + \ No newline at end of file