要件を理解する
- すべてのプレイヤーは限られた数の隣接する敵を持っています。
まず、ゲームの特定のポイントでのプレイヤーの現在の位置ではなく、プレイヤーのスポーンポイントについて話します。邪魔にならないように。
グラフについて話すとき、隣接は明確に定義されています。マップ上のナビゲーション性を表すマップを考えることができます-これからは「グラフ」。
できるノードが最大で1つのスポーンポイントを持つことができる場合、それらのノードが「隣接している」ということは理にかなっています。注:後で明らかになる理由から、ノードを1つだけ制約してスポーンポイントを1つにすることはしません。
グラフを作成するには、壁、橋、はしご、テレポーテーションポイントなどを考慮する必要があります。また、飛べるプレイヤーがいる場合は飛行スペースを考慮する必要があります。各ノードは通過可能な場所を表します。各接続は、可能な動きを表します。
注:ノードのサイズと形状を把握し、実際に隣接するノードを操作します。ノードをポイントと見なさないでください。接続に長さがあると考えないでください。また、凸ノードを使用します。
グラフはプリコンパイルされている可能性があります(マップはデザイナーによって作成されました)。それ以外の場合、マップがランダムに生成される場合、その場で作成できます。
- すべてのプレイヤーは、隣接する敵に平等に遭遇する可能性があります。
敵は他のプレイヤーだと思います。繰り返しますが、それは邪魔になりません。
各プレイヤーがランダムウォークを行うと仮定すると、特定のポイント(障害物のない平坦な空間)でプレイヤーを見つける確率は、スポーンポイントまでの距離の(ガウス)関数によって与えられます。関数"。
グラフで作業しているため、代わりにグラフの値に注釈を付けます。
- マップサイズは、プレーヤーの数に比例して増加する必要はありません。
ノードごとに1つのスポーンポイントを持つという制約がある場合、プレーヤーを追加するには、より小さいノードが必要になります。プレイヤーの人数を知る前にグラフを決定した場合、特定のゲームのノードを再分割する必要があります。
- これらの制限は、任意の通過不可能なスペースでは強制されません。
問題を解決するために障害物を追加するつもりはありません。反対に、私は障害を回避する必要があります。それらがなければ、実装はより簡単になります。
溶液
N個のスポーンポイントを配置して、それらすべてのスポーンポイントで別のプレイヤーと遭遇する可能性が等しくなるようにしています。
確率の平均と確率の差の合計として誤差の測定値を取得できます。これを最小化しようとしています(実際、0にしたい)。
そのためには、グラフの各ノードでプレイヤーに遭遇する可能性を知る必要があります。
その可能性を計算するには、ゼロから始めます。特定のノードでプレイヤーが見つからない場合、プレイヤーがいない場合はゼロです。次に、各スポーンポイントについて、現在のスポーンポイントの関数の値を注釈付きのチャンスに追加してグラフを調べます。
注1:スポーンポイントを追加または移動すると、すべてのマップでプレイヤーが遭遇する可能性に影響します。
注2:各スポーンポイントがチャンスにどの程度影響するかを追跡することで、物事が簡単になります。
注3:ノードにはサイズがあるため、エラー=ゼロにどれだけ近づくことができるかは、ノードのサイズによって異なります。値の範囲(ノード内のスポーンポイントの特定の位置に応じて、最小および最大のチャンス)を操作することにより、より正確にすることができます。
スポーンポイントをランダムに配置し、エラーが小さくなるように移動を開始します(可能な移動を考慮し、エラーが減少する場合は維持し、そうでない場合は元に戻します)。そして、それ以上改善できなくなるまで(改善なしの反復が多すぎるか、エラーがゼロになるまで)続けます。
注4:スポーンポイントを移動する場合、プレイヤーに遭遇する可能性(移動するスポーンポイントを除く)を使用して、スポーンポイントの新しい位置をランダムに選択して、より近いプレイヤーに遭遇する可能性のある位置を獲得できます平均がより可能性が高い。スポーンポイントを移動すると平均に影響することを思い出してください。
予想される動作は、互いに近すぎるスポーンポイントが離れ、離れすぎるスポーンポイントが近づくことです。それらが平衡に達するまで。
特定の反復でノードに複数のスポーンポイントがある場合(ノードは離れる傾向があるため、可能性は低いですが、十分な大きさのノードがある場合は可能です)、ノードを分割して解決を続けます。ノードの分割はすべて有効です。
上記のソリューションは、エラー=ゼロに近づきますが、ゼロに達することは保証されません。できることは、ローカルミニマムに達するまで実行することです...理論的には、ノードを分割して正確にゼロにすることができます。
シミュレーテッドアニーリングを試して、ノード内のスポーンポイントを移動します。正直なところ、このようなレベルの詳細を気にすることはおそらく価値がありません。
障害物のないフラットマップの結果は、均一に分布したポイントにはならないことを明確にしたいと思います。代わりに、マップにエッジがある場合(つまり、ラップアラウンドしない場合)、エッジに近いスポーンポイントが多くなります。これは、中心のポイントがより多くの方向から到達できるため、遭遇する可能性が高くなるためです。他のプレイヤーがいます。したがって、補正するために中心付近でさらに離れたポイント。