#include
#include
using namespace std;
int Monattack(int a)//몬스터에 따라 공격력 설정
{
int attack = 10 + (a+1)*7;
return attack;
}
int main()
{
enum E_STATE { E_IDLE = 0, E_MOVE_UP, E_MOVE_DOWN, E_MOVE_RIGHT, E_MOVE_LEFT, E_FIGHT };
enum E_FIGHTING { E_RUNAWAY, E_ATTACK, E_DEFENCE, E_MAGIC };
enum E_MONTYPE { E_ORC, E_DARKELF, E_TROLL, E_HUMAN, E_MAX };
E_STATE estate = E_IDLE;
E_MONTYPE montype = E_ORC;
int PHP = 100;
int Pcoordx = 0;
int Pcoordy = 0;
int Slect;
int MonHP[E_MAX];
int Moncoordx[E_MAX];
int Moncoordy[E_MAX];
int MonAttack[E_MAX];
int MonDefence[E_MAX];
int i;
int heart = 3;
srand(time(NULL));
rand();
for (int i = 0; i < E_MAX; i++)
{
MonHP[i] = 100;
Moncoordx[i] = 1 + i;
Moncoordy[i] = 0;
}
while (true)
{
system("cls");
cout << "목숨 : " << heart << endl;
cout << "현재 위치 : X(" << Pcoordx << ")Y(" << Pcoordy << ")" << endl;
cout << "몬스터" << montype << "위치 : " << "X축 : " << Moncoordx[montype] << " Y축 : " << Moncoordy[montype] << endl;
if (estate == E_IDLE)
{
cout << "입력하세요. (0.멈춤 1.전진 2. 후진 3. 오른쪽 4.왼쪽) :";
cin >> Slect;
cout << ".";
Sleep(200);
cout << ".";
Sleep(200);
cout << ".";
Sleep(200);
}
if (estate == E_IDLE)
{
switch (Slect)
{
case 0:
{
Pcoordx = 0;
Pcoordy = 0;
cout << "한턴 휴식" << endl;
}
break;
case 1:
{
Pcoordy += 1;
cout << "한칸 전진" << endl;
}
break;
case 2:
{
Pcoordy -= 1;
cout << "한칸 후진" << endl;
}
break;
case 3:
{
Pcoordx += 1;
cout << "한칸 오른쪽" << endl;
}
break;
case 4:
{
Pcoordx -= 1;
cout << "한칸 왼쪽" << endl;
}
break;
default:
{
cout << "강제로 한턴휴식" << endl;
}
break;
}
for (i = 0; i < E_MAX; i++)
{
if (Pcoordx == Moncoordx[i] && Pcoordy == Moncoordy[i])
{
switch (i)
{
case E_ORC:
cout << "오크를 만났다." << endl;
montype = E_ORC;
break;
case E_DARKELF:
cout << "다크엘프를 만났다." << endl;
montype = E_DARKELF;
break;
case E_TROLL:
cout << "트롤을 만났다." << endl;
montype = E_TROLL;
break;
case E_HUMAN:
cout << "도적을 만났다." << endl;
montype = E_HUMAN;
break;
}
estate = E_FIGHT;
}
}
}
else if (estate == E_FIGHT)
{
MonHP[montype];
PHP = 100;
while (PHP > 0 && MonHP[montype] > 0 && estate == E_FIGHT)
{
cout << "입력하세요. (0.도망 1.공격 2.방어 3.마법공격) : ";
cin >> Slect;
switch (Slect)
{
case E_RUNAWAY:
{
int Rand = rand() % 2;
if (Rand == 0)
{
cout << "도주 성공" << endl;
Pcoordx += 1;
estate = E_IDLE;
}
else if (Rand == 1)
{
cout << "도주 실패" << endl;
}
}
break;
case E_ATTACK:
{
cout << "공격" << endl;
PHP -= Monattack(montype);
MonHP[montype] -= ((rand() % 2 + 1) * 10 + 15);
}
break;
case E_DEFENCE:
{
cout << "방어" << endl;
PHP -= (Monattack(montype) * (1 - (80 / 100)));
MonHP[montype] -= 15;
}
break;
case E_MAGIC:
{
cout << "마법공격" << endl;
PHP -= Monattack(montype);
MonHP[montype] -= 25;
}
break;
default:
{
cout << "제대로 선택해주세요" << endl;
}
break;
}
if(PHP>=0&&MonHP[montype]>=0)
cout << "플레이어 HP : " << PHP << " 몬스터 HP : " << MonHP[montype] << endl;
}
if (MonHP[montype]<=0)
{
cout << "몬스터가 죽었습니다." << endl;
Sleep(1000);
estate = E_IDLE;
}
else if (PHP <= 0)
{
cout << "플레이어가 죽었습니다." << endl;
Sleep(1000);
estate = E_IDLE;
heart -= 1;
}
}
Sleep(500);
if (heart == 0)
{
cout << "하트가 없습니다.
게임을 종료합니다." << endl;
Sleep(500);
break;
}
}
cout << "게임 종료" << endl;
system("pause");
return 0;
}
몬스터에 따라서 공격력을 설정하는 함수를 사용을 했고, 플레이어가 죽었을때 하트를 1개씩 줄어들게 하고, 하트가 0일떄는 게임을 종료하게 했습니다.
실행할땐 잘됬는데 잘못된게 있거나 더 쉽게 코딩을 만들수 있으면 알려주세요..
안녕하세요 게임클래스 프로그래밍 강사 하민우 입니다.
온라인 강의 사이트 특성상 학생 한분 한분에 모든 분들의 코드를 전체적으로 확인하고 평가해 드리기에는 어려움이 있습니다.
프로그램을 작성하시는 중에 생각대로 작성이 잘 되지 않는 경우 또는 정상적으로 작동은 하지만 작성한 알고리즘에 대해서 정확하게 이해가 되지 않는 경우 등 필요하신 부분을 직접적으로 질문을 주셔야 해당 부분에 대해서 확인하고 답변을 드릴 수 있습니다.
그래도 아직까지는 코드양이 많지 않기 때문에 답변 드리도록 하겠습니다.
1. enum 문 같은 경우 보통은 함수 외부에 작성을 합니다.
- enum 문은 연속 된 값에 대한 정의문이라고 볼 수 있기 때문에 여러 함수 또는 클래스에서 사용 되도록 설계되는 경우가 많습니다. 그래서 당장 위에 작성하신 코드가 잘 못 된 것은 아니지만 일반적으로는 함수 내부에 이넘문을 작성하지는 않습니다.
- 이넘문을 통해서 몬스터 종류를 정의하고 있기 때문에 몬스터 공격력 함수의 매개 변수를 이넘문으로 사용하는 것이 이후 유지보수 및 가독성 부분에서 더 유리 합니다. 그리고 추가로 단순 매개 변수명이더라도 a b 이런식으로 이름을 짓지 마시고 의미 있는 단어를 사용하는 것이 좋습니다.
ex)
enum E_STATE { E_IDLE = 0, E_MOVE_UP, E_MOVE_DOWN, E_MOVE_RIGHT, E_MOVE_LEFT, E_FIGHT };
enum E_FIGHTING { E_RUNAWAY, E_ATTACK, E_DEFENCE, E_MAGIC };
enum E_MONTYPE { E_ORC, E_DARKELF, E_TROLL, E_HUMAN, E_MAX };
int Monattack(E_MONTYPE type)//몬스터에 따라 공격력 설정
{
int attack = 10 + ((int)type + 1) * 7;
return attack;
}
int main()
{
E_STATE estate = E_IDLE;
E_MONTYPE montype = E_ORC;
...
}
2. 줄간격과 띄어쓰기
- 코드는 가독성이 매우 중요 합니다. 알고리즘 별로 줄간격도 넣고 수식 사용시 띄어쓰기를 해주는 것이 좋습니다.
ex) if(PHP>=0&&MonHP[montype]>=0) -> if(PHP >= 0 && MonHP[montype] >= 0)
- 줄간격의 경우 2줄 이상 간격을 주게 되면 한 페이지에서 볼 수 있는 코드의 양이 줄기 때문에 1줄씩만 주는걸 추천 드립니다.
감사합니다.
게임 개발자가 되는 가장 빠른 길, 게임클래스!