私はゲームボーイ アドバンス用のゲームを書いており、二分探索木の形で基本的な AI を実装しています。人間のプレイヤーが 1 人、コンピュータのプレイヤーが 1 人います。人間のプレイヤーがどれだけ攻撃的にコンピュータを攻撃しているかを知る方法を見つけ出す必要があります。while
人間はボタンを押して攻撃します (コンピューターの特定の半径内にいる必要があります)。そのため、最初に考えたのは、メインループが通過した反復回数と比較して攻撃回数がどれだけ大きいかを確認することでした。ただし、その数は変動する可能性があるフレームレートに依存するため、これは悪い方法のように思えます。これを行うためのより良い方法のアイデアはありますか?
4 に答える
人間のプレイヤーがコンピューターのプレイヤーを攻撃できる瞬間の数を数えてみませんか? つまり、彼が範囲内にいるかどうかを確認する必要があるのは明らかなので、彼が範囲内にあるかどうかを確認し、範囲内にある場合はcould_have_attacked
カウンターをインクリメントしてください。その後、彼が実際に攻撃した場合、attacked
カウンターを 1 つ増やします。次に、人間のプレーヤーが攻撃する頻度と機会を得る頻度を比較できます。
または、彼が範囲内にいる頻度と範囲外にいる頻度を比較するか、より一般的にはプレーヤー間の平均距離を追跡します。よりアグレッシブなプレイヤーは、パッシブなプレイヤーよりも対戦相手の近くにとどまるでしょう。
おそらく最善の策は、さまざまな方法を組み合わせることです。いくつかの異なる測定値を保持し、方法を相互に比較検討するいくつかの異なる方法を試し、広範なプレイテストを使用してどれが優れているかを選択します。
アグレッシブとは何かを定義する必要があります。たとえば、アグレッシブなプレーヤーは AI を追跡するプレーヤーであると言えます。そのため、彼が範囲外にいるよりも範囲内にいるかどうかをより頻繁に確認します。または、アグレッシブとは、機会があれば攻撃するプレーヤーであると言えます。したがって、プレーヤーが攻撃しなければならない時間に対する成功した攻撃の比率を確認します。または、アグレッシブなプレーヤーは、負傷したときに攻撃すると言うこともできます。ゲームの世界で「アグレッシブ」が何を意味するかを定義したら、プレイヤーがその定義にいつ該当するかを示す主要業績評価指標を確立できます。
戦闘間の平均時間をカウントし、戦闘中の平均発砲速度をカウントする方法に沿って何かを考えました。そのためには、次のような 5 つの変数が必要です。
float avgTimeWithoutCombat;
float currentTimeWithoutCombat;
float avgRateOfFire;
int shotsFired;
float combatTimeElapsed;
プレイヤーが戦わない限り、currentTimeWithoutCombat で「平和な」時間をカウントします。彼が発砲したら、それを avgTimeWithoutCombat に追加し、それを 2 で割って平均を求めます。
プレイヤーが攻撃するたびに、発射されるショットの数を増やします。また、戦闘時間を数えます。攻撃がない状態が一定時間経過したかどうかをメイン ループで確認します。その場合、戦闘は終了し、avgRateOfFire を計算できます。
これで、プレーヤーの攻撃性を測定する 2 つの値が得られました。
- avgTimeWithoutCombat: この数値が大きいほど、プレイヤーの攻撃性は低くなります。
- avgRateOfFire: この数値が大きいほど、プレイヤーはより攻撃的になります。
そのために疑似乱数ジェネレーターを使用できます。0 から 1 までの値を返す rnd() 関数があるとします。値が大きいほど攻撃性が高くなります。0 から 1 までの係数を導入します。キャラクターが攻撃するかどうかを判断する必要があるたびに、rnd() を呼び出して値を係数と比較します。それより大きい場合は攻撃し、そうでない場合は攻撃しません。