Codes: import pygame import random import os pygame.init() WIDTH, HEIGHT = 600, 700 win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Space Shooter") WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) YELLOW = (255, 255, 0) font = pygame.font.SysFont("Arial", 24) # High score file high_score_file = "highscore.txt" if not os.path.exists(high_score_file): with open(high_score_file, "w") as f: f.write("0") def load_high_score(): with open(high_score_file, "r") as f: return int(f.read()) def save_high_score(score): with open(high_score_file, "w") as f: f.write(str(score)) # Graphics player_img = pygame.Surface((50, 40)) player_img.fill(WHITE) enemy_img = pygame.Surface((40, 30)) enemy_img.fill(RED) bullet_img = pygame.Surface((5, 10)) bullet_img.fill(WHITE) explosion_effects = [] class Player: def __init__(self): self.x = WIDTH // 2 self.y = HEIGHT - 60 self.speed = 7 self.bullets = [] self.lives = 3 self.score = 0 def move(self, keys): if keys[pygame.K_LEFT] and self.x > 0: self.x -= self.speed if keys[pygame.K_RIGHT] and self.x < WIDTH - 50: self.x += self.speed def shoot(self): bullet = pygame.Rect(self.x + 22, self.y, 5, 10) self.bullets.append(bullet) def draw(self, win): win.blit(player_img, (self.x, self.y)) for bullet in self.bullets: pygame.draw.rect(win, WHITE, bullet) class Enemy: def __init__(self): self.x = random.randint(0, WIDTH - 40) self.y = random.randint(-100, -40) self.speed = random.uniform(0.5, 1.5) self.rect = pygame.Rect(self.x, self.y, 40, 30) def move(self): self.y += self.speed self.rect.topleft = (self.x, self.y) def draw(self, win): win.blit(enemy_img, (self.x, self.y)) class Explosion: def __init__(self, x, y): self.x = x self.y = y self.radius = 1 self.max_radius = 20 def update(self): self.radius += 2 def draw(self, win): if self.radius < self.max_radius: pygame.draw.circle(win, YELLOW, (int(self.x), int(self.y)), self.radius) Continued in the credits...
def draw_info(win, player, high_score): score_text = font.render(f"Score: {player.score}", True, WHITE) lives_text = font.render(f"Lives: {player.lives}", True, WHITE) high_score_text = font.render(f"High Score: {high_score}", True, WHITE) win.blit(score_text, (10, 10)) win.blit(lives_text, (WIDTH - 120, 10)) win.blit(high_score_text, (WIDTH // 2 - 70, 10)) def show_game_over_screen(player_score, high_score): win.fill(BLACK) game_over = font.render("Game Over!", True, WHITE) score_final = font.render(f"Your Score: {player_score}", True, WHITE) best_score = font.render(f"High Score: {high_score}", True, WHITE) restart_msg = font.render("Press R to Restart or Q to Quit", True, WHITE) win.blit(game_over, (WIDTH // 2 - 60, HEIGHT // 2 - 60)) win.blit(score_final, (WIDTH // 2 - 80, HEIGHT // 2 - 30)) win.blit(best_score, (WIDTH // 2 - 80, HEIGHT // 2)) win.blit(restart_msg, (WIDTH // 2 - 160, HEIGHT // 2 + 40)) pygame.display.update() waiting = True while waiting: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: pygame.quit() exit() elif event.key == pygame.K_r: waiting = False # go back to main loop def main(): while True: # Loop for restart functionality run = True clock = pygame.time.Clock() player = Player() enemies = [Enemy() for _ in range(5)] high_score = load_high_score() global explosion_effects explosion_effects = [] while run: clock.tick(60) win.fill(BLACK) keys = pygame.key.get_pressed() player.move(keys) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: player.shoot() # Bullets for bullet in player.bullets[:]: bullet.y -= 7 if bullet.y < 0: player.bullets.remove(bullet) # Enemies for enemy in enemies[:]: enemy.move() for bullet in player.bullets[:]: if enemy.rect.colliderect(bullet): explosion_effects.append(Explosion(enemy.x + 20, enemy.y + 15)) enemies.remove(enemy) player.bullets.remove(bullet) player.score += 10 enemies.append(Enemy()) if enemy.y > HEIGHT: enemies.remove(enemy) enemies.append(Enemy()) player.lives -= 1 player_rect = pygame.Rect(player.x, player.y, 50, 40) if enemy.rect.colliderect(player_rect): explosion_effects.append(Explosion(player.x + 25, player.y + 20)) enemies.remove(enemy) enemies.append(Enemy()) player.lives -= 1 # Explosions for explosion in explosion_effects[:]: explosion.update() if explosion.radius >= explosion.max_radius: explosion_effects.remove(explosion) # Draw everything player.draw(win) for enemy in enemies: enemy.draw(win) for explosion in explosion_effects: explosion.draw(win) draw_info(win, player, high_score) pygame.display.update() if player.lives <= 0: if player.score > high_score: save_high_score(player.score) high_score = player.score run = False # Game Over screen with R / Q option show_game_over_screen(player.score, high_score) if __name__ == "__main__": main() Prerequisites: Install pygame in cmd: pip install pygame