게임의 전체 흐름
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 |