넣고, 뽑으면 끝나는 랜덤박스 만들기

 

안녕하세요! 밤말팅입니다.

 

이번에는 게임을 하면서

 

가장 흔하게 마주할 수 있는

 

"랜덤박스"

 

를 만들어보았습니다.

뭐가 나올지 두근두근해지는 그것

 

물론 굉장히 이슈가 되었던

 

물건이긴 하지만..

 

게임에서 확률

 

빼놓을 수 없는 것이라

 

 

언젠가는 필요할 것 같아서

 

한 번 만들어보게 되었네요!

 

 

<C#코드>

RandomBox.cs
0.05MB

C#코드는 다음과 같은

네임스페이스를 참조합니다.

using System.Collections.Generic; //List<T>를 위해 사용합니다.
using System; //랜덤기능을 위해 사용합니다.

사용에 제한이 있으신 분은

교체해서 사용하시면 되시겠습니다!

 

<C++ 코드>

RandomBox.h
0.01MB
RandomBox.cpp
0.03MB

C++코드는 다음과 같은

헤더파일을 참조합니다.

#include<vector>
#include<random>
#include<string>

역시나 위 헤더의 사용에

제한이 있으신 분은

교체하셔도 무방합니다.

 

 

<구성>

///랜덤박스의 아이템을 뽑아 문자열로 반환합니다. 뽑을 것이 없으면 nullptr을 반환합니다.
string Pick();

///원하는 아이템의 이름을 넣으면, 그 아이템의 정보를 가진 뷰어를 반환합니다.
ContentViewer GetViewer(string name);

///변동/부동확률의 모든 아이템을 보여주는 뷰어 리스트를 반환합니다.
///true는 변동, false는 부동확률을 나타냅니다.
vector<ContentViewer> GetViewerAll(bool wantFlexible);

///원하는 이름의 아이템을 삭제합니다.
void Delete(string name);

///원하는 아이템의 이름, 확률, 변동가능성을 설정하여 생성합니다. 아이템은 무한히 뽑을 수 있습니다.
bool Insert(string name, float wantRate, bool wantFlexible);

///원하는 아이템의 이름, 확률, 개수, 변동가능성을 설정하여 생성합니다. 아이템은 개수만큼만 뽑을 수 있습니다.
bool Insert(string name, float wantRate, unsigned int wantNumber, bool wantFlexible);

///원하는 아이템의 개수를 일정량 증가시킵니다.
void NumberAdd(string name, unsigned int wantNumber);

///원하는 아이템의 개수를 일정량 감소시킵니다.
void NumberSub(string name, unsigned int wantNumber);

///원하는 아이템의 개수를 원하는 개수로 변경합니다.
void SetNumber(string name, unsigned int wantNumber);

///원하는 아이템을 무한정 뽑을 수 있는지 정합니다.
void SetInfinity(string name, bool wantInfinity);

///원하는 아이템의 이름을 from에서 to로 변경합니다.
void SetName(string from, string to);

///원하는 아이템의 확률을 변경합니다.
void SetRate(string name, float wantRate);

///원하는 아이템의 변동 가능성을 변경합니다.
void SetFlexible(string name, bool wantFlexible);

///원하는 아이템의 활성화 여부를 결정합니다.
void SetAvailable(string name, bool wantAvailable);

랜덤박스의 함수들

소스코드에도 적혀있습니다!

랜덤박스의 내용물

구성은 아주 간단합니다.

 

Trie 자료구조라고 하죠

 

pi, te, to가 들어간 트라이

문자열을 쪼개서

 

밑으로 쭉 이어준 것인데요.

 

랜덤박스 내용물을

 

문자열로 만들 것이기 때문에

 

검색용으로 달아두었습니다.

 

확률은 부동과 변동이 있습니다.

그리고 확률이 두 가지가 있죠.

 

변하지 않는 확률 "부동 확률"과

 

변할 수 있는 확률"변동 확률"

 

두 개로 구성되어 있습니다.

 

 

부동확률의 입력

부동 확률은 변하지 않기 때문에

 

그대로 입력됩니다.

 

큰 확률부터 작은 확률까지

 

정렬되어 있어서

 

최소한의 참조로 확률을

 

구할 수 있게 해두었습니다.

 

변동 확률의 입력

변동확률은 부동확률을 빼고

 

남은 확률에다가 넣는 확률입니다.

 

부동확률이 늘어날수록

 

확률이 줄어들게 되겠죠?

 

변동확률 중에서 본인이 차지하는

 

비율만 유지하는 확률입니다.

 

혹시나 부동확률의 내용이

 

없어지거나, 비활성화 되거나

 

개수가 0이 되거나

 

이런 상황이 생겼을 때

 

남은 확률을 채워줄 수 있게

 

확률을 유연하게 조정하는

 

아이템들이라고 보시면 되겠습니다.

 

 

 

아이템 내부의 변수들

아이템들도 살펴보지 않으면

 

안되겠지요?

 

당연히 이름 들어가구요

 

확률 들어갑니다.

 

isFlexible은 위에 설명한

 

부동/변동의 설정이죠.

 

 

number는 남은 개수

 

isInfinity는 무한 여부입니다.

 

무한이면 그냥 뽑고

 

아니면 number를 확인해서

 

남은 개수가 있을 때에만

 

뽑아야겠네요!

 

 

isAvailable은 활성화 여부입니다.

 

뽑을 수 있는 상황일 때에도

 

이걸 꺼두면 나오지 않죠!

 

 

마지막 pickedTime은

 

지금까지 이 아이템이 뽑힌 횟수입니다.

 

있으면 편할 것 같아서 넣어놨네요!

 

<사용법>

//아이템을 뽑습니다.
string Pick();

아이템 뽑기입니다!

 

그냥 정해진 로직대로 뽑아주는

 

역할을 하구요.

 

뽑은 아이템의 이름을 반환합니다.

 

//아이템을 넣습니다.
bool Insert(string name, float wantRate, bool wantFlexible);
bool Insert(string name, float wantRate, unsigned int wantNumber, bool wantFlexible);

랜덤박스에 아이템을 넣는

 

함수입니다.

 

두 개의 차이점은 중간에

 

개수를 넣는다는 것인데요.

 

개수를 넣으면, 그 개수만큼만 뽑고

 

넣지 않으면 무한히 뽑을 수 있습니다.

 

//원하는 아이템 삭제
void Delete(string name);

넣는 것이 있다면

 

빼는 것도 있어야죠.

 

이름을 넣으면 해당하는

 

아이템을 없애줍니다.

 

//개수 증가
void NumberAdd(string name, unsigned int wantNumber);

//개수 감소
void NumberSub(string name, unsigned int wantNumber);

//개수 설정
void SetNumber(string name, unsigned int wantNumber);

//무한 설정
void SetInfinity(string name, bool wantInfinity);

//이름 설정
void SetName(string from, string to);

//확률 설정
void SetRate(string name, float wantRate);

//변동/부동 설정
void SetFlexible(string name, bool wantFlexible);

//활성화 설정
void SetAvailable(string name, bool wantAvailable);

아이템 설정을 바꾸어주는

 

함수들도 추가했구요.

 

//해당 아이템의 정보를 그대로 복사한 뷰어를 가져옵니다.
ContentViewer GetViewer(string name);
vector<ContentViewer> GetViewerAll(bool wantFlexible);

이것들은 아이템을 외부에 보여주는데

 

맘대로 바꾸는 것을 막기 위해

 

내용을 복사한 새로운 인스턴스

 

반환하도록 해두었습니다.

 

전부 가져오는 경우

 

변동/부동인지 확인해서

 

해당하는 아이템들만 가져옵니다.

 

 

<마치며>

문자열 기반으로 만들어서

 

어느 프로젝트에서나 쓸 수 있는

 

랜덤박스를 만들어보았습니다!

 

 

여기서 설명드리지 않았던

 

Trie구조나, 정렬된 리스트

 

함수 안에 모두 설명이 되어 있어서

 

혹시나 궁금하시다면

 

열어보셔도 좋겠네요!

 

 

그럼 다음 포스팅에서 뵙겠습니다!

+ Recent posts