제 목 rpg겜 만들기 평가해주세요
작성자 조성원 등록날짜 2021-10-11 17:17:15 / 조회수 : 356
강좌명 [단과] 게임 프로그래밍 기초 C++ Part.1
  • #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일떄는 게임을 종료하게 했습니다. 

    실행할땐 잘됬는데 잘못된게 있거나 더 쉽게 코딩을 만들수 있으면 알려주세요..

  • 작성자 : 게임클래스 / 등록날짜 : 2021-10-12 11:37:53
  • 안녕하세요 게임클래스 프로그래밍 강사 하민우 입니다.

     

    온라인 강의 사이트 특성상 학생 한분 한분에 모든 분들의 코드를 전체적으로 확인하고 평가해 드리기에는 어려움이 있습니다.

    프로그램을 작성하시는 중에 생각대로 작성이 잘 되지 않는 경우 또는 정상적으로 작동은 하지만 작성한 알고리즘에 대해서 정확하게 이해가 되지 않는 경우 등 필요하신 부분을 직접적으로 질문을 주셔야 해당 부분에 대해서 확인하고 답변을 드릴 수 있습니다.

     

    그래도 아직까지는 코드양이 많지 않기 때문에 답변 드리도록 하겠습니다.

    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줄씩만 주는걸 추천 드립니다.

     

    감사합니다.

    게임 개발자가 되는 가장 빠른 길, 게임클래스!