오늘 거의 하루를 상태창 구현하기 과제에 매달렸다.

 

개발 프로세스 가이드에는

1 요구사항 분석 및 설계 -> 2 코드 작성 및 구현 -> 3 테스트 및 디버깅 순서로 가이드 되어 있었다

 

아직 강의도 덜 듣고 개념이 다 잡혀져있지 않은 상태에서 해도 되나 싶었는데

생각해보니 아무리 머리에 집어 넣는다고 한들 해보지 않으면 코딩이 체화 되지 않을 것 같아서

일단 부딪히자는 생각으로 그냥 뛰어들었다.

 

구글링과 AI, 그간 배운 내용에 대한 메모들을 총동원하여 코드를 짜보기 시작했다.

 

사실 뭔가 강의를 듣거나 혼자 공부하는 것보다 직접 코드 짜보고 뜯는 과정에서 얻은 배움이 더 많음을 느꼈다.

이게 생소한 단어와 문장들을 강의로 듣는 것보다 눈으로 익히고 만져보는 경험이 더 큰 것을 해보면서 느꼈다.

 

백문이 불여일견이라고 했나.

그래서 필수기능 가이드와 그동안 어깨너머로 봐왔던 내용을 토대로 작업을 시작했다.

 

[필수기능 가이드]

  • HP, MP, 공격력, 방어력을 크기 4의 int형 배열로 선언 및 0으로 초기화합니다.
  • (배열 이름이 status라면 status[0]은 체력, status[3]은 방어력)
  • HP와 MP를 입력받고, HP나 MP가 하나라도 50 이하의 숫자를 입력받을 경우 다시 입력받습니다.
  • HP와 MP에 값을 입력받은 후 공격력과 방어력을 입력받습니다. 공격력이나 방어력이 하나라도 0 이하의 숫자를 입력받을 경우 다시 입력 받습니다.
  • 스탯 관리 시스템을 시작합니다.
      1. HP 회복 2. MP 회복 3. HP 강화 4. MP 강화 5. 공격 스킬 사용 6. 필살기 사용
    • 선택지를 출력한 후, int형 정수 하나를 입력받아서 해당 선택지를 실행합니다.
  • call by pointer를 사용해봅시다. HP, MP포션은 5개씩 기본 지급되며, HP, MP 포션 개수로 5를 저장합니다. 함수는 다음과 같이 정의합니다.
  • void setPotion(int count, int* p_HPPotion, int* p_MPPotion)
  • 1, 2번을 선택시 각각 HP/MP가 20 증가하고, 포션의 개수가 1개씩 차감됩니다. 포션이 0개일 경우 사용할 수 없습니다.
  • 3, 4번을 선택시 각각 HP/ MP가 2배씩 증가합니다. 이 연산은 두가지 방법이 있으니 잘 생각해보시길 바랍니다.
  • 5번 선택시 MP가 50 차감됩니다

그리고 완성된 코드는 아래와 같다.

주석을 통해 내가 배운 개념을 내 언어로 쓰면서 상기시킬 수 있도록 하였고

완전히 0부터 스스로 다 작성할 수 있도록 반복하는 시간을 가지고자 한다. 


#include <iostream> // 입출력 기능을 사용하기 위해 포함
using namespace std; // std:: 생략하고 cout, cin 바로 쓰기 위해

// ✅ 전역 변수 선언 (어디서든 접근 가능)
int stats[4] = { 0 };  // [0]=HP, [1]=MP, [2]=공격력, [3]=방어력
int HPPotion = 0;      // HP 포션 개수
int MPPotion = 0;      // MP 포션 개수

// ✅ 함수 정의 (포션 개수 설정 함수)
// - 포인터(*)를 사용해서 호출한 쪽 변수에 값을 직접 넣어줌
void setPotion(int count, int* p_HPPotion, int* p_MPPotion) {
    *p_HPPotion = count; // 포인터를 통해 원래 변수에 접근
    *p_MPPotion = count;
}

// ✅ main 함수: 프로그램이 시작되는 곳
int main()
{
    // HP와 MP 입력받기 (50 이상이어야 함)
    while (1) // 무한 반복 → 조건 충족하면 break로 탈출
    {
        cout << "HP와 MP를 입력해주세요: ";
        cin >> stats[0] >> stats[1]; // 배열로 관리 (stats[0]=HP, stats[1]=MP)

        if (stats[0] > 50 && stats[1] > 50) {
            break; // 조건 충족 → 반복문 탈출
        }
        cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
    }

    // 공격력과 방어력 입력받기 (0 초과여야 함)
    while (1)
    {
        cout << "공격력과 방어력을 입력해주세요: ";
        cin >> stats[2] >> stats[3];

        if (stats[2] > 0 && stats[3] > 0)
        {
            break; // 조건 충족 시 탈출
        }
        cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
    }

    int choice = 0; // 메뉴 선택 번호

    // 포션 지급 (함수 호출 예시)
    setPotion(5, &HPPotion, &MPPotion);

    cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
    cout << "=============================================" << endl;
    cout << "<스탯 관리 시스템>" << endl;

    // ✅ 메인 루프: 사용자가 종료(7) 선택할 때까지 반복
    while (1)
    {
        // 현재 상태 출력
        cout << "\n1. HP 회복 2. MP 회복 3. HP 강화 4. MP 강화" << endl;
        cout << "5. 공격 스킬 6. 필살기 7. 프로그램 종료" << endl;
        cout << "현재 상태: HP(" << stats[0] << ") / MP(" << stats[1]
            << ") / 공격력(" << stats[2] << ") / 방어력(" << stats[3] << ")" << endl;
        cout << "남은 포션: HP(" << HPPotion << "개), MP(" << MPPotion << "개)" << endl;
        cout << "번호를 선택해주세요: ";
        cin >> choice;

        // 7번 → 프로그램 종료
        if (choice == 7) {
            cout << "프로그램을 종료합니다." << endl;
            break;
        }

        // ✅ switch문: 입력된 번호(choice)에 따라 동작 분기
        switch (choice)
        {
        case 1: // HP 회복
            if (HPPotion <= 0) { // 포션이 없으면
                cout << "포션이 부족합니다." << endl;
                continue; // 아래 실행 건너뛰고 다음 루프로 이동
            }
            stats[0] += 20; // HP +20
            HPPotion--;    // 포션 1개 소모
            cout << "* HP가 20 회복되었습니다. 포션이 1개 차감됩니다." << endl;
            cout << "현재 HP: " << stats[0] << endl;
            cout << "남은 포션 수: " << HPPotion << endl;
            break;

        case 2: // MP 회복
            if (MPPotion <= 0) {
                cout << "포션이 부족합니다." << endl;
                continue;
            }
            stats[1] += 20; // MP +20
            MPPotion--;
            cout << "* MP가 20 회복되었습니다. 포션이 1개 차감됩니다." << endl;
            cout << "현재 MP: " << stats[1] << endl;
            cout << "남은 포션 수: " << MPPotion << endl;
            break;

        case 3: // HP 강화
            stats[0] *= 2; // HP 2배
            cout << "* HP가 2배로 강화되었습니다. 현재 HP: " << stats[0] << endl;
            break;

        case 4: // MP 강화
            stats[1] *= 2; // MP 2배
            cout << "* MP가 2배로 강화되었습니다. 현재 MP: " << stats[1] << endl;
            break;

        case 5: // 공격 스킬
            if (stats[1] >= 50) {
                stats[1] -= 50; // MP 50 소모
                cout << "공격 스킬 사용! MP 50이 차감되었습니다. 현재 MP: " << stats[1] << endl;
            }
            else {
                cout << "MP가 부족합니다." << endl;
            }
            break;

        case 6: // 필살기
            if (stats[1] >= 100) {
                stats[1] -= 100; // MP 100 소모
                cout << "필살기 사용! MP 100이 차감되었습니다. 현재 MP: " << stats[1] << endl;
            }
            else {
                cout << "MP가 부족합니다." << endl;
            }
            break;

        default: // 1~7 이외 숫자 입력 시
            cout << "잘못된 번호입니다. 다시 입력해주세요." << endl;
            break;
        }
    }

    return 0; // ✅ 프로그램 정상 종료
}

 

#include <iostream> // 입출력 기능을 사용하기 위해 포함
using namespace std; // std:: 생략하고 cout, cin 바로 쓰기 위해

// ✅ 전역 변수 선언 (어디서든 접근 가능)
int stats[4] = { 0 };  // [0]=HP, [1]=MP, [2]=공격력, [3]=방어력
int HPPotion = 0;      // HP 포션 개수
int MPPotion = 0;      // MP 포션 개수

// ✅ 함수 정의 (포션 개수 설정 함수)
// - 포인터(*)를 사용해서 호출한 쪽 변수에 값을 직접 넣어줌
void setPotion(int count, int* p_HPPotion, int* p_MPPotion) {
    *p_HPPotion = count; // 포인터를 통해 원래 변수에 접근
    *p_MPPotion = count;
}

// ✅ main 함수: 프로그램이 시작되는 곳
int main()
{
    // HP와 MP 입력받기 (50 이상이어야 함)
    while (1) // 무한 반복 → 조건 충족하면 break로 탈출
    {
        cout << "HP와 MP를 입력해주세요: ";
        cin >> stats[0] >> stats[1]; // 배열로 관리 (stats[0]=HP, stats[1]=MP)

        if (stats[0] > 50 && stats[1] > 50) {
            break; // 조건 충족 → 반복문 탈출
        }
        cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
    }

    // 공격력과 방어력 입력받기 (0 초과여야 함)
    while (1)
    {
        cout << "공격력과 방어력을 입력해주세요: ";
        cin >> stats[2] >> stats[3];

        if (stats[2] > 0 && stats[3] > 0)
        {
            break; // 조건 충족 시 탈출
        }
        cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
    }

    int choice = 0; // 메뉴 선택 번호

    // 포션 지급 (함수 호출 예시)
    setPotion(5, &HPPotion, &MPPotion);

    cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
    cout << "=============================================" << endl;
    cout << "<스탯 관리 시스템>" << endl;

    // ✅ 메인 루프: 사용자가 종료(7) 선택할 때까지 반복
    while (1)
    {
        // 현재 상태 출력
        cout << "\n1. HP 회복 2. MP 회복 3. HP 강화 4. MP 강화" << endl;
        cout << "5. 공격 스킬 6. 필살기 7. 프로그램 종료" << endl;
        cout << "현재 상태: HP(" << stats[0] << ") / MP(" << stats[1]
            << ") / 공격력(" << stats[2] << ") / 방어력(" << stats[3] << ")" << endl;
        cout << "남은 포션: HP(" << HPPotion << "개), MP(" << MPPotion << "개)" << endl;
        cout << "번호를 선택해주세요: ";
        cin >> choice;

        // 7번 → 프로그램 종료
        if (choice == 7) {
            cout << "프로그램을 종료합니다." << endl;
            break;
        }

        // ✅ switch문: 입력된 번호(choice)에 따라 동작 분기
        switch (choice)
        {
        case 1: // HP 회복
            if (HPPotion <= 0) { // 포션이 없으면
                cout << "포션이 부족합니다." << endl;
                continue; // 아래 실행 건너뛰고 다음 루프로 이동
            }
            stats[0] += 20; // HP +20
            HPPotion--;    // 포션 1개 소모
            cout << "* HP가 20 회복되었습니다. 포션이 1개 차감됩니다." << endl;
            cout << "현재 HP: " << stats[0] << endl;
            cout << "남은 포션 수: " << HPPotion << endl;
            break;

        case 2: // MP 회복
            if (MPPotion <= 0) {
                cout << "포션이 부족합니다." << endl;
                continue;
            }
            stats[1] += 20; // MP +20
            MPPotion--;
            cout << "* MP가 20 회복되었습니다. 포션이 1개 차감됩니다." << endl;
            cout << "현재 MP: " << stats[1] << endl;
            cout << "남은 포션 수: " << MPPotion << endl;
            break;

        case 3: // HP 강화
            stats[0] *= 2; // HP 2배
            cout << "* HP가 2배로 강화되었습니다. 현재 HP: " << stats[0] << endl;
            break;

        case 4: // MP 강화
            stats[1] *= 2; // MP 2배
            cout << "* MP가 2배로 강화되었습니다. 현재 MP: " << stats[1] << endl;
            break;

        case 5: // 공격 스킬
            if (stats[1] >= 50) {
                stats[1] -= 50; // MP 50 소모
                cout << "공격 스킬 사용! MP 50이 차감되었습니다. 현재 MP: " << stats[1] << endl;
            }
            else {
                cout << "MP가 부족합니다." << endl;
            }
            break;

        case 6: // 필살기
            if (stats[1] >= 100) {
                stats[1] -= 100; // MP 100 소모
                cout << "필살기 사용! MP 100이 차감되었습니다. 현재 MP: " << stats[1] << endl;
            }
            else {
                cout << "MP가 부족합니다." << endl;
            }
            break;

        default: // 1~7 이외 숫자 입력 시
            cout << "잘못된 번호입니다. 다시 입력해주세요." << endl;
            break;
        }
    }

    return 0; // ✅ 프로그램 정상 종료
}