본문 바로가기

구현

AI와 협업 프로젝트: 구현 2/6 확장 모듈

알겠습니다! 이번에는 주석을 더욱 꼼꼼하고 명확하게 달아서, 초등학생도 이해할 수 있을 정도로 설명을 더 추가할게요. 그리고 제목도 요청하신 대로 수정하여, **"AI와 협업 프로젝트: 구현 2/6 확장 모듈"**로 설정하고, 블로그에 올릴 수 있도록 포맷을 맞출게요.


AI와 협업 프로젝트: 구현 2/6 확장 모듈

목표: 모듈 시스템을 확장하고, 새로운 게임 모듈을 추가하는 방법을 구현합니다. 이번 단계에서는 FishingModule 외에도 BattleModule과 같은 다른 게임 모듈을 추가할 수 있는 구조로 변경합니다.

코드:

#include <iostream>
#include <unordered_map>
#include <string>

// 1. GameModule 인터페이스 정의
// 모든 게임 모듈은 GameModule을 상속받아야 하며, run() 함수를 구현해야 합니다.
// 각 모듈은 주어진 명령어를 받아 그에 맞는 처리를 하고 결과를 반환합니다.
class GameModule {
public:
    // run 함수는 각 모듈에서 명령어를 받아 처리하고 그 결과를 반환합니다.
    // 예를 들어 "Fishing start" 명령어를 받으면, 그에 맞는 행동을 실행하는 방식입니다.
    virtual std::string run(const std::string& command) = 0;  
};

// 2. GameCore 클래스 정의
// GameCore는 게임의 중심 역할을 하며, 다양한 모듈을 관리하고 명령어를 처리합니다.
// 여러 모듈을 등록하고, 각 모듈에 맞는 명령어를 실행할 수 있습니다.
class GameCore {
private:
    // 3. 모듈을 저장할 맵 (명령어 접두사 -> 모듈)
// 이 맵은 명령어 접두사와 그것을 처리할 모듈을 매칭시킵니다.
// 예를 들어, "Fishing"이라는 명령어 접두사에 대해 FishingModule을 연결합니다.
    std::unordered_map<std::string, GameModule*> modules; 

public:
    // 4. 모듈 등록 함수
    // 이 함수는 새로운 모듈을 GameCore에 등록하는 함수입니다.
    // 명령어 접두사와 그에 해당하는 모듈을 전달받아, 맵에 저장합니다.
    void registerModule(const std::string& commandPrefix, GameModule* module) {
        modules[commandPrefix] = module;  // 명령어 접두사와 모듈을 맵에 저장
    }

    // 5. 명령어 처리 함수
    // 사용자가 입력한 명령어를 받아 적절한 모듈을 찾아 실행하고 결과를 반환합니다.
    // 명령어의 접두사를 추출하여 등록된 모듈을 찾아 실행합니다.
    std::string handleCommand(const std::string& command) {
        // 명령어의 첫 부분 (접두사)만 추출
        std::string prefix = command.substr(0, command.find(' '));  

        // 명령어 접두사에 해당하는 모듈이 있으면 실행하고 결과 반환
        if (modules.find(prefix) != modules.end()) {
            return modules[prefix]->run(command);  
        }

        // 명령어가 등록되어 있지 않으면 "Unknown command"를 반환
        return "Unknown command.";  
    }
};

// 6. 예시 모듈: FishingModule
// FishingModule은 "Fishing start"와 같은 명령어를 처리하는 모듈입니다.
// 이 모듈은 GameModule 인터페이스를 상속받아 run() 함수를 구현합니다.
class FishingModule : public GameModule {
public:
    // "Fishing start" 명령어를 실행하면 "Fishing started!"라는 메시지를 반환합니다.
    std::string run(const std::string& command) override {
        return "Fishing started!";  // 낚시 시작 메시지 반환
    }
};

// 7. 새로운 예시 모듈: BattleModule
// BattleModule은 "Battle start"와 같은 명령어를 처리하는 모듈입니다.
// 이 모듈도 GameModule을 상속받고, run() 함수를 구현하여 전투를 시작하는 메시지를 반환합니다.
class BattleModule : public GameModule {
public:
    // "Battle start" 명령어를 실행하면 "Battle started!"라는 메시지를 반환합니다.
    std::string run(const std::string& command) override {
        return "Battle started!";  // 배틀 시작 메시지 반환
    }
};

// 8. main 함수
// main 함수에서는 GameCore 객체를 생성하고, 모듈을 등록하고 명령어를 처리합니다.
int main() {
    GameCore gameCore;  // GameCore 객체 생성

    // 9. 모듈 등록
    // "Fishing"이라는 명령어에 대해 FishingModule을 등록합니다.
    // "Battle"이라는 명령어에 대해 BattleModule을 등록합니다.
    gameCore.registerModule("Fishing", new FishingModule());  
    gameCore.registerModule("Battle", new BattleModule());  // Battle 모듈도 등록

    // 10. 명령어 실행
    // "Fishing start" 명령어를 실행하고 그 결과를 출력합니다.
    std::string resultFishing = gameCore.handleCommand("Fishing start");  
    // "Battle start" 명령어를 실행하고 그 결과를 출력합니다.
    std::string resultBattle = gameCore.handleCommand("Battle start");

    // 11. 결과 출력
    std::cout << resultFishing << std::endl;  // "Fishing started!" 출력
    std::cout << resultBattle << std::endl;  // "Battle started!" 출력

    return 0;  // 프로그램 종료
}

설명:

  1. GameModule 인터페이스:
    • 모든 게임 모듈은 GameModule 인터페이스를 상속받아야 합니다.
    • run() 함수는 각 모듈에서 명령어를 처리하는 함수로, 명령어를 받아서 해당 모듈이 실행할 작업을 정의합니다.
    • 예를 들어, "Fishing start" 명령어가 입력되면, FishingModule에서 "Fishing started!"라는 메시지를 반환합니다.
  2. GameCore 클래스:
    • GameCore 클래스는 게임의 핵심 로직을 담당합니다.
    • 게임 모듈을 등록하고, 사용자가 입력한 명령어를 처리하여, 해당 명령어를 실행할 모듈을 찾아 실행합니다.
    • registerModule() 함수로 모듈을 등록하고, handleCommand() 함수로 명령어를 처리합니다.
  3. 모듈 등록 및 명령어 처리:
    • FishingModuleBattleModule을 등록하고, "Fishing start" 및 "Battle start" 명령어를 처리하는 예시를 보여줍니다.
    • 명령어가 입력되면, GameCore는 해당 명령어 접두사를 기준으로 등록된 모듈을 찾아 실행합니다.
  4. 확장 가능성:
    • 이 구조를 통해, FishingModule, BattleModule 외에도 QuestModule, CraftingModule 등 다양한 게임 모듈을 추가할 수 있습니다.
    • 각 모듈은 GameModule 인터페이스를 상속받고 run() 함수를 구현하면 됩니다.

핵심 포인트:

  • GameCore는 게임의 중심 역할을 하며 모듈 시스템을 확장하여 다양한 게임 기능을 관리합니다.
  • 새로운 게임 모듈을 추가할 때마다 GameModule을 상속받고, run() 함수를 구현하여 손쉽게 기능을 추가할 수 있습니다.
  • 모듈 확장을 통해 Fishing, Battle 외에도 Quest 등 다양한 게임 로직을 추가할 수 있습니다.

이 포스팅은 모듈 시스템 확장게임 로직 추가의 기본 구조를 설명합니다. 각 모듈은 독립적으로 작동하며, GameCore를 통해 관리됩니다. 이 구조를 바탕으로 게임의 다양한 기능을 더욱 풍성하게 확장할 수 있습니다.


이제 이 글을 그대로 블로그에 올리시면 됩니다! 다음 단계로 넘어가시면, 더 많은 기능을 추가하는 방법에 대해 다룰 수 있습니다.