728x90

5강에서 할 일
5강에서는 게임 판 위에 노란색 먹이(Food) 를 생성합니다.
- 먹이를 랜덤한 격자 위치에 생성합니다
- 먹이가 뱀 머리와 겹치지 않게 합니다
- 노란색 사각형으로 화면에 표시합니다
이제 게임에 “목표”가 생깁니다.
1) 필요한 모듈 추가합니다
랜덤 좌표를 만들기 위해 random 모듈이 필요합니다.
파일 상단 import 부분에 추가합니다.
import random
2) 먹이 색상을 정의합니다
먹이는 노란색으로 합니다.
YELLOW = (255, 255, 0)
3) 먹이 좌표를 격자 기준으로 관리합니다
먹이도 뱀과 똑같이 격자 좌표(x, y) 로 관리합니다.
먹이 좌표 변수는 게임 루프 밖에 둡니다.
(게임 시작할 때 한 번 생성하기 때문입니다.)
food_x = 0
food_y = 0
이제 이 값을 랜덤으로 채웁니다.
4) 랜덤으로 먹이 위치를 뽑습니다
먹이는 10×10 게임 판 안에서만 나와야 합니다.
즉, 좌표 범위는 0~9 입니다.
food_x = random.randint(0, GRID_SIZE - 1)
food_y = random.randint(0, GRID_SIZE - 1)
5) 먹이가 뱀 머리와 겹치지 않게 합니다
먹이가 뱀 머리 위치에 생성되면 보기에도 이상하고, 다음 강의에서 “먹었다” 판정도 꼬입니다.
그래서 겹치면 다시 뽑는 방식을 사용합니다.
while True:
food_x = random.randint(0, GRID_SIZE - 1)
food_y = random.randint(0, GRID_SIZE - 1)
if food_x != snake_x or food_y != snake_y:
break
현재는 뱀이 머리만 있으니 “머리와 겹침만 방지”하면 됩니다.
나중에 몸이 생기면 이 부분을 확장합니다.
6) 먹이를 화면에 그립니다
먹이도 사각형(Rect)으로 그립니다.
뱀과 동일하게 격자 → 픽셀 변환을 해서 그립니다.
이 코드는 게임 루프 안, 배경을 칠한 다음에 그립니다.
food_rect = pygame.Rect(
food_x * CELL_SIZE,
food_y * CELL_SIZE,
CELL_SIZE,
CELL_SIZE
)
pygame.draw.rect(screen, YELLOW, food_rect)
7) 현재 게임 상태
현재 게임은 다음처럼 동작합니다.
- 초록색 뱀이 한 칸씩 이동합니다
- 벽에 닿으면 게임이 종료됩니다
- 노란색 먹이가 랜덤한 위치에 1개 표시됩니다
5강 정리
이번 강의에서 배운 핵심입니다.
- 랜덤 좌표로 오브젝트를 생성합니다
- 격자 게임에서는 0~(GRID_SIZE-1) 범위를 지켜야 합니다
- 겹침 방지는 while True 재추첨 방식으로 처리합니다
전체 코드
더보기
import pygame
import sys
import random
pygame.init()
# =========================
# 기본 설정
# =========================
CELL_SIZE = 40
GRID_SIZE = 10
SCREEN_SIZE = CELL_SIZE * GRID_SIZE
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
YELLOW = (255, 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:
food_x = random.randint(0, GRID_SIZE - 1)
food_y = random.randint(0, GRID_SIZE - 1)
if food_x != snake_x or food_y != snake_y:
break
# =========================
# 게임 루프
# =========================
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)
# 뱀 그리기
snake_rect = pygame.Rect(
snake_x * CELL_SIZE,
snake_y * CELL_SIZE,
CELL_SIZE,
CELL_SIZE
)
pygame.draw.rect(screen, GREEN, snake_rect)
# 먹이 그리기
food_rect = pygame.Rect(
food_x * CELL_SIZE,
food_y * CELL_SIZE,
CELL_SIZE,
CELL_SIZE
)
pygame.draw.rect(screen, YELLOW, food_rect)
# 화면 갱신
pygame.display.update()
# FPS
clock.tick(10)
728x90
'⚙️ Python > 🎮 Pygame 실전' 카테고리의 다른 글
| [Pygame] 🐍 스네이크 게임 만들기 7강 | 뱀 몸 만들기 + 먹으면 길어지기 (0) | 2026.01.07 |
|---|---|
| [Pygame] 🐍 스네이크 게임 만들기 6강 | 먹이 처리 + 점수 (0) | 2026.01.06 |
| [Pygame] 🐍 스네이크 게임 만들기 4강 | 벽 충돌 처리하기 (게임 오버) (0) | 2026.01.04 |
| [Pygame] 🐍 스네이크 게임 만들기 3강 | 키보드 입력으로 뱀 머리 이동하기 (0) | 2026.01.03 |
| [Pygame] 🐍 스네이크 게임 만들기 2강 | 뱀 머리 그리기 (격자 좌표 이해) (0) | 2026.01.02 |