요구 사항 이해
- 모든 플레이어는 인접한 적의 수가 제한되어 있습니다.
먼저, 게임의 특정 지점에서 플레이어의 현재 위치가 아니라 플레이어의 스폰 지점에 대해 이야기합니다. 그냥 그 길에서 벗어나
Adjacent는 그래프에 대해 이야기 할 때 잘 정의되어 있습니다. 이제 "그래프"에서지도의 탐색 성을 나타내는지도를 생각할 수 있습니다.
노드가 최대 하나의 스폰 지점을 가질 수 있다면, "인접한"지점에 대해 말하는 것이 합리적입니다. 참고 : 노드가 최대 하나의 스폰 지점을 갖도록 제한하지는 않습니다.
그래프를 만들려면 벽, 다리, 사다리, 순간 이동 지점 등을 고려하거나 비행 할 수있는 플레이어가있을 경우 비행 공간을 고려해야합니다. 각 노드는 통과 가능한 위치를 나타냅니다. 각 연결은 가능한 움직임을 나타냅니다.
참고 : 노드의 크기와 모양을 알고 실제로 인접한 노드와 작업하십시오. 노드를 요점으로 생각하지 마십시오. 길이가 긴 연결을 고려하지 마십시오. 또한 볼록한 노드를 사용하십시오.
그래프는 사전 컴파일 될 수 있습니다 (맵은 디자이너가 작성했습니다). 그렇지 않으면 맵이 무작위로 생성되는 경우 즉석에서 만들 수 있습니다.
- 모든 플레이어는 인접한 적을 만날 확률이 동일합니다.
나는 적들이 다른 플레이어라고 가정합니다. 다시 말하지만, 그 길에서 벗어나는 것입니다.
각 플레이어가 무작위로 걷는다고 가정하면, 주어진 지점에서 장애물이없는 평평한 공간에서 플레이어를 찾을 확률은 스폰 지점까지의 거리 (가우시안) 기능에 의해 주어집니다. 기능".
그래프에서 작업하고 있으므로 그래프의 값에 주석을 달 것입니다.
- 맵 크기는 플레이어 수에 비례하여 증가하지 않아도됩니다.
노드 당 하나의 스폰 포인트를 갖는 데 제약이 있다면, 더 많은 플레이어를 추가하려면 더 작은 노드가 필요합니다. 플레이어 수를 알기 전에 그래프를 결정하면 특정 게임의 노드를 세분화해야 할 수도 있습니다.
- 이러한 제한은 임의의 통과 할 수없는 공간에는 적용되지 않습니다.
문제를 해결하기 위해 장애물을 추가하지 않습니다. Au contraire , 나는 장애물 주위에 일해야합니다. 그들이 거기에 없다면 구현이 더 간단 할 것입니다.
해결책
우리는 모든 스폰 지점에서 다른 플레이어를 만날 확률이 동일하도록 N 스폰 지점을 배치하려고합니다.
기회의 평균과 기회의 차이의 합으로 오차를 측정 할 수 있습니다. 우리는 그것을 최소화하려고 노력하고 있습니다 (사실, 우리는 그것을 0으로 만들고 싶습니다).
그러기 위해서는 그래프의 각 노드에서 플레이어를 만날 가능성을 알아야합니다.
그 기회를 계산하려면 0부터 시작하십시오. 주어진 노드에서 플레이어를 찾을 확률은 플레이어가 없을 때 0입니다. 그런 다음 각 스폰 지점에 대해 현재 스폰 지점에 대한 함수 값을 주석이 추가 된 기회에 추가하여 그래프를 이동하십시오.
참고 1 : 스폰 지점을 추가하거나 이동하면 모든 맵에서 플레이어를 만날 확률에 영향을줍니다.
참고 2 : 각 스폰 지점이 기회에 얼마나 영향을 미치는지 추적하면 일이 쉬워집니다.
참고 3 : 노드에는 크기가 있으므로 노드 크기에 따라 오류 = 0에 얼마나 근접 할 수 있습니까? 값 범위 (노드 내에서 스폰 지점의 특정 위치에 따라 최소 및 최대 기회)를 사용하여보다 정확하게 작업 할 수 있습니다.
스폰 지점을 무작위로 배치 한 다음, 오류가 작아지는 방식으로 이동을 시작하십시오 (가능한 움직임을 고려하고 오류가 줄어드는 경우 유지하십시오). 더 이상 개선 할 수 없을 때까지 계속하십시오 (개선없이 너무 많은 반복 또는 오류가 0 임).
참고 4 : 스폰 지점을 이동할 때 플레이어를 만날 확률 (이동할 스폰 지점 제외)을 사용하여 스폰 지점에 대한 새로운 위치를 무작위로 선택하여 플레이어와 더 가까이있을 수 있습니다. 평균이 더 가능성이 높습니다. 스폰 지점을 이동하면 평균에 영향을 미칩니다.
예상되는 동작은 너무 가까이있는 스폰 지점이 서로 떨어져 움직이고 너무 멀리 떨어진 스폰 지점이 더 가까이 오는 것입니다. 그들이 평형에 도달 할 때까지.
주어진 반복에서 노드에 여러 개의 스폰 지점이있는 경우 (이것은 같지 않을 것 같지만 충분히 큰 노드가있는 경우 가능할 수 있음) 노드를 분할하고 계속 해결하십시오. 노드의 모든 분할이 유효합니다.
위의 솔루션은 오류 = 0에 접근하지만 0에 도달한다고 보장하지는 않습니다. 로컬 최소값에 도달 할 때까지 실행할 수 있습니다 ... 이론적으로, 노드를 정확히 0으로 만들기 위해 분할 할 수 있습니다 ... 그러나 스폰 지점 좌표를 조정하는 것과 같습니다!
노드 내에서 스폰 지점을 이동하려면 시뮬레이션 어닐링을 시도하십시오. 솔직히 말해서 그러한 수준의 세부 사항을 귀찮게하는 것은 가치가 없을 것입니다.
장애물이없는 평평한지도의 결과가 균일하게 분포 된 점이 아님을 분명히하고 싶습니다. 대신 맵에 가장자리가있는 경우 (즉, 둘러싸 지 않는 경우) 가장자리에 더 가까운 스폰 지점이있을 것입니다. 이는 중앙의 점이 더 많은 방향에서 도달 할 수 있기 때문에 발생할 수있는 가능성이 높아지기 때문입니다 거기에 다른 플레이어. 따라서 보정하기 위해 중앙 부근에서 더 멀리 떨어져 있습니다.