던전탈출rpg과제 총정리+학습

2026. 4. 29. 16:15·본캠프

게임의 전체 흐름

1.이름입력

2.hp,mp,공격력,방어력 총 입력

3.입력값 검사

4.캐릭터강화

6.직업 선택

7.던전입장

8.몬스터 전투

9.승리 시 아이템 획득

10.인벤토리 저장

11.인벤토리 확인 /포션제작/게임종료

 

사용한 헤더 파일

#include <iostream>  cout,cin,endl 사용
#include <string>       string 사용
#include <vector>      vector<Item>, vector<PotionRecipe> 사용

 

Step1

string name;

int stat[SIZE] = {0};

으로 입력받기

 

배열구조

stat[0] = HP
stat[1] = MP
stat[2] = 공격력
stat[3] = 방어력

 

Step2

입력 유효성 검사

잘못된 값을 입력하면 다시 입력받기 위해 와일문 사용

while (true)
{
    if (stat[0] >= 50 && stat[1] >= 50)
    {
        break;
    }
    cout << "다시 입력해주세요." << endl;
}

 

Step3

게임 시작전에 강화

while (!isGameStart)
{
    switch (choice)
    {
    case 1:
        stat[0] += 20;
        hpPotion--;
        break;
    case 0:
        isGameStart = true;
        break;
    }
}

 

Step4

개체지향시작

class Player
{
protected:     // 자식 클래스에서는 접근 가능하지만, main같은 외부에서는 접근할 수 없다
    string name;
    string job;
    int level;
    int hp;
    int mp;
    int power;
    int defence;
};

 

==>

job = "전사";
this->hp += 30;

 

player->hp; // 불가능

 

순수가상함수와 오버라이딩 //중요하다고 생각함

virtual void attack() = 0;

Player는 attack이라는 함수가 반드시 있어야 한다.
하지만 Player가 직접 공격 방식을 정하지 않는다.
자식 클래스가 반드시 구현해야 한다.

 

void attack() override
{
    cout << "* 파이어볼을 발사한다!" << endl;
}

순수 가상 함수는 부모의 강제 규칙, 오버라이딩은 자식의 실제 구현.

 

player포인터,다형성

Player* player = nullptr;
player = new Magician(name, stat[0], stat[1], stat[2], stat[3]);

 

플레이어 직업이 여러개이기 때문에 포인터를 씀

player = new Warrior(...);
player = new Magician(...);
player = new Thief(...);
player = new Archer(...);

 

->와.차이

player->getName();
monster.getName();

포인터는 화살표 ->, 일반 객체는 점 .

 

Step5

getter / setter 

getter // 값을 읽는 함수

int getHP()
{
    return hp;
}

 

setter // 값을 바꾸는 함수

void setHP(int hp)
{
    this->hp = hp;
}

 

전투 while문

while (player->getHP() > 0 && monster.getHP() > 0)

플레이어와 몬스터가 둘 다 살아 있는 동안 전투 반복.

 

Step6

Item 구조체

struct Item
{
    string name;
    int price;
    void PrintInfo() const
    {
        cout << name << " (" << price << "G)" << endl;
    }
};

 

인벤토리

vector<Item> inventory;

Item들을 여러 개 저장할 수 있는 동적 배열.

 

Step7

포션 제작소와 레시피 검색

PotionRecipe 구조체

struct PotionRecipe
{
    ...
};

 

vector<PotionRecipe> recipes;//레시피 저장

 

핵심

for (const PotionRecipe& recipe : recipes)  recipes안에 레시피를 하나씩 꺼내서 출력.

 

if (recipe.potionName == name) //이름으로 검색

 

bool found = false; // found변수 찾으면 ture

 

if (recipe.ingredient1 == ingredient || recipe.ingredient2 == ingredient)// 재료로 검색

재료1이 같거나 재료2가 같으면 검색 성공

 

Step8

메인 메뉴 중심으로 전체 기능을 연결

while (true)
{
    cout << "1. 던전 입장" << endl;
    cout << "2. 인벤토리 확인" << endl;
    cout << "3. 포션 제작소" << endl;
    cout << "0. 게임 종료" << endl;
    cin >> menuChoice;
    if (menuChoice == 1)
    {
        // 던전 입장 + 전투
    }
    else if (menuChoice == 2)
    {
        // 인벤토리 확인
    }
    else if (menuChoice == 3)
    {
        // 포션 제작소
    }
    else if (menuChoice == 0)
    {
        break;
    }
}

 

던전입장

if (dungeonChoice == 1)
{
    monster = Monster("슬라임", 30, 20, 10, "슬라임의 끈적한 젤리", 30);
}
else if (dungeonChoice == 2)
{
    monster = Monster("고블린", 50, 25, 15, "고블린의 이빨", 50);
}

던전 번호에 따라 다른 몬스터 객체를 만든다.

 

 

 

 

 

 

 

==================================================================

외울코드

==================================================================

입력반복

while (true)
{
    cin >> value;

    if (조건)
    {
        break;
    }
}

 

메뉴 반복

while (true)
{
    cin >> choice;

    if (choice == 0)
    {
        break;
    }
}

 

switch 메뉴

switch (choice)
{
case 1:
    break;

case 0:
    break;

default:
    break;
}

 

포인트 객체접근

player->getHP();

일반 객체접근

monster.getHP();

vector추가

inventory.push_back(item);

vector전체 출력

for (const Item& item : inventory)
{
    item.PrintInfo();
}

전투 반복

while (player->getHP() > 0 && monster.getHP() > 0)
{
}

데미지 계산

int damage = attackPower - defence;

if (damage <= 0)
{
    damage = 1;
}

 

개념                                      코드                                                                   의미

문자열 string name; 이름 저장
배열 int stat[SIZE]; 능력치 저장
무한 반복 while(true) 계속 반복
반복 탈출 break; 반복문 종료
조건문 if 조건 검사
그리고 && 둘 다 참
또는 `  
클래스 class Player 객체 설계도
구조체 struct Item 단순 데이터 묶음
상속 class Warrior : public Player Player 기능 물려받기
순수 가상 함수 virtual void attack() = 0; 자식에게 구현 강제
오버라이딩 void attack() override 자식이 함수 재정의
포인터 Player* player 객체 주소 저장
동적 생성 new Magician(...) 객체 생성
메모리 해제 delete player; 객체 삭제
포인터 접근 player->getHP() 포인터 멤버 접근
객체 접근 monster.getHP() 일반 객체 멤버 접근
vector vector<Item> inventory; 동적 배열
추가 push_back() vector에 저장
크기 size() 개수 확인
비었는지 empty() 비어 있는지 확인
전체 순회 for (const Item& item : inventory) 모든 요소 반복

 

 

 

햇갈리는 포인트

getter/setter

 

 

 

 

'본캠프' 카테고리의 다른 글

5/6 (개인프로젝트,과제2도전step8)  (0) 2026.05.06
4/30(코드카타)  (0) 2026.04.30
4/29(코드카타,과제2 step8)  (0) 2026.04.29
4/28 (코드카타,c++,과제1,과제2/step4)  (0) 2026.04.28
4/27(코드카타,발표)  (0) 2026.04.27
'본캠프' 카테고리의 다른 글
  • 5/6 (개인프로젝트,과제2도전step8)
  • 4/30(코드카타)
  • 4/29(코드카타,과제2 step8)
  • 4/28 (코드카타,c++,과제1,과제2/step4)
백구
백구
게임개발 공부블로그 입니다.
  • 백구
    백구 게임개발 스터디
    백구
  • 전체
    오늘
    어제
    • 분류 전체보기 (20) N
      • 사전캠프 (5)
      • 본캠프 (15) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
백구
던전탈출rpg과제 총정리+학습
상단으로

티스토리툴바