스네이크 게임

스네이크 게임 제작기 4

잡코신 2024. 4. 10. 18:00
728x90
반응형

지난 시간

지난번엔 스네이크 게임을 게임답게 완성시켰다.

이번엔 완성시킨 게임을 좀 더 보안할 것이다.

스네이크 게임 만들기

게임을 플레이할 때 나오는 사과를 빨간 점으로 표시했었다.

하지만 그러니까 뭔가 먹어야하는 아이템 느낌은 들긴 하지만 이것이 '사과'다 라는 느낌은 들지 않는다.

그렇기에 빨간 점 대신 사과 이미지를 삽입해보겠다.

class Apple:
    def __init__(self):
        self.position = (random.randint(0, screen_width // cell_size - 1) * cell_size,
                         random.randint(0, screen_height // cell_size - 1) * cell_size)
        self.image = pygame.image.load("apple.png").convert()
        self.image = pygame.transform.scale(self.image, (cell_size, cell_size))

    def draw(self, screen):
        if not game_over:
            screen.blit(self.image, self.position)

사과 클래스에 이미지를 로드하고 크기 변경하는 코드를 추가해준다.

draw 부분은 위치에 이미지를 그려준다.

사과 이미지는 구글링을 찾아 아무거나 사용했다.

잎사귀 때문에 사과가 치우쳐져서 잎사귀도 잘라 사용했다.

    def draw(self, screen):
        for i, segment in enumerate(self.segments):
            if i == 0:
                pygame.draw.rect(screen, GREEN, (segment[0], segment[1], cell_size, cell_size))
                pygame.draw.circle(screen, BLACK, (segment[0] + cell_size // 4, segment[1] + cell_size // 4), 2)
                pygame.draw.circle(screen, BLACK, (segment[0] + 3 * cell_size // 4, segment[1] + cell_size // 4), 2)
            elif i % 2 == 0:
                pygame.draw.rect(screen, GREEN, (segment[0], segment[1], cell_size, cell_size))
            else:
                pygame.draw.rect(screen, LIGHT_GREEN, (segment[0], segment[1], cell_size, cell_size))

지렁이 모양도 바꿨다.

그냥 초록색 덩어리에 불과 했다면 머리부분엔 눈을 달아주고 연두와 초록이 번가라있는 무늬로 바꿔주었다.

    board_surface = pygame.Surface((screen_width, screen_height))
    board_surface.fill(BLACK)
    for y in range(0, screen_height, cell_size * 2):
        for x in range(0, screen_width, cell_size * 2):
            pygame.draw.rect(board_surface, GRAY, (x, y, cell_size, cell_size))
    for y in range(cell_size, screen_height, cell_size * 2):
        for x in range(cell_size, screen_width, cell_size * 2):
            pygame.draw.rect(board_surface, GRAY, (x, y, cell_size, cell_size))

배경을 바꿔주었다.

단지 검정색이기만한 배경에서 체스판 같은 색이 번가라있는 배경으로 바꿔줬다.

            #배경 그리기
            screen.blit(board_surface, (0, 0))

배경을 그려주는 코드이다.

# 색깔 상수 정의
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
GRAY = (128, 128, 128)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
LIGHT_GREEN = (152, 251, 152)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
LIGHT_BLUE = (173, 216, 230)

마지막으로 사용한 색깔 변수들이다.

스네이크 게임(ver.4) 플레이하기

import pygame
import random
import sys

# 색깔 상수 정의
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
GRAY = (128, 128, 128)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
LIGHT_GREEN = (152, 251, 152)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
LIGHT_BLUE = (173, 216, 230)

# 게임 화면 크기 설정
screen_width = 800
screen_height = 600
cell_size = 20

# 지렁이 클래스 정의
class Snake:
    def __init__(self):
        self.segments = [
            (screen_width // 2, screen_height // 2),
            (screen_width // 2 - cell_size, screen_height // 2),
            (screen_width // 2 - 2 * cell_size, screen_height // 2)
        ]
        self.direction = 'right'
        self.grow = False

    def move(self):
        x, y = self.segments[0]
        if self.direction == 'up':
            y -= cell_size
        elif self.direction == 'down':
            y += cell_size
        elif self.direction == 'left':
            x -= cell_size
        elif self.direction == 'right':
            x += cell_size
        self.segments.insert(0, (x, y))
        if not self.grow:
            self.segments.pop()
        else:
            self.grow = False

    def change_direction(self, direction):
        if direction == 'up' and self.direction != 'down':
            self.direction = 'up'
        elif direction == 'down' and self.direction != 'up':
            self.direction = 'down'
        elif direction == 'left' and self.direction != 'right':
            self.direction = 'left'
        elif direction == 'right' and self.direction != 'left':
            self.direction = 'right'

    def draw(self, screen):
        for i, segment in enumerate(self.segments):
            if i == 0:
                pygame.draw.rect(screen, GREEN, (segment[0], segment[1], cell_size, cell_size))
                pygame.draw.circle(screen, BLACK, (segment[0] + cell_size // 4, segment[1] + cell_size // 4), 2)
                pygame.draw.circle(screen, BLACK, (segment[0] + 3 * cell_size // 4, segment[1] + cell_size // 4), 2)
            elif i % 2 == 0:
                pygame.draw.rect(screen, GREEN, (segment[0], segment[1], cell_size, cell_size))
            else:
                pygame.draw.rect(screen, LIGHT_GREEN, (segment[0], segment[1], cell_size, cell_size))

# 사과 클래스 정의
class Apple:
    def __init__(self):
        self.position = (random.randint(0, screen_width // cell_size - 1) * cell_size,
                         random.randint(0, screen_height // cell_size - 1) * cell_size)
        self.image = pygame.image.load("apple.png").convert()
        self.image = pygame.transform.scale(self.image, (cell_size, cell_size))

    def draw(self, screen):
        if not game_over:
            screen.blit(self.image, self.position)

if __name__ == "__main__":
    # 게임 초기화
    pygame.init()
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("스네이크 게임")

    clock = pygame.time.Clock()

    snake = Snake()
    apple = Apple()

    score = 0

    # 게임 루프
    game_over = True  # 게임 종료 
    game_started = False # 게임 시작

    # 배경 생성
    board_surface = pygame.Surface((screen_width, screen_height))
    board_surface.fill(BLACK)
    for y in range(0, screen_height, cell_size * 2):
        for x in range(0, screen_width, cell_size * 2):
            pygame.draw.rect(board_surface, GRAY, (x, y, cell_size, cell_size))
    for y in range(cell_size, screen_height, cell_size * 2):
        for x in range(cell_size, screen_width, cell_size * 2):
            pygame.draw.rect(board_surface, GRAY, (x, y, cell_size, cell_size))

    while True:  # 무한 루프
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    game_started = True
                    snake = Snake()
                    apple = Apple()
                    score = 0
                    game_over = False
                elif event.key == pygame.K_UP:
                    snake.change_direction('up')
                elif event.key == pygame.K_DOWN:
                    snake.change_direction('down')
                elif event.key == pygame.K_LEFT:
                    snake.change_direction('left')
                elif event.key == pygame.K_RIGHT:
                    snake.change_direction('right')

        if not game_over:
            # 게임 로직 처리

            # 게임 오버 조건
            if (snake.segments[0][0] < 0 or snake.segments[0][0] >= screen_width or
                    snake.segments[0][1] < 0 or snake.segments[0][1] >= screen_height or
                    snake.segments[0] in snake.segments[1:]):
                game_over = True

            snake.move()

            if snake.segments[0] == apple.position:
                score += 1
                apple = Apple()
                snake.grow = True

            screen.fill(BLACK)

            #배경 그리기
            screen.blit(board_surface, (0, 0))

            snake.draw(screen)
            apple.draw(screen)
        else:
            # R키를 누르면 재시작
            font = pygame.font.Font(None, 36)
            text_restart = font.render("Press 'R' to Start", True, LIGHT_BLUE)
            text_restart_rect = text_restart.get_rect(center=(screen_width // 2, screen_height // 2 - 50))
            screen.blit(text_restart, text_restart_rect)

            # 게임 시작 상태일 때 화면에 "Game Over" 메시지와 사과를 먹은 개수 출력
            if game_started:
                text_game_over = font.render("Game Over", True, RED)
                text_game_over_rect = text_game_over.get_rect(center=(screen_width // 2, screen_height // 2 + 50))
                screen.blit(text_game_over, text_game_over_rect)

                text_score = font.render("Score: {}".format(score), True, BLUE)
                text_score_rect = text_score.get_rect(center=(screen_width // 2, screen_height // 2))
                screen.blit(text_score, text_score_rect)

        pygame.display.flip()
        clock.tick(10) # 개임 속도 조절

    pygame.quit()

최종 코드이다. 플레이해보자.

이젠 보기 좋은 게임이 된 것 같다.

 

지뢰찾기 게임에 이어 이것도 프로그램으로 만들어볼 것이다.

pyinstaller --onefile --noconsole Snakegame.py

다음 명령어를 입력해 주고 결과물을 기다린다.

Snakegame.exe
15.03MB

 

참고로 apple.png 파일이 있는 곳에 파일을 두고 실행시켜야 한다.

Next

이제 게임이 완전히 완성됐다.

다음에 스네이크게임2로 돌아온다면 지렁이 속도와 사과 개수등을 조절하는 옵션을 만들 것이다.

 

728x90
반응형

'스네이크 게임' 카테고리의 다른 글

스네이크 게임 제작기 3  (0) 2024.03.20
스네이크 게임 제작기 2  (0) 2024.03.13
스네이크 게임 제작기 1  (1) 2024.03.06