C++ Rookiss Part1 C++ 프로그래밍 입문 : TextRPG
🙇♀️TextRPG
🪐열거형
- #이 붙은거 -> 전처리 지시문
- #include
이라는 파일을 찾아서 해당 내용을 그냥 복붙! 1) 전처리 2) 컴파일 3) 링크
#define DEFINE_SCISSORS 1
#define DEFINE_TEST cout << "Hello world" << endl;
🪐레지스터 정리
- EAX (AX,AH,AL) - 누적연산기, 곱셈과 나눗셈 연산에서 자동으로 사용
- EBX (BX,BH,BL) - 베이스 레지스터, 특정 주소를 지정
- ECX (CX,CH,CL) - 수를 세아림, 자동으로 루프 카운터됨(반복적인 명령을 수행시)
- EDX (DX,DHT,DL) - 데이터 레지스터, 입출력 연산에서 반드시 간접 주소 지정에 사용
- ESI (SI) - 읽기 인덱스, 문자열 전송이나 비교에서 사용되는데 주로 소스 문자열의 오프셋을 가리킴
-
EDI (DI) - 쓰기 인덱스
- EBP (BP) - 베이스 포인터, 스택의 데이터에 접근하기 위해 사용
- ESP (SP) - 스택 포인터, 현재까지 사용된 스택의 위치를 저장, 스택 최상부의 오프셋을 가리킴
- EIP - 명령어 포인터 레지스터, 실행할 다음 명령어의 주소를 포함
- EFLAGS - CPU의 동작을 제어하거나 CPU연산의 결과를 반영
🪐TextRPG
#include <iostream>
using namespace std;
// 오늘의 주제 : TextRPG
enum PlayerType
{
PT_Knight = 1,
PT_Archer = 2,
PT_Mage = 3,
};
enum MonsterType
{
MT_Slime = 1,
MT_Orc = 2,
MT_Skeleton = 3,
};
struct ObjectInfo
{
int type;
int hp;
int attack;
int defence;
};
ObjectInfo playerInfo;
ObjectInfo monsterInfo;
void EnterLobby();
void SelectPlayer();
void EnterField();
void CreateRandomMonster();
void EnterBattle();
int main()
{
// 랜덤 시드 설정
srand(time(0));
EnterLobby();
return 0;
}
void EnterLobby()
{
while (true)
{
cout << "_____________________" << endl;
cout << "로비에 입장했습니다!" << endl;
cout << "---------------------" << endl;
// 플레이어 직업 선택
SelectPlayer();
cout << "____________________________" << endl;
cout << "(1) 필드 입장 (2) 게임 종료" << endl;
cout << "----------------------------" << endl;
int input;
cin >> input;
if (input == 1)
{
EnterField();
}
else
{
return;
}
}
}
void SelectPlayer()
{
while (true)
{
cout << "_____________________" << endl;
cout << "직업을 골라주세요!" << endl;
cout << "(1) 기사 (2) 궁수 (3) 법사!" << endl;
cout << "> ";
cin >> playerInfo.type;
if (playerInfo.type == PT_Knight)
{
cout << "기사 생성중... !" << endl;
playerInfo.hp = 150;
playerInfo.attack = 10;
playerInfo.defence = 5;
break;
}
else if (playerInfo.type == PT_Archer)
{
cout << "궁수 생성중... !" << endl;
playerInfo.hp = 100;
playerInfo.attack = 15;
playerInfo.defence = 3;
break;
}
else if (playerInfo.type == PT_Mage)
{
cout << "법사 생성중... !" << endl;
playerInfo.hp = 80;
playerInfo.attack = 20;
playerInfo.defence = 0;
break;
}
}
}
void EnterField()
{
while (true)
{
cout << "_____________________" << endl;
cout << "필드에 입장했습니다!" << endl;
cout << "---------------------" << endl;
cout << "[PLAYER HP : " << playerInfo.hp << " / ATT : " << playerInfo.attack << " / DEF : " << playerInfo.defence << endl;
CreateRandomMonster();
cout << "____________________" << endl;
cout << "(1) 전투 (2) 도주" << endl;
cout << "> ";
int input;
cin >> input;
if (input == 1)
{
EnterBattle();
if (playerInfo.hp == 0)
return;
}
else
{
return;
}
}
}
void CreateRandomMonster()
{
// 1~3
monsterInfo.type = 1 + ( rand() % 3 );
switch (monsterInfo.type)
{
case MT_Slime:
cout << "슬라임 생성중... ! (HP:15 / ATT:5 / DEF:0)" << endl;
monsterInfo.hp = 15;
monsterInfo.attack = 5;
monsterInfo.defence = 0;
break;
case MT_Orc:
cout << "오크 생성중... ! (HP:40 / ATT:10 / DEF:3)" << endl;
monsterInfo.hp = 40;
monsterInfo.attack = 10;
monsterInfo.defence = 3;
break;
case MT_Skeleton:
cout << "스켈레톤 생성중... ! (HP:80 / ATT:15 / DEF:5)" << endl;
monsterInfo.hp = 80;
monsterInfo.attack = 15;
monsterInfo.defence = 5;
break;
}
}
void EnterBattle()
{
while (true)
{
int damage = playerInfo.attack - monsterInfo.defence;
if (damage < 0)
damage = 0;
// 선빵
monsterInfo.hp -= damage;
if (monsterInfo.hp < 0)
monsterInfo.hp = 0;
cout << "몬스터 남은 체력 : " << monsterInfo.hp << endl;
if (monsterInfo.hp == 0)
{
cout << "몬스터를 처치했습니다!" << endl;
return;
}
damage = monsterInfo.attack - playerInfo.defence;;
if (damage < 0)
damage = 0;
// 반격
playerInfo.hp -= damage;
if (playerInfo.hp < 0)
playerInfo.hp = 0;
cout << "플레이어 남은 체력 : " << playerInfo.hp << endl;
if (playerInfo.hp == 0)
{
cout << "당신은 사망했습니다... GAME OVER" << endl;
return;
}
}
}