반응형

게임 개발을 하다보면 랜덤 함수는 거의 필수라 할 수 있다.

3Match 게임을 만들 때에도 랜덤으로 블록을 배치하기 위해 사용해야한다.

이 때 블록 타입을 랜덤으로 가져오는데 우연의 일치로 모든 랜덤 값이 동일하게 나온다면

모든 블록이 동일해지고 참으로 재미없는 일이 발생 할 것이다.


이러한 경우 원하는 블록타입을 하나씩 배치하기 위해서 중복없이 랜덤 값을 가져와야 한다.


C / C++ Function (shffle 라는 함수를 하나 만든다.)


void shuffle(int *data, int size)

{

    int temp = 0;

    for (int i = 0; i < size; ++i) {

        int randNum = getRandomNumber(0, size - 1);

        

        temp = data[randNum];

        data[randNum] = data[i];

        data[i] = temp;

    }

}


사용 예


// 10개의 블록 타입이 있다고 가정하고 0 ~ 9 까지 담고 있는 배열을 만든다.

#define MAX_BLOCK_TYPE 10

int arrayBlockNum[MAX_BLOCK_TYPE] = {0, };

for (int i = 0; i < MAX_BLOCK_TYPE; ++i) 

{

arrayBlockNum[i] = i + 1;

}


// 블록 타입을 담은 배열과 사이즈를 함수에 파라메터로 넘긴다.

shuffle(arrayBlockNum, MAX_BLOCK_TYPE);


위와 같이 해주면 배열안에 값들을 서로 바꿔주는 셔플 기능이기때문에 

0번째 배열부터 순차적으로 사용해도 배열안에 값들은 무엇이 나올지 모른다.


0~9번 배열까지 하나씩만 사용할 경우 중복 없이 랜덤 값을 가져올 수 있다.


1씩 증가하는 정수가 아니더라도 랜덤으로 뽑을 수를 배열에 넣고 셔플을 하면 

중복 없이 가져 올 수 있다. 


[주의]

셔플을 한다고 해도 0번 배열에 값을 여러번 사용 하면 중복 값이 되니 한번 사용한 배열의 값은 필요한 경우가 아니라면

사용하지말자!! ^^

반응형

+ Recent posts