6

オンライン マネージャー ゲーム ( Hattrickなど) で、2 つのチーム間の試合をシミュレートしたいと考えています。

チームは 11 人のプレーヤーで構成されます。すべてのプレーヤーの強度値は 1 ~ 100 です。各チームの守備側のプレーヤーのこれらの強度値を取得し、平均を計算します。それがチームの守備の質です。次に、攻撃的なプレーヤーの強みを取り入れて、攻撃的な品質を取得します。

攻撃ごとに、次のことを行います。

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive);
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive);

現時点では、両方の値の高い方で割る理由がわかりません。しかし、この式は、後で必要になる攻撃と防御の質の要因を与えるはずです。

次に、発生する可能性のある各イベントの条件ステートメントをネストしました。例: 攻撃側のチームに得点のチャンスはありますか?

if ((mt_rand((-10+$offAdditionalFactor-$defAdditionalFactor), 10)/10)+$offFactor >= 0) 
{ ... // the attack succeeds

これらの追加要因は、たとえば戦術的な値である可能性があります。

これはゲームを計算する良い方法だと思いますか? 私のユーザーは、シミュレーションの品質に満足していないと言っています。どうすれば改善できますか? より良い結果をもたらすさまざまなアプローチがありますか? それとも、私のアプローチは適切で、条件文の値を調整して少し実験するだけでよいと思いますか?

あなたが私を助けてくれることを願っています。前もって感謝します!

4

5 に答える 5

19

これが私が行う方法です。

攻守の質

まず、チーム全体の平均強度を計算します。

Team.Strength = SUM(Players.Strength) / 11

次に、サイドを 2 つに分割し、防御側のプレーヤーと攻撃側のプレーヤーの平均を計算します。]

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count

これで、3 つの値が得られました。最初のチーム平均は、勝利のオッズを計算するために使用されます。他の 2 つは、防御のオッズと得点のオッズを計算します。

オフェンスの平均が高いチームはチャンスが多く、ディフェンスが高いチームはセーブのチャンスが多くなります。

チームが必要な場合は、A と B としましょう。

チーム A の平均点は 80 で、オフェンシブ スコアは 85、ディフェンシブ スコアは 60 です。

チーム B の平均は 70 で、攻撃スコアは 50、防御スコアは 80 です。

さて、平均に基づいて。チーム A の方が勝つ可能性が高いはずです。しかし、どのくらいですか?

スコアリングと保存

チーム A が得点すべきゴール数を計算してみましょう。

A.Goals = (A.Offensive / B.Defensive) + RAND()
        = (85/80) + 0.8;
        = 1.666

ランダム値は -1 から +1 の間の値を追加すると仮定しましたが、これは調整できます。

ご覧のとおり、式はチーム A が 1.6 ゴールを獲得する必要があることを示しています。これを切り上げる/切り下げることができます。または、チーム A に 1 を与え、他のチームが許可されるかどうかを計算します (ランダム チャンス)。

これでチームB

B.Goals = (B.Offensive / A.Defensive) + RAND()
        = (50/60) + 0.2;
        = 1.03

つまり、A の得点が 1 で B の得点が 1 です。しかし、全体として A の方が優れたチームであるため、これを A に有利に重み付けすることを忘れないでください。

では、Aが勝つ確率は?

Chance A Will Win = (A.Average / B.Average)
                  = 80 / 70
                  = 1.14

したがって、オッズは 14% (.14) で、A が試合に勝つことがわかります。この値を使用して、最終スコアに変化があるかどうかを確認できます。

if Rand() <= 0.14 then Final Score  = A 2 - 1 B Otherwise A 1 - 1 B

乱数が 0.8 の場合、試合は引き分けです。

切り上げとさらなる考察

あなたは間違いなく値をいじりたいと思うでしょう。ゲームの仕組みを正しく理解するのは非常に難しいことを覚えておいてください。プレーヤーと話し、不満の理由を尋ねます。必ず負けるチームはありますか?シミュレーションは常に停滞していますか? 等

上記のアウトラインは、選択のランダム性に大きく影響されます。チームが追加の 5 ゴールを獲得する可能性が非常にまれになるように、それを正規化する必要があります。しかし、少しのランダム性は、ゲームに多様性を加える優れた方法です。

このメソッドを編集する方法もあります。たとえば、ゴール数の代わりに、ゴール数を得点チャンスの数として使用し、他の要因に基づいてゴール数を計算する別の関数を使用できます (つまり、ランダムなストライカーを選択し、そのプレーヤーを個別に使用します)。統計、およびゴールキーパー、ゴールがあるかどうかを判断するため)

これが役立つことを願っています。

于 2009-09-06T22:54:19.307 に答える
4

サッカーにおける最も基本的な戦術的決定は、フォーメーションの選択です。これは、10 人の外野手選手をそれぞれ守備、中盤、攻撃に割り当てる 3 つの数字のセットです (例: 4/4/2)。

平均的な選手の強さを使用すると、単にその戦術を失うだけでなく、後退することになります。最強の防御は、1 人の非常に優れた選手によるものであり、彼に何らかの助けを与えることで、他のチームが得点する可能性が高くなります。レーティング 10 のプレーヤーが 1 人いる場合、平均は 10 です。レーティング 8 の別のプレーヤーを追加すると、平均は (9 に) 下がります。しかし、より多くの人員を防御に割り当てることは、防御を弱くするのではなく、強くする必要があります。

まず、すべてを平均ではなく合計に基づいて作成します。合計間の比率は、どのチームがどれだけ強いかを判断するためのスケールに依存しない優れた方法です。比率は、あらゆる範囲の強みを持つチームで予測可能な方法で機能するため、差よりも優れている傾向があります。得点したゴールの数を示す戦闘結果テーブルを設定できます(ゲームごと、半分ごと、移動ごとなど)。

次の戦術的な選択は、優れた選手を 1 人持つか、優れた選手を数人持つかです。1 対 1、コーナー、ロング ボールなど、ゲーム内で起こることを表すシナリオを設定することで、それを問題にすることができます。シナリオに参加するプレイヤーは最初にランダムに選ばれ、次にシナリオの結果がロールされます。1 つの結果として、別のシナリオが開始される可能性があります (ミッドフィールド パスがクロス リードにつながり、ヘディング チャンスにつながります)。

実際のフットボール マネージャー ゲームのレベルに近づける最後のステップは、ヘディング、パス、シュートなど、複数のタイプの強さの評価を選手に与えることです。次に、彼らがいるシナリオに適した強度評価を使用します.

于 2009-09-12T15:52:33.093 に答える
3

また、ユーザーが気に入らないシミュレーションについて質問することもできます。ゲームの最終的な結果を見るのではなく、チームが攻撃する機会があったのに防御が制御を取り戻した回数を知りたい可能性があります。だから代わりに

「あなたのチームは2-1で勝ちます

彼らは試合のハイライトを見たいと思っています:

「あなたのチームは2-1で勝ちます:
 -15分に得点。
 -他のチームがコントロールを取り、30分にゴールを狙いました。
   しかし、シュートは傍受されました、
 -再びコントロールを取り、$ PLAYER1が美しいゴールを決めました!
...など

ジェイミーが出発点として提案するようなものを使用し、ランダムに時間を選択し、攻撃的なプレーヤーの加重サンプリングに基づいて誰がゴールを決めたかを選択することができます(つまり、スコアが高いプレーヤーは、得点した人)。プレーヤーのレッドカード、怪我をした人、フィールド全体のストリーカーなど、ランダムな低確率のイベントを楽しんで追加することができます...

于 2009-09-11T14:47:43.987 に答える
3

あなたの例の除算は、どちらの側が優れているかに応じて出力変数のスケールを変更するため、おそらく悪い考えです。一般に、2 つの量を比較する場合、間隔データ (一方を他方から減算) または比率データ (一方を他方で割る) のいずれかが必要ですが、両方は必要ありません。

この場合のより良いアプローチは、単純に攻撃スコアを防御スコアで割ることです。両方が等しい場合、結果は 1 になります。攻撃側が防御側より優れている場合は 1 より大きくなり、防御側が強い場合は 1 より小さくなります。これらは扱いやすい数値です。

また、チーム全体を平均するのではなく、使用するフォーメーションや戦術に応じてチームの一部を平均します。これにより、チームは攻撃的または防御的にプレーすることを選択し、これの長所と短所を確認できます。

そして、より良い乱数生成関数を自分で作成してください。手始めに、-1 と 1 の間の浮動小数点値を返すものと、0 から 1 の範囲で機能するもの。これらを計算に使用すると、混乱を招く 10 をあらゆる場所で避けることができます。

于 2009-09-07T16:19:00.357 に答える
0

平均はプレーヤーの数である必要があります... 3 プレーヤーのチームがある場合、最大を使用すると次のようになります。

[4 4 4]

[7 4 1]

2番目のものは弱いと見なされます。それはあなたが望むものですか?あなたはむしろ次のようなことをしたいと思います:

(合計スコア / 合計プレイヤー数) + (最大スコア / 合計プレイヤー数) であるため、上記の例では、2 番目のチームの方がわずかに優れています。

それは、チームのバランスをどのように取るかによると思います。

于 2009-09-03T17:58:48.513 に答える