본문 바로가기

게임 개발/맵 제작

[게임개발/C#] 타일형 랜덤맵 배열 섞기. 피셔-예이츠 셔플.

728x90

# 목표

예를 들어 10*10 크기의 타일형 랜덤맵을 만들 것입니다.

그 중 20개의 타일에 벽을 배치해야할 것입니다.

 

이 때 사용할 수 있는 방법으로

tile[0,0] ~ tile[9,9]까지 100개의 타일을 무작위로 섞어 20개를 뽑아 벽 타일로 정해줄 수 있습니다.

 

이렇게 배열 (유한 수열)이 있을 때 골고루 섞어주는 방법으로

피셔-예이츠 셔플(The Fisher-Yates Shuffle)을 사용하는 방법을 알아보겠습니다.

 

 

 

# 피셔-예이츠 셔플

피셔-예이츠 셔플은 기존의 순열에서 무작위로 하나의 수를 뽑아

새로운 수열에 뽑은 순서대로 놓는 방식입니다.

이렇게 뽑은 랜덤 수열은 매 번 뽑을 때마다 

어느 한 쪽으로 편향되지 않고 골고루 나온다는 장점이 있습니다.

 

 

 

# 코드 예제

public static T[] ShuffleArray<T>(T[] array)
{
    System.Random rand = new System.Random();
    for (int i = 0; i < array.Length - 1; i++)
    {
        int randomIndex = rand.Next(i, array.Length);
        T tempItem = array[randomIndex];
        array[randomIndex] = array[i];
        array[i] = tempItem;
    }
    return array;
}

기존 수열, 새로운 수열을 구분하지 않고 배열 안에서 섞기 위한 방법입니다.

한 번 뽑인 랜덤 수는 배열의 왼쪽으로 이동하여 차례대로 쌓이며,

이후에 다시 뽑히지 않습니다.

728x90