반응형
▶ 이전강의
- 바로가기
[C++] 13. TextRPG 함수화_1
▶ TextRPG강의- 바로가기 imenu; if (cin.fail()) { cin" data-og-host="lhy-info.tistory.com" data-og-source-url="https://lhy-info.tistory.com/entry/C-1-TextRPG%EB%A1%9C%EB%B9%84-%EB%A7%B5-%EC%BA%90%EB%A6%AD%ED%84%B0-%EB%AA%AC%EC%8A%A4%ED%84%B0%EC%A7%8
lhy-info.tistory.com
1. 레벨업 테이블 추가
...생략
struct _tagLevelUpStatus
{
int iAttackMin;
int iAttackMax;
int iArmorMin;
int iArmorMax;
int iHpMin;
int iHpMax;
int iMpMin;
int iMpMax;
};
//전역변수 선언
_tagLevelUpStatus g_tLvUpTable[JOB_END - 1] = {};
_tagLevelUpStatus CreateLvUpStatus(int iAttackMin, int iAttackMax, int iArmorMin, int iArmorMax, int iHpMin, int iHpMax, int iMpMin, int iMpMax)
{
//Job_End는 4이다 그런데 직업은 3개이므로 -1을 해주어 각 직업별로 생성하도록 함
_tagLevelUpStatus tLvUpTable = {};
tLvUpTable.iAttackMin = iAttackMin;
tLvUpTable.iAttackMax = iAttackMax;
tLvUpTable.iArmorMin = iArmorMin;
tLvUpTable.iArmorMax = iArmorMax;
tLvUpTable.iHpMin = iHpMin;
tLvUpTable.iHpMax = iHpMax;
tLvUpTable.iMpMin = iMpMin;
tLvUpTable.iMpMax = iMpMax;
return tLvUpTable;
}
int main()
{
srand((unsigned int)time(0));
bool bLoop = true;
//게임 시작할때 플레이어 정보 설정
_tagPlayer tPlayer = {};
//플레이어의 정보를 정의한다.
SetPlayer(&tPlayer);
//몬스터 생성
_tagMonster tMonsterArr[MT_BACK - 1] = {};
SetMonster(tMonsterArr);
//직업별 레벨업 상태 정보
g_tLvUpTable[JOB_KNIGHT - 1] = CreateLvUpStatus(4, 10, 8, 15, 50, 100, 10, 20);
g_tLvUpTable[JOB_ARCHER - 1] = CreateLvUpStatus(10, 15, 5, 10, 30, 60, 30, 50);
g_tLvUpTable[JOB_WIZARD - 1] = CreateLvUpStatus(15, 20, 3, 7, 20, 40, 50, 1000);
while (bLoop)
{
switch (OutputMainMenu())
{
case MM_MAP:
RunMap(&tPlayer, tMonsterArr);
break;
case MM_STORE:
break;
case MM_INVENTORY:
break;
case MM_EXIT:
bLoop = false;
break;
}
}
return 0;
}
...생략
2. 배틀 함수 추가
...생략
void Battle(_tagPlayer* pPlayer, _tagMonster* pMonster)
{
//플레이어가 공격
// 예를들어 min 5 Max15 일 경우
// 15 - 5 + 1을하면 11이 됨
// 11로 나눈 나머지는 0~10이 되고 여기에 min값인 5를 더하게 되면 5~15사이로 값이 나오게 됨
int iattackmin = pPlayer->iAttackMin;
int iattackmax = pPlayer->iAttackMax;
if (pPlayer->bEquip[EQ_WEAPON])
{
iattackmin += pPlayer->tEquip[EQ_WEAPON].iMin;
iattackmax += pPlayer->tEquip[EQ_WEAPON].iMax;
}
int iattack = rand() % ((iattackmax - iattackmin + 1) + iattackmin);
int iarmor = rand() % ((pMonster->iArmorMax - pMonster->iArmorMin + 1) + pMonster->iArmorMin);
int idamage = iattack - iarmor;
//삼항연산자 : 조건식 ? true일때값 : flase일때 값
idamage = idamage < 1 ? 1 : idamage;
//몬스터 hp를 감소시킨다
pMonster->iHp -= idamage;
cout << pPlayer->strName << " 가 " << pMonster->strName << " 에게 " << idamage << " 피해를 입혔습니다. " << endl;
//몬스터가 죽었을 경우
if (pMonster->iHp <= 0)
{
cout << pMonster->strName << " 몬스터가 사망하였습니다." << endl;
pPlayer->iExp += pMonster->iExp;
int igold = rand() % ((pMonster->iGoleMax - pMonster->iGoleMin + 1) + pMonster->iGoleMin);
pPlayer->tInventory.iGold += igold;
//몬스터 다시 부활
pMonster->iHp = pMonster->iHpMax;
pMonster->iMP = pMonster->iMPMax;
cout << pMonster->iExp << " 경험치를 획득하였습니다. " << endl;
cout << igold << " 골드를 획득하였습니다." << endl;
//레벨업을 했는지 체크
if (pPlayer->iExp >= g_iLevelUpEXP[pPlayer->iLevel - 1])
{
//레벨업에 필요한 만큼만 차감
pPlayer->iExp -= g_iLevelUpEXP[pPlayer->iLevel - 1];
//레벨업 처리
++pPlayer->iLevel;
cout << "레벨업 하셨습니다!" << endl;
//능력치 상승
int ijobindex = pPlayer->eJob - 1;
int hpup = rand() % ((g_tLvUpTable[ijobindex].iHpMax - g_tLvUpTable[ijobindex].iHpMin + 1) + g_tLvUpTable[ijobindex].iHpMin);
int mpup = rand() % ((g_tLvUpTable[ijobindex].iMpMax - g_tLvUpTable[ijobindex].iMpMin + 1) + g_tLvUpTable[ijobindex].iMpMin);
pPlayer->iAttackMin += g_tLvUpTable[ijobindex].iAttackMin;
pPlayer->iAttackMax += g_tLvUpTable[ijobindex].iAttackMax;
pPlayer->iArmorMax += g_tLvUpTable[ijobindex].iArmorMax;
pPlayer->iArmorMin += g_tLvUpTable[ijobindex].iArmorMin;
pPlayer->iHpMax += hpup;
pPlayer->iMPMax += mpup;
//체력과 마나를 회복 시킨다.
pPlayer->iHp = pPlayer->iHpMax;
pPlayer->iMP = pPlayer->iMPMax;
}
return;
}
//몬스터가 살아있다면 몬스터가 공격
iattack = rand() % ((pMonster->iAttackMax - pMonster->iAttackMin + 1) + pMonster->iAttackMin);
int iarmorkmin = pPlayer->iArmorMin;
int iarmormax = pPlayer->iArmorMax;
if (pPlayer->bEquip[EQ_ARMOR])
{
iattackmin += pPlayer->tEquip[EQ_ARMOR].iMin;
iattackmax += pPlayer->tEquip[EQ_ARMOR].iMax;
}
iarmor = rand() % ((iattackmax - iattackmin + 1) + iattackmin);
idamage = iattack - iarmor;
idamage = idamage <= 0 ? 0 : idamage;
//플레이어 데미지 받음
pPlayer->iHp -= idamage;
cout << pMonster->strName << " 가 " << pPlayer->strName << " 에게 " << idamage << " 피해를 입혔습니다. " << endl;
//몬스터가 죽었을 경우
if (pPlayer->iHp <= 0)
{
cout << pPlayer->strName << " 플레이어가 사망하였습니다." << endl;
int iexp = pPlayer->iExp * 0.1f;
int igold = pPlayer->tInventory.iGold * 0.1f;
pPlayer->iExp -= iexp;
pPlayer->tInventory.iGold -= igold;
cout << iexp << " 경험치를 잃었습니다. " << endl;
cout << igold << " 골드를 잃었습니다." << endl;
//플레이어의 hp와 mp를 회복한다
pPlayer->iHp = pPlayer->iHpMax;
pPlayer->iMP = pPlayer->iMPMax;
}
}
...생략
▶ 결과
▶ 전체코드
#include <time.h>
#include <iostream>
using namespace std;
enum MAIN_MENU
{
MM_NONE,
MM_MAP,
MM_STORE,
MM_INVENTORY,
MM_EXIT
};
enum MM_TYPE
{
MT_NONE,
MT_EASY,
MT_NORMAL,
MT_HARD,
MT_BACK
};
enum JOB
{
JOB_NONE,
JOB_KNIGHT,
JOB_ARCHER,
JOB_WIZARD,
JOB_END
};
enum EQUIP
{
EQ_WEAPON,
EQ_ARMOR,
EQ_MAX,
};
enum ITEM_TPYE
{
IT_NONE,
IT_WEAPON,
IT_ARMOR,
IT_BACK
};
enum BATTLE
{
BATTLE_NONE,
BATTLE_ATTACK,
BATTLE_BACK,
};
struct _tagLevelUpStatus
{
int iAttackMin;
int iAttackMax;
int iArmorMin;
int iArmorMax;
int iHpMin;
int iHpMax;
int iMpMin;
int iMpMax;
};
#define NAME_SIZE 32
#define ITEM_DESC_LENGTH 32
#define INVENTORY_MAX 20
#define STORE_WEAPON_MAX 3
#define STORE_ARMOR_MAX 3
#define LEVEL_MAX 10
const int g_iLevelUpEXP[LEVEL_MAX] = { 1000,2000,3000,4000, 5000,6000,7000,8000,9000,10000 };
_tagLevelUpStatus g_tLvUpTable[JOB_END - 1] = {};
struct _tagItem
{
char strName[NAME_SIZE];
char strTypeName[NAME_SIZE];
ITEM_TPYE eType;
int iMin;
int iMax;
int iPrice;
int iSell;
char strDesc[ITEM_DESC_LENGTH];
};
struct _tagInventory
{
_tagItem titem[INVENTORY_MAX];
int iItemCount;
int iGold;
};
struct _tagPlayer
{
char strName[NAME_SIZE];
char strJobNAME[NAME_SIZE];
JOB eJob;
int iAttackMin;
int iAttackMax;
int iArmorMin;
int iArmorMax;
int iHp;
int iHpMax;
int iMP;
int iMPMax;
int iExp;
int iLevel;
_tagItem tEquip[EQ_MAX];
bool bEquip[EQ_MAX];
_tagInventory tInventory;
};
struct _tagMonster
{
char strName[NAME_SIZE];
int iAttackMin;
int iAttackMax;
int iArmorMin;
int iArmorMax;
int iHp;
int iHpMax;
int iMP;
int iMPMax;
int iExp;
int iLevel;
int iGoleMin;
int iGoleMax;
};
//숫자르 입력받는다 입력 오류까지 처리 해주고 INT_MAX를 리턴하면 오류
int InputInt()
{
int iInput;
cin >> iInput;
if (cin.fail())
{
cin.clear();
cin.ignore(1024, '\n');
return INT_MAX;
}
return iInput;
}
//메인 메뉴를 화면에 보여주고 입력받은 메뉴 반환
// 입력 오류 혹은 잘못된 번호 입력 시 MM_NONE을 리턴
int OutputMainMenu()
{
//로비 구성
system("cls");
cout << "******로비******" << endl;
cout << "1. 맵" << endl;
cout << "2. 상점" << endl;
cout << "3. 가방" << endl;
cout << "4. 종료" << endl;
cout << "메뉴를 선택하세요! : ";
int iMenu = InputInt();
if (iMenu == INT_MAX || iMenu <= MM_NONE || iMenu > MM_EXIT)
{
return MM_NONE;
}
return iMenu;
}
int OutputMapMenu()
{
system("cls");
cout << "******맵******" << endl;
cout << "1. 쉬움" << endl;
cout << "2. 보통" << endl;
cout << "3. 어려움" << endl;
cout << "4. 뒤로가기" << endl;
cout << "난이도를 선택해 주세요 : ";
int iMenu = InputInt();
if (iMenu == INT_MAX || iMenu <= MT_NONE || iMenu > MT_BACK)
{
return MT_BACK;
}
return iMenu;
}
int SelectJob()
{
//직업 설정
int iJob = JOB_NONE;
while (iJob == JOB_NONE)
{
system("cls");
cout << "1. 기사" << endl;
cout << "2. 궁수" << endl;
cout << "3. 마법사" << endl;
cout << "직업을 선택하세요 : ";
iJob = InputInt();
if (iJob <= JOB_NONE || iJob >= JOB_END)
{
iJob = JOB_NONE;
}
}
return iJob;
}
void SetPlayer(_tagPlayer* pPlayer)
{
//이름 설정
cout << "이름 : ";
//끝까지 문자열을 다 채워버리면 null을 인식 못하기 때문
cin.getline(pPlayer->strName, NAME_SIZE - 1);
pPlayer->eJob = (JOB)SelectJob();
//직업 이름
pPlayer->iLevel = 1;
pPlayer->iExp = 0;
pPlayer->tInventory.iGold = 10000;
switch (pPlayer->eJob)
{
case JOB_KNIGHT:
strcpy_s(pPlayer->strJobNAME, "기사");
pPlayer->iAttackMin = 5;
pPlayer->iAttackMax = 10;
pPlayer->iArmorMin = 15;
pPlayer->iArmorMin = 20;
pPlayer->iHpMax = 500;
pPlayer->iHp = 500;
pPlayer->iMP = 100;
pPlayer->iMPMax = 100;
break;
case JOB_ARCHER:
strcpy_s(pPlayer->strJobNAME, "궁수");
pPlayer->iAttackMin = 10;
pPlayer->iAttackMax = 15;
pPlayer->iArmorMin = 10;
pPlayer->iArmorMin = 15;
pPlayer->iHpMax = 400;
pPlayer->iHp = 400;
pPlayer->iMP = 200;
pPlayer->iMPMax = 200;
break;
case JOB_WIZARD:
strcpy_s(pPlayer->strJobNAME, "마법사");
pPlayer->iAttackMin = 15;
pPlayer->iAttackMax = 20;
pPlayer->iArmorMin = 5;
pPlayer->iArmorMin = 10;
pPlayer->iHpMax = 300;
pPlayer->iHp = 300;
pPlayer->iMP = 300;
pPlayer->iMPMax = 300;
break;
}
}
//몬스터 생성
_tagMonster CreateMonster(const char* pName, int iAttackMin, int iAttackMax, int iArmorMin, int ArmorMax, int iHP, int iMP, int iLevel, int iExp, int iGoldMin, int IGoldMax)
{
_tagMonster tMonster = {};
strcpy_s(tMonster.strName, pName);
tMonster.iAttackMin = iAttackMin;
tMonster.iAttackMax = iAttackMax;
tMonster.iArmorMin = iArmorMin;
tMonster.iArmorMax = ArmorMax;
tMonster.iHp = iHP;
tMonster.iHpMax = iHP;
tMonster.iMP = iMP;
tMonster.iMPMax = iMP;
tMonster.iLevel = iLevel;
tMonster.iExp = iExp;
tMonster.iGoleMin = iGoldMin;
tMonster.iGoleMax = IGoldMax;
return tMonster;
}
void SetMonster(_tagMonster* pMonsterArr)
{
pMonsterArr[0] = CreateMonster("고블린", 20, 30, 2, 5, 100, 10, 1, 1000, 500, 1500);
pMonsterArr[1] = CreateMonster("트롤", 80, 130, 60, 90, 2000, 100, 5, 7000, 6000, 8000);
pMonsterArr[2] = CreateMonster("드래곤", 250, 500, 200, 400, 30000, 20000, 10, 30000, 20000, 3000);
}
void OutputBattleTag(int iMenu)
{
switch (iMenu)
{
case MT_EASY:
cout << "********* 쉬움 *********" << endl;
break;
case MT_NORMAL:
cout << "********* 보통 *********" << endl;
break;
case MT_HARD:
cout << "********* 어려움 *********" << endl;
break;
}
}
void OutputMonster(_tagMonster* pMonster)
{
//몬스터 정보 출력
cout << "********* Monster *********" << endl;
cout << "이름 : " << pMonster->strName << endl;
cout << "레벨 : " << pMonster->iLevel << "\t획득 경험치 : " << pMonster->iExp << endl;
cout << "공격력 : " << pMonster->iAttackMax << " / " << pMonster->iAttackMax << endl;
cout << "방어력 : " << pMonster->iArmorMax << " / " << pMonster->iArmorMax << endl;
cout << "체력 : " << pMonster->iHp << " / " << pMonster->iHpMax << endl;
cout << "마나 : " << pMonster->iMP << " / " << pMonster->iMPMax << endl;
cout << "보유 골드 : " << pMonster->iGoleMin << " / " << pMonster->iGoleMax << endl;
}
void OutputPlayer(_tagPlayer* pPlayer)
{
//플레이어 정보
cout << "********* Player *********" << endl;
cout << "이름 : " << pPlayer->strName << "\t직업 : " << pPlayer->strJobNAME << endl;
cout << "레벨 : " << pPlayer->iLevel << "\t경험치 : " << pPlayer->iExp << " / " << g_iLevelUpEXP[pPlayer->iLevel - 1] << endl;
//무기를 장착하고 이씅ㄹ 경우 공격력에 무기공격력을 추가하여 출력
if (pPlayer->bEquip[EQ_WEAPON] == true)
{
cout << "공격력 : " << pPlayer->iAttackMin << " + " << pPlayer->tEquip[EQ_WEAPON].iMin << " - " << pPlayer->iAttackMax << " + " << pPlayer->tEquip[EQ_WEAPON].iMax << endl;
}
else
{
cout << "공격력 : " << pPlayer->iAttackMin << " / " << pPlayer->iAttackMax << endl;
}
//방어구 장착 시
if (pPlayer->bEquip[EQ_ARMOR] == true)
{
cout << "방어력 : " << pPlayer->iArmorMin << " + " << pPlayer->tEquip[EQ_ARMOR].iMin << " - " << pPlayer->iArmorMax << " + " << pPlayer->tEquip[EQ_ARMOR].iMax << endl;
}
else
{
cout << "방어력 : " << pPlayer->iArmorMin << " / " << pPlayer->iArmorMax << endl;
}
cout << "체력 : " << pPlayer->iHp << " / " << pPlayer->iHpMax << endl;
cout << "마나 : " << pPlayer->iMP << " / " << pPlayer->iMPMax << endl;
cout << "보유 골드 : " << pPlayer->tInventory.iGold << endl;
}
int OutputBattleMenu()
{
cout << "1. 공격" << endl;
cout << "2. 도망가기" << endl;
cout << "메뉴를 선택해 주세요 : ";
int iMenu = InputInt();
if (iMenu == INT_MAX || iMenu <= BATTLE_NONE || iMenu > BATTLE_BACK)
{
return BATTLE_NONE;
}
return iMenu;
}
void Battle(_tagPlayer* pPlayer, _tagMonster* pMonster)
{
//플레이어가 공격
// 예를들어 min 5 Max15 일 경우
// 15 - 5 + 1을하면 11이 됨
// 11로 나눈 나머지는 0~10이 되고 여기에 min값인 5를 더하게 되면 5~15사이로 값이 나오게 됨
int iattackmin = pPlayer->iAttackMin;
int iattackmax = pPlayer->iAttackMax;
if (pPlayer->bEquip[EQ_WEAPON])
{
iattackmin += pPlayer->tEquip[EQ_WEAPON].iMin;
iattackmax += pPlayer->tEquip[EQ_WEAPON].iMax;
}
int iattack = rand() % ((iattackmax - iattackmin + 1) + iattackmin);
int iarmor = rand() % ((pMonster->iArmorMax - pMonster->iArmorMin + 1) + pMonster->iArmorMin);
int idamage = iattack - iarmor;
//삼항연산자 : 조건식 ? true일때값 : flase일때 값
idamage = idamage < 1 ? 1 : idamage;
//몬스터 hp를 감소시킨다
pMonster->iHp -= idamage;
cout << pPlayer->strName << " 가 " << pMonster->strName << " 에게 " << idamage << " 피해를 입혔습니다. " << endl;
//몬스터가 죽었을 경우
if (pMonster->iHp <= 0)
{
cout << pMonster->strName << " 몬스터가 사망하였습니다." << endl;
pPlayer->iExp += pMonster->iExp;
int igold = rand() % ((pMonster->iGoleMax - pMonster->iGoleMin + 1) + pMonster->iGoleMin);
pPlayer->tInventory.iGold += igold;
//몬스터 다시 부활
pMonster->iHp = pMonster->iHpMax;
pMonster->iMP = pMonster->iMPMax;
cout << pMonster->iExp << " 경험치를 획득하였습니다. " << endl;
cout << igold << " 골드를 획득하였습니다." << endl;
//레벨업을 했는지 체크
if (pPlayer->iExp >= g_iLevelUpEXP[pPlayer->iLevel - 1])
{
//레벨업에 필요한 만큼만 차감
pPlayer->iExp -= g_iLevelUpEXP[pPlayer->iLevel - 1];
//레벨업 처리
++pPlayer->iLevel;
cout << "레벨업 하셨습니다!" << endl;
//능력치 상승
int ijobindex = pPlayer->eJob - 1;
int hpup = rand() % ((g_tLvUpTable[ijobindex].iHpMax - g_tLvUpTable[ijobindex].iHpMin + 1) + g_tLvUpTable[ijobindex].iHpMin);
int mpup = rand() % ((g_tLvUpTable[ijobindex].iMpMax - g_tLvUpTable[ijobindex].iMpMin + 1) + g_tLvUpTable[ijobindex].iMpMin);
pPlayer->iAttackMin += g_tLvUpTable[ijobindex].iAttackMin;
pPlayer->iAttackMax += g_tLvUpTable[ijobindex].iAttackMax;
pPlayer->iArmorMax += g_tLvUpTable[ijobindex].iArmorMax;
pPlayer->iArmorMin += g_tLvUpTable[ijobindex].iArmorMin;
pPlayer->iHpMax += hpup;
pPlayer->iMPMax += mpup;
//체력과 마나를 회복 시킨다.
pPlayer->iHp = pPlayer->iHpMax;
pPlayer->iMP = pPlayer->iMPMax;
}
return;
}
//몬스터가 살아있다면 몬스터가 공격
iattack = rand() % ((pMonster->iAttackMax - pMonster->iAttackMin + 1) + pMonster->iAttackMin);
int iarmorkmin = pPlayer->iArmorMin;
int iarmormax = pPlayer->iArmorMax;
if (pPlayer->bEquip[EQ_ARMOR])
{
iattackmin += pPlayer->tEquip[EQ_ARMOR].iMin;
iattackmax += pPlayer->tEquip[EQ_ARMOR].iMax;
}
iarmor = rand() % ((iattackmax - iattackmin + 1) + iattackmin);
idamage = iattack - iarmor;
idamage = idamage <= 0 ? 0 : idamage;
//플레이어 데미지 받음
pPlayer->iHp -= idamage;
cout << pMonster->strName << " 가 " << pPlayer->strName << " 에게 " << idamage << " 피해를 입혔습니다. " << endl;
//몬스터가 죽었을 경우
if (pPlayer->iHp <= 0)
{
cout << pPlayer->strName << " 플레이어가 사망하였습니다." << endl;
int iexp = pPlayer->iExp * 0.1f;
int igold = pPlayer->tInventory.iGold * 0.1f;
pPlayer->iExp -= iexp;
pPlayer->tInventory.iGold -= igold;
cout << iexp << " 경험치를 잃었습니다. " << endl;
cout << igold << " 골드를 잃었습니다." << endl;
//플레이어의 hp와 mp를 회복한다
pPlayer->iHp = pPlayer->iHpMax;
pPlayer->iMP = pPlayer->iMPMax;
}
}
void RunBattle(_tagPlayer* pPlayer, _tagMonster* pMonsterArr, int iMenu)
{
_tagMonster tMonster = pMonsterArr[iMenu - 1];
while (true)
{
system("cls");
OutputBattleTag(iMenu);
//플레이어 정보
OutputPlayer(pPlayer);
//몬스터 출력
OutputMonster(&tMonster);
switch (OutputBattleMenu())
{
case BATTLE_ATTACK:
Battle(pPlayer, &tMonster);
system("pause");
break;
case BATTLE_BACK:
return;
}
}
}
void RunMap(_tagPlayer* pPlayer, _tagMonster* tMonsterArr)
{
while (true)
{
int iMenu = OutputMapMenu();
if (iMenu == INT_MAX || iMenu <= MT_NONE || iMenu >= MT_BACK)
{
return;
}
//전투 시작
RunBattle(pPlayer, tMonsterArr, iMenu);
}
}
_tagLevelUpStatus CreateLvUpStatus(int iAttackMin, int iAttackMax, int iArmorMin, int iArmorMax, int iHpMin, int iHpMax, int iMpMin, int iMpMax)
{
//Job_End는 4이다 그런데 직업은 3개이므로 -1을 해주어 각 직업별로 생성하도록 함
_tagLevelUpStatus tLvUpTable = {};
tLvUpTable.iAttackMin = iAttackMin;
tLvUpTable.iAttackMax = iAttackMax;
tLvUpTable.iArmorMin = iArmorMin;
tLvUpTable.iArmorMax = iArmorMax;
tLvUpTable.iHpMin = iHpMin;
tLvUpTable.iHpMax = iHpMax;
tLvUpTable.iMpMin = iMpMin;
tLvUpTable.iMpMax = iMpMax;
return tLvUpTable;
}
int main()
{
srand((unsigned int)time(0));
bool bLoop = true;
//게임 시작할때 플레이어 정보 설정
_tagPlayer tPlayer = {};
//플레이어의 정보를 정의한다.
SetPlayer(&tPlayer);
//몬스터 생성
_tagMonster tMonsterArr[MT_BACK - 1] = {};
SetMonster(tMonsterArr);
//직업별 레벨업 상태 정보
g_tLvUpTable[JOB_KNIGHT - 1] = CreateLvUpStatus(4, 10, 8, 15, 50, 100, 10, 20);
g_tLvUpTable[JOB_ARCHER - 1] = CreateLvUpStatus(10, 15, 5, 10, 30, 60, 30, 50);
g_tLvUpTable[JOB_WIZARD - 1] = CreateLvUpStatus(15, 20, 3, 7, 20, 40, 50, 1000);
while (bLoop)
{
switch (OutputMainMenu())
{
case MM_MAP:
RunMap(&tPlayer, tMonsterArr);
break;
case MM_STORE:
break;
case MM_INVENTORY:
break;
case MM_EXIT:
bLoop = false;
break;
}
}
return 0;
}
반응형
'C++ > C++입문' 카테고리의 다른 글
[C++] 13. TextRPG 함수화_1 (0) | 2025.04.14 |
---|---|
[C++] 12. 빙고게임 함수화 (0) | 2025.04.11 |
[C++] 11. 함수와 변수 (0) | 2025.04.10 |
[C++] 10. 이중포인터 (0) | 2025.04.09 |
[C++] 9. Char, 구조체, void 포인터 (0) | 2025.04.09 |