본문 바로가기

[Pygame] 🐍 스네이크 게임 만들기 4강 | 벽 충돌 처리하기 (게임 오버)

@도마22026. 1. 4. 19:00
728x90


4강에서 할 일

4강에서는 맵의 경계를 벗어나면 게임이 종료되도록 만듭니다.

  • 10×10 격자의 유효 범위를 정합니다
  • 뱀이 벽을 넘었는지 검사합니다
  • 벽 충돌 시 게임을 종료합니다

이제부터 게임에 “실패 조건”이 생깁니다.


1) 우리 게임의 유효 좌표 범위

격자 크기는 10×10입니다.
즉, 가능한 좌표는 다음과 같습니다.

  • x 좌표: 0 ~ 9
  • y 좌표: 0 ~ 9

이 범위를 벗어나면 벽 충돌입니다.


2) 벽 충돌 조건 만들기

뱀의 위치는 snake_x, snake_y로 관리하고 있습니다.
아래 중 하나라도 만족하면 벽에 부딪힌 것입니다.

  • snake_x < 0
  • snake_x >= GRID_SIZE
  • snake_y < 0
  • snake_y >= GRID_SIZE

이 조건은 이동이 끝난 직후에 검사합니다.


3) 벽에 부딪히면 게임을 종료합니다

이번 강의에서는 단순하게 프로그램을 종료합니다.
(게임 오버 화면은 나중에 만듭니다)

이동 로직 바로 아래에 다음 코드를 추가합니다.

if (
    snake_x < 0 or
    snake_x >= GRID_SIZE or
    snake_y < 0 or
    snake_y >= GRID_SIZE
):
    pygame.quit()
    sys.exit()

이제 뱀이 화면 밖으로 나가면 즉시 종료됩니다.


4) 지금 단계에서의 게임 상태

현재 게임은 다음과 같은 상태입니다.

  • 초록색 뱀이 방향키로 이동합니다
  • 격자 한 칸씩 이동합니다
  • 벽에 닿으면 게임이 끝납니다

4강 정리

이번 강의에서 배운 내용입니다.

  • 격자 게임에서는 “유효 좌표 범위”가 매우 중요합니다
  • 벽 충돌은 좌표 비교로 간단히 처리합니다
  • 이동 → 충돌 검사 순서를 지킵니다

전체 코드

더보기
import pygame
import sys

pygame.init()

# =========================
# 기본 설정
# =========================
CELL_SIZE = 40
GRID_SIZE = 10
SCREEN_SIZE = CELL_SIZE * GRID_SIZE

BLACK = (0, 0, 0)
GREEN = (0, 255, 0)

# =========================
# 화면 설정
# =========================
screen = pygame.display.set_mode((SCREEN_SIZE, SCREEN_SIZE))
pygame.display.set_caption("10x10 Snake Game")

clock = pygame.time.Clock()

# =========================
# 뱀 초기 위치 (격자 좌표)
# =========================
snake_x = 5
snake_y = 5

# =========================
# 방향 설정
# =========================
direction = "RIGHT"
next_direction = direction

# =========================
# 이동 제어
# =========================
move_delay = 1
move_counter = 0

# =========================
# 게임 루프
# =========================
while True:
    # 이벤트 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        # 방향키 입력
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and direction != "DOWN":
                next_direction = "UP"
            elif event.key == pygame.K_DOWN and direction != "UP":
                next_direction = "DOWN"
            elif event.key == pygame.K_LEFT and direction != "RIGHT":
                next_direction = "LEFT"
            elif event.key == pygame.K_RIGHT and direction != "LEFT":
                next_direction = "RIGHT"

    # 이동 타이밍
    move_counter += 1
    if move_counter >= move_delay:
        move_counter = 0

        direction = next_direction

        if direction == "UP":
            snake_y -= 1
        elif direction == "DOWN":
            snake_y += 1
        elif direction == "LEFT":
            snake_x -= 1
        elif direction == "RIGHT":
            snake_x += 1

        # 벽 충돌 처리
        if (
            snake_x < 0 or
            snake_x >= GRID_SIZE or
            snake_y < 0 or
            snake_y >= GRID_SIZE
        ):
            pygame.quit()
            sys.exit()

    # 배경
    screen.fill(BLACK)

    # 격자 → 픽셀
    pixel_x = snake_x * CELL_SIZE
    pixel_y = snake_y * CELL_SIZE

    # 뱀 머리
    snake_rect = pygame.Rect(pixel_x, pixel_y, CELL_SIZE, CELL_SIZE)
    pygame.draw.rect(screen, GREEN, snake_rect)

    # 화면 갱신
    pygame.display.update()

    # FPS
    clock.tick(10)

728x90
도마2
@도마2 :: 도마의 코드노트

초보자를 위한 코딩 강의를 정리합니다. 파이썬부터 C#, Unity 게임 제작까지 차근차근 기록합니다. — 도마

목차