게임 진행 상황을 저장하고 불러오는 기능을 구현하면 플레이어가 게임 진행 상황을 유지하고, 이전에 시작한 게임을 계속하며, 게임을 통해 얻은 업적을 희생하지 않고 다양한 접근 방식을 테스트할 수 있어 게임의 전반적인 즐거움을 크게 향상시킬 수 있습니다.

파이썬의 아케이드 라이브러리를 활용하여 이 기능을 게임에 통합하는 것은 비교적 복잡하지 않은 과정이라는 것을 알 수 있습니다.

간단한 게임 만들기

플레이어가 가로로 탐색할 수 있는 기본 게임 개발을 시작합니다.

제공된 코드는 다음과 같습니다: “`python def play_simple_game(): “””간단한 추측 게임을 합니다.””” # 시도 횟수와 추측 범위를 초기화합니다. num_attempts = 0 guess_range = 10 # 게임 루프를 시작합니다. 를 시작합니다: # 1과 추측 범위 사이의 난수를 생성합니다. answer = randint(1, guess_range) # 사용자에게 추측을 묻습니다. guess = int(input(“1에서 {} 사이의 숫자를 맞춰주세요”.format(guess_range))) # 추측이 너무 높거나 낮은지 확인합니다. guess > answer: print(“너무 높아요!”)

 import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_SPEED = 5
blue = arcade.color.BLUE

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.player_x = width // 2

    def on_draw(self):
        arcade.start_render()
        arcade.draw_rectangle_filled(self.game_state.player_x,
                                     50, 50, 50, blue)

    def update(self, delta_time):
        pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= PLAYER_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += PLAYER_SPEED

def main():
    window = GameWindow(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

if __name__ == '__main__':
    main()

이 프로그램은 플레이어를 시각적으로 표현하는 직사각형의 파란색 객체가 포함된 그래픽 인터페이스를 생성합니다. 사용자는 키보드의 방향 버튼, 특히 왼쪽 및 오른쪽 화살표를 사용하여 파란색 직사각형의 위치를 이동하여 플레이어의 움직임을 탐색할 수 있습니다.

게임 상태 관리

게임 데이터를 저장하고 로드하는 메커니즘을 효과적으로 구현하기 위해서는 여러 게임 상태를 고려해야 합니다. 각 게임 상태는 오브젝트의 위치, 점수 및 기타 관련 세부 정보와 같은 정보를 포함하는 게임의 현재 상태를 캡슐화하는 역할을 합니다. 구체적인 예로 플레이어의 X 좌표에만 집중해 보겠습니다.

GameState 클래스의 구현에는 게임 상태와 관련된 모든 필수 데이터를 포함하고 이 정보를 저장 및 로드하는 기능을 제공하는 클래스를 생성하는 작업이 포함됩니다. 다음은 파이썬에서 이러한 클래스의 예시입니다:

 class GameState:
    def __init__(self):
        self.player_x = 0

게임 데이터 저장

적절한 시점에 게임 데이터를 JSON 형식으로 저장하는 메서드를 통합하도록 GameWindow 클래스를 수정해야 합니다. 이렇게 하면 나중에 게임을 재개하는 데 필요한 모든 관련 정보를 보존할 수 있습니다.다음은 이 요구사항의 구현 예시입니다:

이 글도 확인해 보세요:  게임 비용 상승이 업계에 미치는 5가지 영향

`save_game` 메서드를 실행하는 동안 파이썬 사전의 인스턴스가 생성되고 관련 게임 관련 정보로 채워집니다. 이후 이 딕셔너리는 `save.json`이라는 JSON 파일로 변환됩니다.

 import json

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.game_state = GameState()

    def save_game(self):
        data = {
            'player_x': self.game_state.player_x
        }
        with open('save.json', 'w') as file:
            json.dump(data, file)
            print(data)

    def on_draw(self):
        arcade.start_render()
        arcade.draw_rectangle_filled(self.game_state.player_x,
                                     50, 50, 50, blue)

    def update(self, delta_time):
        pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.game_state.player_x -= PLAYER_SPEED
        elif key == arcade.key.RIGHT:
            self.game_state.player_x += PLAYER_SPEED
        elif key == arcade.key.S:
            self.save_game()

게임 데이터 로드

별도의 파일에서 게임 상태를 로드하는 메서드를 통합하기 위해 GameWindow 클래스를 추가로 확장해야 합니다. 이는 “load-game.py”라는 제목의 새 Python 파일을 생성하고 다음과 같이 적절히 수정하여 필요한 코드를 포함하면 됩니다:

 class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.game_state = GameState()
        self.load_game()

    def load_game(self):
        try:
            with open('save.json', 'r') as file:
                data = json.load(file)
                self.game_state.player_x = data['player_x']
        except FileNotFoundError:
            pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.L:
            self.load_game()

`load_game` 메서드는 `save.json` 파일을 열고 그 안에 저장된 게임 데이터를 가져옵니다. 그 후 검색된 정보로 게임 상태를 업데이트합니다. 그러나 파일이 존재하지 않는 경우 예외가 무시되어 기본 게임 상태가 유지될 수 있습니다.

추가 기능 포함

게임의 현재 저장 및 로드 시스템은 추가 기능을 통합하여 개선될 수 있습니다.

고득점 저장

많은 게임의 공통적인 특징은 게임 진행과 동시에 고득점을 보존하는 것입니다. 이는 플레이 중에 달성한 최고 점수를 유지 및 저장하는 시스템을 통해 달성할 수 있습니다. 이 기능을 구현하려면 “high-score.py”라는 제목의 새 Python 스크립트를 생성하고 다음과 같이 수정합니다:

 class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.high_score = 0

    def load_game(self):
        try:
            with open('save.json', 'r') as file:
                data = json.load(file)
                print(data)
                self.player_x = data.get('player_x', self.player_x)
                self.high_score = data.get('high_score', self.high_score)
        except FileNotFoundError:
            pass

    def save_game(self):
        data = {
            'player_x': self.player_x,
            'high_score': self.high_score
        }
        with open('save.json', 'w') as file:
            json.dump(data, file)
            print(data)

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= PLAYER_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += PLAYER_SPEED
            self.high_score += 1

자동 저장 기능

자동 저장 메커니즘의 구현은 플레이어의 진행 상황을 안전하게 보호하고 예기치 않은 중단이나 기술적 결함으로 인해 성능이 저하되지 않도록 보장하는 데 필수적입니다. 이 목표를 달성하려면 “auto-save.py”라는 스크립트를 생성하고 아래에 설명된 대로 필요한 수정을 통합하세요:

 import time

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.game_state = GameState()

       # Save every 6 seconds
       self.autosave_interval = 6
        self.last_save_time = time.time()

    def update(self, delta_time):
        current_time = time.time()
        time_diff = current_time - self.last_save_time

        if time_diff >= self.autosave_interval:
            self.save_game()
            print("Saved")
            self.last_save_time = current_time

현재 코드 세그먼트는 가장 최근에 저장한 후 지정된 기간이 경과했는지 여부를 확인합니다. 이러한 시나리오의 경우 GameWindow 클래스의 save\_game 메서드를 자동으로 활성화합니다

이 글도 확인해 보세요:  파이썬을 사용하여 FLAMES 게임 플레이하기

게임 데이터 유효성 검사

로드된 게임 데이터를 검증하는 것은 진위성과 균일성을 유지하는 데 가장 중요합니다. 유니티의 저장 및 로딩 메커니즘에 데이터 유효성 검사를 통합하면 손쉽게 수행할 수 있습니다.

 class GameState:
    def __init__(self):
        self.player_x = 0

    def save_state(self):
        if self.is_valid_state():
            data = {
                'player_x': self.player_x
            }

            with open('save.json', 'w') as file:
                json.dump(data, file)

    def load_state(self):
        with open('save.json', 'r') as file:
            data = json.load(file)

            if self.validate_loaded_data(data):
                self.player_x = data['player_x']
            else:
                print("Error!")

    def is_valid_state(self):
        # Perform validation logic here
        # Return True if the state is valid, False otherwise
        pass

    def validate_loaded_data(self, data):
        # Perform validation on the loaded data
        # Return True if the data is valid, False otherwise
        pass

이러한 보완 기능을 저장 및 로드 메커니즘에 통합하면 게이머에게 여러 게임 상태를 보존하고, 최고 점수를 추적하고, 자동 저장을 활성화하고, 데이터 정확성을 보장하는 수단을 제공하여 보다 확장되고 탄력적인 게임 플레이 경험을 제공할 수 있습니다.

저장 및 로드 시스템 모범 사례

잘 설계된 저장 및 로드 기능은 게임 제작에 있어 매우 중요한 요소입니다.

민감한 데이터 암호화

게임에 비밀번호, 개인 정보 또는 게임 내 구매와 같은 기밀 정보가 포함된 경우 저장된 게임 상태는 반드시 암호화해야 합니다. 암호화의 목적은 플레이어의 개인정보를 보호하고 데이터에 대한 승인되지 않은 액세스를 금지하여 추가적인 수준의 보호를 제공하는 것입니다. 민감한 정보의 안전을 보장하려면 암호화 알고리즘과 라이브러리를 활용하세요.

로드된 데이터 유효성 검사

게임 데이터의 정확성, 일관성, 게임의 지정된 요구 사항 준수를 보장하기 위해 게임 데이터를 로드하기 전에 유효성 검사 프로세스를 반드시 수행해야 합니다. 데이터가 게임의 규정된 형식, 구성 및 제한 사항을 준수하는지 확인합니다.

시스템 오류나 비윤리적 관행을 방지하기 위해 중요한 데이터 필드에 대한 엄격한 유효성 검사를 수행해야 합니다. 데이터의 예기치 않은 상황이나 이상 징후를 설명할 수 있는 건전한 데이터 검증 메커니즘을 구현해야 합니다.

이 글도 확인해 보세요:  Vite 시작하기: 최고의 빌드 툴

오류를 우아하게 처리

예외 처리는 파일 입출력 작업과 관련하여 소프트웨어 개발의 필수적인 측면입니다. 예기치 않은 상황이 발생하여 사용자에게 유용한 정보를 제공하는 방식으로 오류를 처리해야 하는 경우가 발생할 수 있습니다. 게임의 원활한 작동을 보장하려면 데이터를 저장하고 로드하는 과정에서 발생할 수 있는 FileNotFoundError 또는 PermissionError와 같은 잠재적인 예외를 포착하고 관리하는 것이 필수적입니다.

사용자가 쉽게 이해할 수 있는 방식으로 명확하고 간결한 오류 메시지를 제공하면 혼란과 불만을 줄이는 데 도움이 됩니다. 또한 문제 해결과 근본적인 문제 파악을 용이하게 하기 위해 오류 로그를 유지하는 것이 좋습니다.

저장 및 로드 기능 테스트

다양한 게임 상태에서의 저장, 합법 및 불법 저장 파일에서의 로드, 경계 사례 평가 등 다양한 조건을 포괄하는 종합적인 테스트를 통해 저장 및 로드 기능의 성능을 엄격하게 평가하여 신뢰성과 정확성을 보장합니다.

광범위한 테스트 세트를 개발할 수 있는 자동화된 테스트 프레임워크를 통해 저장된 데이터가 예상 결과와 일치하는지 확인하여 게임 저장 및 로드 기능의 적절한 기능을 보장합니다.

저장 및 로드 시스템으로 게임을 더욱 재미있게

저장 및 로드 기능을 구현하면 플레이어에게 더 큰 연속성과 진행감을 제공함으로써 전반적인 게임 플레이 경험을 향상시킬 수 있습니다. 이 기능을 통해 게이머는 다양한 전략을 탐색하고, 도전을 시도하고, 이전 업적을 희생하지 않고 나중에 플레이를 재개할 수 있습니다.

이 기능을 포함하면 사용자가 지인과의 친선 경쟁에 참여하거나 개인 최고 기록을 뛰어넘기 위해 노력할 수 있으므로 반복 플레이와 지속적인 게임 참여를 촉진할 수 있습니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.