C++

C++ [텍스트 RPG에서 상점 만들기(1. 플로우차트, 상점 입장)]

jeongchanhyo 2025. 1. 10. 19:38

상점 만들기

상점 입장 시

1. 현재 보유 골드, 인벤토리 상태 출력(골드, 인벤토리 상태는 캐릭터 클래스에 담겨있음)

2. 상점에서 판매할 아이템을 총 5가지 아이템 중 3개를 랜덤으로 선택

상점 선택 단계

아이템 구매, 판매, 전장으로 이동을 선택할 수 있어야된다.

아이템 구매

1. 아이템 구매를 누르면 구매가능한 품목들과 각각의 가격도 나온다. 뒤로가기를 누르면 선택 단계로 돌아갈 수 있다.

2. 아이템 구매 시 보유 골드가 아이템 가격보다 적으면 구매하지 못하고 보유중인 골드를 출력한다. 1단계로 돌아간다.
3. 아이템 구매 시 내 인벤토리 무게를 넘어가면 무게가 최대치라고 말하고 아이템의 무게와 내 현재 인벤토리 무게 상태를 출력한다. 1단계로 돌아간다.
4. 아이템 구매 성공 시 아이템 골드를 지불하고 아이템은 캐릭터의 인벤토리에 생성된다, 보유골드 출력 후 1번으로 이동

5. 유저가 구매한 아이템은 품절된다.

 

아이템 판매

1. 아이템 판매를 누르면 보유중인 아이템을 보여주고 판매 가격도 나온다. 뒤로가기를 입력하면 선택단계로 돌아갈 수 있다.

2. 아이템 판매시 인벤토리에서 아이템이 사라지고 골드를 획득한 후. 현재 보유 골드와 인벤토리 무게 상태를 출력, 1번으로 돌아간다.

 

플로우 차트

이제 이 상점을 구현하기 위해 어떤 과정을 거쳐야 하는지 플로우차트로 정리를 해보자. 이 작업이 시간이 들긴 하지만 구현할 때 오히려 완성 시간을 줄이는 방법이 될 수 있다.

정리를 해보면 이렇게된다.이제 화살표를 따라가며 천천히 만들어볼 생각이다.

 

1. 입장 시 현재 보유 골드와 인벤토리 상태 표시

class Sope
{
private:
    int maxinventoryweight = 10;
    int inventoryweight = 0;
    int gold = 170;
public:
    //현재 보유골드, 인벤토리 상태 표시 함수
	void EnterShop() {
        cout << "현재 보유 골드 : " << gold << endl;
        cout << "인벤토리 무게 : " << inventoryweight << "/" << maxinventoryweight << endl;
	}
};

일단 필요한것들은 임시로 만들어놓겠다.

이거는 

2.랜덤으로 아이템 뽑기

일단 srand() 함수를 사용할것이다

srand() 함수는  시드를 설정하는 데 사용되는 함수다.

이 함수는 <cstdlib> 헤더에 정의되어 있다.

그러나 srand(1)을 하면 다른 랜덤에서 몇번을 실행하든 같은 값이 나온다. 그렇기 때문에 시드 안의 숫자를 랜덤으로 바꿔줘야하는데 그걸 해줄 수 있는 친구가 time(0)이다 이건 현재 시간을 시드로 설정하는것인데 1초마다 계속 바뀌기 때문에 진정한 랜덤으로 사용할 수 있다.

그러나

srand(time(0));

 

이렇게 사용해버리면 time(0)의 반환타입이 time_t이기 때문에 타입 안정성을 위해 int로 바꿔주는게 좋다.

srand(static_cast<unsigned int>(time(0)));

static_cast<타입>(바꿀거)를 사용해 타입 변화를 해준다

그러나 타입은 int가 아니라 <unsigned int>로 해주는 이유는 time(0)값이 음수가 나오면 어떤 시드를 가져올지 모르기 때문에 안정성을 위해 바꿔준것이다.

이게 됐다면 이제 이 밑에있는 랜덤들은 전부 매번 할때마다 다른 값이 나올것이다. 그렇다면 내가해야될건

1. 아이템 복사해주기

vector<Item> shuffled_items = all_items;

vector<Item>타입의 배열 shuffled_items를 선언해주고 all_items로 원본 아이템들을 전부 복사해준다.

2. 배열들을 섞어준다.

random_shuffle(shuffled_items.begin(), shuffled_items.end());

random_shuffle로 shuffled_items을 begin~end까지 섞어준다. 이건 이 식만 있으면 매번 같은값이 나오지만

위에서 srand(static_cast<unsigned int>(time(0)));이걸 해줬기 때문에 매번 다른값이 나온다

3.값을 반환해준다.

return vector<Item>(shuffled_items.begin(), shuffled_items.begin() + 3);

앞에서부터 필요한 수 만큼 가져온다. 상점에 품목을 3개 놓을 생각이니 3을 넣겠다.

 

정리하면

    vector<Item> Random_Items()
    {
        srand(static_cast<unsigned int>(time(0)));//랜덤 시드 설정
                     
        vector<Item> shuffled_items = all_items; // 원본 복사(gamemanager에서 해주면 여긴 그냥 들고오면 됨)
        random_shuffle(shuffled_items.begin(), shuffled_items.end());//배열 섞기(위에서 시드를 랜덤으로 초기화했기 때문에 매번 다른 값이 나옴)

        return vector<Item>(shuffled_items.begin(), shuffled_items.begin() + 3); //3개 선택해서 반환
    }

이렇게 나온다.

 

3. 유저 선택 입력

void Shop_Selection()
{
    cout << "1.아이템 구매" << endl;
    cout << "2.아이템 판매" << endl;
    cout << "3.전장으로 이동" << endl;
    int choice;
    cin >> choice;
}