티스토리 뷰

🟩 오늘의 목표

  • 고정 상품과 랜덤 상품이 공존하는 상점 매대 시스템을 구축한다.
  • 유저 입력 번호와 내부 데이터 인덱스 간의 매핑 로직을 이해한다.
  • 아이템 타입에 따른 구매 프로세스 다변화와 현대적인 난수 생성 기법을 익힌다.

 

🟧 1. 고정 및 랜덤 상품 복합 진열 시스템

상점 입장 시마다 유저에게 새로운 기분을 주기 위해 모든 상품을 고정하지 않고, 필수 아이템은 유지하되 나머지는 랜덤하게 진열되도록 구현했다. 체력 포션과 공격력 포션은 항상 1, 2번 슬롯에 배치되는 고정 상품으로 설정했고, 나머지 3개 슬롯은 ItemPool에서 무작위로 셔플된 3종의 아이템으로 채워 매번 변화를 주었다.

 

🟧 2. 선택 번호와 데이터 인덱스의 매핑 (Index Offset)

유저가 화면에서 보는 번호와 실제 vector의 인덱스가 일치하지 않는 문제를 해결하기 위해 오프셋(Offset) 계산 로직을 적용했다. 유저가 랜덤 상품의 시작 번호인 3번을 입력하면 실제 데이터의 0번 인덱스를 참조하도록 $Choice - 3 = 0$ 연산을 수행하여 데이터 무결성을 유지하는 법을 학습했다.

 

🟧 3. 아이템 타입별 구매 및 판매 분기 처리

모든 아이템을 동일하게 처리하지 않고 아이템의 성격에 따라 유저 경험(UX)을 차별화했다. 소모품은 수량을 입력받아 한 번에 대량 구매가 가능하게 했으나, 장비류는 수량 입력 대신 최종 구매 확인 절차를 거치도록 로직을 분리했다. 판매 시스템에서는 상점이 취급하는 품목만 필터링하여 노출하고, static_cast<int>를 활용해 기준가의 60%를 소수점 오차 없이 정산하는 시스템을 구축했다.

 

🟧 4. Modern C++ 기반 난수 생성 및 셔플

기존의 rand() 대신 Modern C++의 mt19937 엔진과 std::random_device를 사용하여 난수의 신뢰도를 높였다. std::shuffle을 통해 아이템 풀을 섞고, 아이템 가격이 80%~120% 사이에서 유동적으로 책정되도록 구현하여 상점 시스템의 역동성을 더했다.

void ShopField::RefreshShop() {
    CurrentStock.clear();
    std::random_device rd;
    std::mt19937 g(rd()); // 고성능 난수 엔진

    std::shuffle(ItemPool.begin(), ItemPool.end(), g); // 아이템 풀 셔플

    for (int i = 0; i < MaxDisplayCount; ++i) {
        ShopItem item = ItemPool[i];
        // 80% ~ 120% 사이의 유동 가격 책정
        float ratio = (80 + (rand() % 41)) / 100.0f; 
        item.CurrentPrice = static_cast<int>(item.BasePrice * ratio);
        CurrentStock.push_back(item);
    }
}

 

🟧 넥스트 스텝

  • UI 담당 팀원과의 협업을 위한 입출력부 인터페이스화
  • 팀장이 구현한 ItemDatabase와 연동하여 실시간으로 전체 아이템 리스트 반영
  • 구매한 장비 아이템의 인벤토리 즉시 장착 기능 추가

 

🟫 오늘 느낀 점

유저가 보는 숫자 뒤에는 치밀하게 계산된 인덱스 보정 로직이 숨어있음을 느꼈다.

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 28일차  (0) 2026.01.07
TIL - 27일차  (0) 2026.01.06
TIL - 25일차  (0) 2026.01.02
TIL - 24일차  (0) 2025.12.31
TIL - 23일차  (0) 2025.12.30