728x90

1. 이번 강의 목표
이번 강의에서는 다음을 구현합니다.
- HP가 0이 되면 게임 오버 상태로 전환
- 게임 오버 화면에 점수 표시
- R 키를 누르면 재시작
- 재시작 시 필요한 변수들을 초기화
2. 게임 상태(state) 변수 만들기
게임은 “플레이 중”과 “게임 오버” 상태가 나뉘어야 합니다.
game_over = False
- False : 플레이 중
- True : 게임 오버
3. HP 0이면 게임 오버로 전환
플레이어 피격 처리 이후에 아래 조건을 넣습니다.
if hp <= 0:
game_over = True
4. 게임 오버 상태에서는 ‘게임 진행’을 멈춥니다
게임 오버가 되면 다음 요소들은 업데이트되면 안 됩니다.
- 플레이어 이동
- 총알 발사/이동
- 적 생성/이동
- 충돌 처리
즉, 게임 루프는 계속 돌되, 게임 로직만 멈추고 화면만 보여주는 구조가 됩니다.
5. 게임 오버 화면 만들기
게임 오버 상태에서는 화면에 문구를 출력합니다.
- “GAME OVER”
- “Score : ???”
- “Press R to Restart”
텍스트 출력은 font.render()를 이용합니다.
big_font = pygame.font.SysFont(None, 72)
6. R 키로 재시작하기 (변수 초기화)
재시작 시에는 아래 항목을 초기화해야 합니다.
- 점수(score)
- 체력(hp)
- 적 리스트(enemies)
- 총알 리스트(bullets)
- 타이머(enemy_timer)
- 쿨타임(last_fire_time)
- 피격 시간(last_hit_time)
- 플레이어 위치(player_rect)
이걸 함수로 만들면 깔끔합니다.
def reset_game():
player_rect = player_img.get_rect()
player_rect.centerx = SCREEN_WIDTH // 2
player_rect.bottom = SCREEN_HEIGHT - 20
bullets = []
enemies = []
score = 0
max_hp = 3
hp = max_hp
enemy_timer = 0
last_fire_time = 0
last_hit_time = 0
game_over = False
return player_rect, bullets, enemies, score, max_hp, hp, enemy_timer, last_fire_time, last_hit_time, game_over
7. 마무리
이번 강의에서는 다음을 구현했습니다.
- HP 0 → 게임 오버 상태 전환
- 게임 오버 화면 출력(점수 포함)
- R 키로 재시작
- 재시작 시 게임 변수 초기화
이제 이 게임은 “시작과 끝”이 있는 완성 게임입니다.

전체 코드
더보기
import pygame
import sys
import random
pygame.init()
# 화면 설정
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 640
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Shooting Game")
# FPS 설정
clock = pygame.time.Clock()
FPS = 60
# ===== 스프라이트 로드 =====
player_img = pygame.image.load("images/player.png").convert_alpha()
enemy_img = pygame.image.load("images/enemy.png").convert_alpha()
bullet_img = pygame.image.load("images/bullet.png").convert_alpha()
# ===== 스프라이트 크기 조정 =====
PLAYER_SIZE = (40, 40)
ENEMY_SIZE = (40, 40)
BULLET_SIZE = (6, 16)
player_img = pygame.transform.scale(player_img, PLAYER_SIZE)
enemy_img = pygame.transform.scale(enemy_img, ENEMY_SIZE)
bullet_img = pygame.transform.scale(bullet_img, BULLET_SIZE)
# 폰트
font = pygame.font.SysFont(None, 36)
big_font = pygame.font.SysFont(None, 72)
# ===== 게임 리셋 함수 =====
def reset_game():
player_rect = player_img.get_rect()
player_rect.centerx = SCREEN_WIDTH // 2
player_rect.bottom = SCREEN_HEIGHT - 20
bullets = []
enemies = []
score = 0
max_hp = 3
hp = max_hp
enemy_timer = 0
last_fire_time = 0
last_hit_time = 0
game_over = False
return player_rect, bullets, enemies, score, max_hp, hp, enemy_timer, last_fire_time, last_hit_time, game_over
# 기본 설정 값(속도/쿨타임)
player_speed = 5
bullet_speed = 8
fire_delay = 150
enemy_speed = 3
enemy_spawn_delay = 60
hit_delay = 1000 # ms
# 게임 초기화
player_rect, bullets, enemies, score, max_hp, hp, enemy_timer, last_fire_time, last_hit_time, game_over = reset_game()
# 게임 루프
running = True
while running:
now = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
# ===== 게임 오버 상태 처리 =====
if game_over:
# 재시작
if keys[pygame.K_r]:
player_rect, bullets, enemies, score, max_hp, hp, enemy_timer, last_fire_time, last_hit_time, game_over = reset_game()
# 화면 출력
screen.fill((0, 0, 0))
over_text = big_font.render("GAME OVER", True, (255, 255, 255))
score_text = font.render(f"Score : {score}", True, (255, 255, 255))
restart_text = font.render("Press R to Restart", True, (255, 255, 255))
screen.blit(over_text, (SCREEN_WIDTH // 2 - over_text.get_width() // 2, 220))
screen.blit(score_text, (SCREEN_WIDTH // 2 - score_text.get_width() // 2, 320))
screen.blit(restart_text, (SCREEN_WIDTH // 2 - restart_text.get_width() // 2, 370))
pygame.display.update()
clock.tick(FPS)
continue
# ===== 플레이어 이동 =====
if keys[pygame.K_w]:
player_rect.y -= player_speed
if keys[pygame.K_s]:
player_rect.y += player_speed
if keys[pygame.K_a]:
player_rect.x -= player_speed
if keys[pygame.K_d]:
player_rect.x += player_speed
# 화면 밖 제한
if player_rect.left < 0:
player_rect.left = 0
if player_rect.right > SCREEN_WIDTH:
player_rect.right = SCREEN_WIDTH
if player_rect.top < 0:
player_rect.top = 0
if player_rect.bottom > SCREEN_HEIGHT:
player_rect.bottom = SCREEN_HEIGHT
# ===== 총알 발사 (연사 제한) =====
if keys[pygame.K_SPACE]:
if now - last_fire_time >= fire_delay:
last_fire_time = now
bullet_rect = bullet_img.get_rect()
bullet_rect.centerx = player_rect.centerx
bullet_rect.bottom = player_rect.top
bullets.append(bullet_rect)
# 총알 이동
for b in bullets:
b.y -= bullet_speed
# 총알 제거
for b in bullets[:]:
if b.bottom < 0:
bullets.remove(b)
# ===== 적 생성 =====
enemy_timer += 1
if enemy_timer >= enemy_spawn_delay:
enemy_timer = 0
enemy_rect = enemy_img.get_rect()
enemy_rect.x = random.randint(0, SCREEN_WIDTH - enemy_rect.width)
enemy_rect.y = -enemy_rect.height
enemies.append(enemy_rect)
# 적 이동
for e in enemies:
e.y += enemy_speed
# 적 제거
for e in enemies[:]:
if e.top > SCREEN_HEIGHT:
enemies.remove(e)
# ===== 충돌 처리 (총알 vs 적) =====
for b in bullets[:]:
for e in enemies[:]:
if b.colliderect(e):
bullets.remove(b)
enemies.remove(e)
score += 10
break
# ===== 플레이어 피격 처리 =====
if now - last_hit_time >= hit_delay:
for e in enemies[:]:
if player_rect.colliderect(e):
hp -= 1
last_hit_time = now
enemies.remove(e)
break
# 게임 오버 체크
if hp <= 0:
game_over = True
# ===== 화면 그리기 =====
screen.fill((0, 0, 0))
screen.blit(player_img, player_rect)
for b in bullets:
screen.blit(bullet_img, b)
for e in enemies:
screen.blit(enemy_img, e)
# 점수 UI
score_ui = font.render(f"Score : {score}", True, (255, 255, 255))
screen.blit(score_ui, (10, 10))
# HP UI (숫자)
hp_ui = font.render(f"HP : {hp}", True, (255, 255, 255))
screen.blit(hp_ui, (10, 45))
# HP UI (바)
bar_w = 100
bar_h = 12
bar_x = 80
bar_y = 53
pygame.draw.rect(screen, (80, 80, 80), (bar_x, bar_y, bar_w, bar_h))
current_w = int(bar_w * (hp / max_hp))
pygame.draw.rect(screen, (255, 255, 255), (bar_x, bar_y, current_w, bar_h))
pygame.display.update()
clock.tick(FPS)
pygame.quit()
sys.exit()
728x90
'⚙️ Python > 🎮 Pygame 실전' 카테고리의 다른 글
| [Pygame] ✈️ 전투기 슈팅 게임 만들기 12강 | 적 타입 & 이동 패턴 추가하기 (0) | 2026.01.22 |
|---|---|
| [Pygame] ✈️ 전투기 슈팅 게임 만들기 11강 | 움직이는 배경(세로 스크롤) 구현하기 (0) | 2026.01.21 |
| [Pygame] ✈️ 전투기 슈팅 게임 만들기 9강 | 플레이어 체력 구현하기 (0) | 2026.01.19 |
| [Pygame] ✈️ 전투기 슈팅 게임 만들기 8강 | 점수 UI 표시하기 (0) | 2026.01.18 |
| [Pygame] ✈️ 전투기 슈팅 게임 만들기 7강 | 연사 제한(발사 쿨타임) 만들기 (0) | 2026.01.17 |