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
'게임 개발 > 맵 제작' 카테고리의 다른 글
[게임개발] 타일형 랜덤맵에서 고립된 공간 만들지 않기. Flood Fill 활용. (0) | 2022.12.15 |
---|---|
[게임개발/C#] 맵에디터 랜덤 맵 생성 관련 시드값 설정하기 (0) | 2022.12.13 |