From 164aaaae93c07184b538199ed3a357e3c0a54dd3 Mon Sep 17 00:00:00 2001 From: Kristofers-Solo Date: Fri, 11 Mar 2022 16:13:28 +0200 Subject: [PATCH] added enemy spawn in groups --- .../space_invaders/source/space_invaders.py | 61 ++++----- .../source/space_invaders_old.py | 121 ------------------ 2 files changed, 25 insertions(+), 157 deletions(-) delete mode 100644 pygame/space_invaders/source/space_invaders_old.py diff --git a/pygame/space_invaders/source/space_invaders.py b/pygame/space_invaders/source/space_invaders.py index 1da4058b..52a63457 100644 --- a/pygame/space_invaders/source/space_invaders.py +++ b/pygame/space_invaders/source/space_invaders.py @@ -124,7 +124,14 @@ class Player(Ship): for obj in objs: if missile.collision(obj): objs.remove(obj) - self.score += 50 + + # different scores for different colored enemies + if obj.color == "lime": + self.score += 10 + elif obj.color == "cyan": + self.score += 20 + elif obj.color == "magenta": + self.score += 30 if missile in self.missiles: self.missiles.remove(missile) @@ -141,6 +148,7 @@ class Enemy(Ship): self.ship_img = self.COLOR_MAP[color] self.missile_img = ENEMY_MISSILE self.mask = pygame.mask.from_surface(self.ship_img) + self.color = color def move(self, vel_x: int, vel_y: int) -> None: self.x += vel_x @@ -158,12 +166,10 @@ def main() -> None: player_vel = 7 player_missile_vel = 7 enemy_x_vel = 2 - vel_y = 0 vel_x = enemy_x_vel + vel_y = 0 enemy_missile_vel = 4 - # velocities = [[5, 0], [0, 2], [-5, 0], [-5, 0], [0, 2], [5, 0]] - # velocities = {"down": [0, 2], "right": [2, 0], "left": [-5, 0]} - # directions = ["right", "down", "left", "left", "down", "right"] + last_enemy_shot = 0 player = Player(WIDTH / 2, 650) @@ -200,26 +206,23 @@ def main() -> None: # stop game if lost: - if lost_count > FPS * 3: + if lost_count > FPS * 3: # wait for 3 sec run = False else: continue + # spawn enemies if len(enemies) == 0: level += 1 margin = 75 - width = 75 - for x in range(margin, WIDTH - margin, width): - for y in range(margin, int(HEIGHT / 2), width): - - match y: - case 75: - color = "magenta" - case 150: - color = "cyan" - case 300: - color = "lime" - + for x in range(margin, WIDTH - margin, margin): + for y in range(margin, int(HEIGHT / 2), margin): + if y == margin: + color = "magenta" + elif y == 2 * margin: + color = "cyan" + elif y == 4 * margin: + color = "lime" enemy = Enemy(x, y, color) enemies.append(enemy) @@ -242,37 +245,23 @@ def main() -> None: # enemies action - # for _ in range(len(directions)): - # if pygame.time.get_ticks() % 100 == 0: - # for direction in directions: - # vel_x, vel_y = velocities[direction] - # for enemy in enemies[:]: - # enemy.move(vel_x, vel_y) - - # if pygame.time.get_ticks() % 10 == 0: - # for vel_x, vel_y in velocities: - # for enemy in enemies[:]: - # enemy.move(vel_x, vel_y) - for enemy in enemies[:]: - # enemy.move(0, enemy_y_vel) - # enemy.move(randint(-enemy_x_vel, enemy_x_vel), randint(0, enemy_y_vel)) if enemy.x >= WIDTH - enemy.get_width(): vel_x = -enemy_x_vel elif enemy.x <= 0: vel_x = enemy_x_vel + enemy.move(vel_x, vel_y) enemy.move_missiles(enemy_missile_vel, player) - if randrange(0, 7 * FPS) == 1: - enemy.shoot() - pass - if collide(enemy, player) or (enemy.y + enemy.get_height() > HEIGHT): player.score -= 10 player.lives -= 1 enemies.remove(enemy) + if pygame.time.get_ticks() - last_enemy_shot > 2000: + choice(enemies).shoot() + last_enemy_shot = pygame.time.get_ticks() player.move_missiles(-player_missile_vel, enemies) diff --git a/pygame/space_invaders/source/space_invaders_old.py b/pygame/space_invaders/source/space_invaders_old.py deleted file mode 100644 index 980cd236..00000000 --- a/pygame/space_invaders/source/space_invaders_old.py +++ /dev/null @@ -1,121 +0,0 @@ -# Author - Kristiāns Francis Cagulis -# Date - 25.02.2022 -# Title - Space invaders - -import pygame -import math -import random - -BLUE = (16, 16, 69) - -# init game -pygame.init() -pygame.display.set_caption("Space invaders") - -# 32x32 game icon -icon = pygame.image.load("icons/space_invader_enemy_icon.png") -pygame.display.set_icon(icon) -# 64x64 player icon -player = pygame.image.load("icons/space_shuttle_player_icon.png") -player_x = 370 -player_y = 480 -player_x_change = 0 - -# 64x64 enemy icon -enemy = pygame.image.load("icons/space_invader_enemy_icon.png") -enemy_x = random.randint(0, 736) -enemy_y = random.randint(50, 150) -enemy_x_change = .2 -enemy_y_change = 10 - - -# missile -missile = pygame.image.load("icons/fireball_icon.png") -missile_x = 0 -missile_y = 480 # player_y -missile_x_change = 0 -missile_y_change = .50 -missile_state = "ready" - -screen = pygame.display.set_mode((800, 600)) - - -def display_player(x, y): - screen.blit(player, (x, y)) - - -def display_enemy(x, y): - screen.blit(enemy, (x, y)) - - -def display_missile(x, y): - global missile_state - missile_state = "fire" - screen.blit(missile, (x + 16, y - 10)) - - -def is_collision(enemy_x, enemy_y, missile_x, missile_y): - distance = math.sqrt(math.pow(enemy_x - missile_x, 2) + math.pow(enemy_y - missile_y, 2)) - if distance < 27: - return True - else: - return False - - -running = True - -while running: - screen.fill(BLUE) - - # change player pos - for event in pygame.event.get(): - if event.type == pygame.QUIT: - running = False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_LEFT: - player_x_change = -.5 - if event.key == pygame.K_RIGHT: - player_x_change = .5 - if event.key == pygame.K_SPACE: - if missile_state == "ready": - missile_x = player_x - # missile_state = "fire" - display_missile(missile_x, missile_y) - - if event.type == pygame.KEYUP: - if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: - player_x_change = 0 - - # player pos - if player_x + player_x_change > 0 and player_x + player_x_change < 736: - player_x += player_x_change - - enemy_x += enemy_x_change - enemy_y += enemy_y_change - - # enemy pos - if enemy_x >= 736: - enemy_x_change = -.2 - elif enemy_x <= 0: - enemy_x_change = .2 - if enemy_y >= 336: - enemy_y_change = -.1 - elif enemy_y <= 50: - enemy_y_change = .1 - - collision = is_collision(enemy_x, enemy_y, missile_x, missile_y) - if collision: - missile_y = 480 - missile_state = "ready" - # score ... - - display_enemy(enemy_x, enemy_y) - - if missile_y <= 0: - missile_state = "ready" - if missile_state == "fire": - display_missile(missile_x, missile_y) - missile_y -= missile_y_change - - display_player(player_x, player_y) - pygame.display.update()