main()
├── EnterLobby() // 로비 진입
│ ├── CreatePlayer() // 플레이어 생성
│ ├── PrintStatInfo() // 플레이어 스탯 출력
│ └── EnterGame() // 게임 시작
│ ├── CreateMonsters() // 몬스터 생성
│ ├── PrintStatInfo() // 몬스터 정보 출력
│ ├── EnterBattle() // 전투 진행
│ └── PrintMessage() // 게임 메시지 출력
💡 핵심 개념 정리
*): 메모리 주소를 직접 다뤄 데이터 변경 가능 &): 복사 없이 원본 데이터 참조 가능, const와 함께 안전하게 사용 []): 여러 개의 동일한 데이터 저장, 포인터처럼 전달 가능 StatInfo 구조체struct StatInfo {
int hp = 0;
int attack = 0;
int defence = 0;
};
*) 또는 참조(&)로 전달하여 사용CreatePlayer(StatInfo* playerInfo) - 포인터 활용void CreatePlayer(StatInfo* playerInfo) {
bool ready = false;
while (!ready) {
PrintMessage("캐릭터 생성창");
PrintMessage("[1] 기사 [2] 궁수 [3] 법사");
cout << "> ";
int input;
cin >> input;
switch (input) {
case PT_Knight:
playerInfo->hp = 100;
playerInfo->attack = 10;
playerInfo->defence = 5;
ready = true;
break;
case PT_Archer:
playerInfo->hp = 80;
playerInfo->attack = 15;
playerInfo->defence = 3;
ready = true;
break;
case PT_Mage:
playerInfo->hp = 50;
playerInfo->attack = 25;
playerInfo->defence = 1;
ready = true;
break;
}
}
}
✅ 분석
StatInfo* playerInfo → 포인터를 통해 직접 데이터 수정playerInfo->hp = 100; → 포인터(->)를 이용해 멤버 변수 접근📍함수 호출 방식
StatInfo playerInfo;
CreatePlayer(&playerInfo); // playerInfo의 주소를 전달
&playerInfo → 포인터로 주소를 전달하면 값이 복사되지 않고 직접 수정 가능PrintStatInfo(const char* name, const StatInfo& info) - 참조 활용void PrintStatInfo(const char* name, const StatInfo& info) {
cout << "*****************************\n";
cout << name << " : HP = " << info.hp
<< ", ATT = " << info.attack
<< ", DEF = " << info.defence << '\n';
cout << "*****************************\n";
}
✅ 분석
const StatInfo& info → 참조(&)를 사용하여 복사 없이 접근const 사용 → 함수 내에서 info 값 변경 불가능 (안전한 접근)📍함수 호출 방식
PrintStatInfo("Player", playerInfo);
playerInfo가 복사되지 않고 직접 참조되므로 메모리 절약 효과가 있음CreateMonsters(StatInfo monsterInfo[], int count) - 배열 활용void CreateMonsters(StatInfo monsterInfo[], int count) {
for (int i = 0; i < count; i++) {
int randValue = (rand() % 3) + 1;
switch (randValue) {
case MT_Slime:
monsterInfo[i].hp = 30;
monsterInfo[i].attack = 5;
monsterInfo[i].defence = 1;
break;
case MT_Orc:
monsterInfo[i].hp = 40;
monsterInfo[i].attack = 8;
monsterInfo[i].defence = 2;
break;
case MT_Skeleton:
monsterInfo[i].hp = 50;
monsterInfo[i].attack = 15;
monsterInfo[i].defence = 3;
break;
}
}
}
✅ 분석
StatInfo monsterInfo[] → 배열을 함수에 전달할 때 포인터처럼 동작monsterInfo[i] → 배열 요소 접근 가능📍함수 호출 방식
StatInfo monsterInfo[2];
CreateMonsters(monsterInfo, 2);
monsterInfo)은 첫 번째 요소의 주소를 나타냄EnterBattle(StatInfo* playerInfo, StatInfo* monsterInfo) - 포인터 활용bool EnterBattle(StatInfo* playerInfo, StatInfo* monsterInfo) {
while (true) {
int damage = playerInfo->attack - monsterInfo->defence;
if (damage < 0) damage = 0;
monsterInfo->hp -= damage;
if (monsterInfo->hp < 0) monsterInfo->hp = 0;
PrintStatInfo("Monster ", *monsterInfo);
if (monsterInfo->hp == 0) {
PrintMessage("몬스터를 처치했습니다!");
return true;
}
damage = monsterInfo->attack - playerInfo->defence;
if (damage < 0) damage = 0;
playerInfo->hp -= damage;
if (playerInfo->hp < 0) playerInfo->hp = 0;
PrintStatInfo("Player ", *playerInfo);
if (playerInfo->hp == 0) {
PrintMessage("사망 했습니다!");
return false;
}
}
}
✅ 분석
StatInfo* playerInfo, StatInfo* monsterInfo → 포인터로 구조체 전달hp 값을 수정 가능 (*playerInfo와 *monsterInfo를 사용)PrintStatInfo("Player", *playerInfo); → 참조(*playerInfo)를 사용해 데이터 출력