씨앗에서 무작위 수준을 생성하는 방법? [닫은]


46

게임 레벨을 생성하기 위해 랜덤 시드를 어떻게 사용합니까? 동일한 시드는 항상 정확히 동일한 수준을 생성해야합니다.

이 예에서는 스타일 수준입니다. 따라서 각 레벨에는 테마 (잔디, 눈 등), 기본 지형, 나무와 같은 다른 개체가 있습니다.

이런 종류의 레벨 생성기를 어디에서 만들까요? 무엇이 관련되어 있습니까? 어떤 개념을 사용합니까?

모든 좋은 링크에 대한 보너스 포인트 ( 웜 또는 이와 유사한 방식으로 수행 된 방법에 대한 보너스 보너스 포인트).

감사.


랜덤 레벨 생성은 PCG (Procedural Content Generation)라고도합니다. 그리고 여기에 그것을 다루는 위키가 있습니다. pcg.wikidot.com 몇 가지 아이디어를 제공해야합니다 ! : o)
Kaj

1
Chris Crawford에는 흥미로운 기사가 ​​있습니다. 그것은 90 년대 초에 쓰여졌지만 여전히 관련이 있습니다. 세상을 만드는 방법
Anthony

동일한 난수 생성기를 사용하는 형식이나 알고리즘을 사용하는 경우 (시스템 시간과 같은 불변 값에서 몰래 빠져 나오는 것을 제외하고) 동일한 시드는 동일한 수준 생성하므로 실제로는 그 방법이 없습니다.
Kaj

1
예, 그러나 트릭은 실제로 레벨을 생성하기 위해 처음에 시드를 사용한다고 생각합니다. 나는 이전에 임의의 레벨 생성기를 만들었지 만 단일 시드를 사용하지 않았습니다. 종종 임의의 포인트를 선택한 다음 각 포인트마다 배치 할 임의의 자산을 선택합니다. 이 방법을 사용하면 임의의 숫자를 생성하는 많은 것들이 있기 때문에 항상 동일한 수준을 생성하는 하나의 진정한 시드가 없습니다.
Adam Harte

10
"씨앗"의 의미를 알고 있습니까? 예를 들어를 통해 전달 된 "초기 벡터" srand(int)입니다. 후속 호출 rand()은이 시드를 기반으로 항상 동일한 순서로 계산되는 순차적 값을 반환합니다. 프로그램에서 시드를 한 번 설정하십시오. 그 후 알고리즘이의 결과에만 의존 rand하는 경우 매번 동일한 결과를 얻습니다.
Heath Hunnicutt

답변:


7

이것의 핵심은 알려진 시드 값으로 초기화하는 사용자 정의 의사 난수 생성기를 사용하는 것입니다. "Mersenne Twister"는 널리 사용되는 알고리즘입니다. 여기 Wikipedia 항목 과 일부 샘플 소스가 있습니다. 이것과 다른 PRNG 알고리즘은 실제로 시드 값이 시작점으로 사용되는 (매우 긴) 고정 일련의 숫자를 생성합니다.

매번 세상을 생성하는 것과 똑같은 절차를 따르는 한 각 값은 고유 한 재현 가능한 세계를 나타냅니다.


4

다음은 ActionScript (AS2 또는 AS3에서 사용 가능)로 구현 된 PRNG (의사 난수 생성기)입니다. 가볍고 빠르며 게임에 이상적입니다 : http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

위의 구현은 Park-Miller-Carta PRNG를 기반으로합니다 . 이 사이트는이 모든 배후의 수학에 대한 통찰력을 제공합니다.

벌레와 같은 레벨을 만들기 위해 Perlin-Noise 함수를 사용했을 것입니다 . 높이가 1px이고 게임 세계의 너비로 펄린 노이즈 이미지를 생성하면 기본적으로 높이 맵을 사용할 수 있습니다. Perlin 노이즈 함수는 항상 동일한 시드로 동일한 맵을 생성합니다.

그런 다음 위에서 언급 한 PRNG를 사용하여 맵에 임의의 오브젝트를 배치 할 위치 또는지면에 구멍을 생성 할 위치를 결정할 수 있습니다. 구멍의 경우 펄린 노이즈를 다시 활용할 수도 있습니다. 지도 크기 (x, y)로 펄린 노이즈 이미지를 만든 다음 픽셀 값이 지정된 임계 값 (예 : 0.2) 미만인 맵에 구멍을 만듭니다.


펄린 노이즈를 사용하지만 약간 다르게 3D 높이 맵을 만들고 기울기에 맵을 놓고 임계 값보다 낮은 모든 픽셀을 제거하는 데 사용합니다. (if pixel.height-(pixel.distanceToBottom * slopeFactor) <트레스 홀드) 픽셀 = 투명)
Niels

2

이론적으로 의사 난수 생성기 (예 : Perlin-Noise 또는 Marsenne Twister)를 사용하여 맵을 공유 할 수있는 경우

시드 번호를 지정하면 커스텀 맵을 생성하고 시드로 축소하여 생성 할 수없는 문제를 해결할 수 있습니다

PRNG를 사용할 때 사용자 정의 맵. 그러나 이것은 몇 가지 추정에 기초합니다. 즉, 의사 난수 생성기는

가역적 프로세스와 PRNG로 거꾸로 공급되는 모든 데이터는 시드는 물론 유효한 시드를 생성합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.