戦う2つの軍隊の出力を計算する


20

Flashを使用して戦略ゲームをプログラミングしています。このゲームは、有名なゲーム「トラビアン」と非常によく似ています。

私の問題は次のとおりです。2つの軍隊の戦いの結果として失われた軍隊の計算をしようとしています。両軍は異なる種類のユニットを持っています。それらのいくつかは他のユニットに対して強く、他のタイプに対して弱いです。

戦闘の方程式にこの違いの効果をどのように置けばいいですか?

それらがattとdefポイントのみを持っている場合は簡単に思えますが、ユニットタイプの依存関係になると、私は失われます。


6
戦闘の結果は純粋に決定的である必要がありますか、それとも何らかのランダム性を使用しますか?
sum1stolemyname

4
それはマルチプレイヤーゲームとしてタグ付けされるべきではないと思います。なぜなら、それはOPによって与えられないからです。人間対AIかもしれません。そして、「型依存」によって、私たちは古典的な岩->はさみ->紙->岩型のことを話しているのでしょうか?
共産主義者ダック

回答:


10

ランチェスターの方程式を見るというアミットの提案に加えて、これはゲームデザインの決定であり、経験に基づいた事実ではないことを付け加えたいと思います。ユニットの種類を考慮したい場合は、その意味を決定する必要があります。これは、ゲームプレイに含めるすべての要因を含む方程式を選択することを意味します。歩兵を騎兵よりも良くしたい場合は、それが何を意味するのかを決める必要があります-例えば。歩兵100個に匹敵するのに必要な騎兵数は?誰が誰を攻撃するかは重要ですか?あなたは単に歩兵と騎兵に異なる攻撃と防御の価値を与えるだけでは十分ではないことを暗示しているようです-なぜですか?これらの値だけでは捉えられない、他に何を表現しようとしていますか?

プレーヤーがアプローチする方法に影響するため、ゲームでモデル化する要因を決定する必要があります。これらには、ユニットのサイズ/数量、ユニットタイプ、ユニットエクスペリエンス(ベテランステータスなど)、地形と環境への影響、攻撃と防御の違い(ある場合)、損傷と消耗をモデル化するかどうか、時間の経過をモデル化するかどうか戦闘、撤退または逃げる能力(士気のモデル化を含む可能性があります)、方程式にどれだけのランダム性が必要かなど。

これをすべて理解すると、いくつかの基本的な数学的アプローチが可能になります。多くのRPGが持っているような「ヒットするチャンス」システムを一巡することができます。d20戦闘システム。オリジナルのCivilizationゲームのように、1ラウンドの「攻撃vs防御」加重コイントスシステムを実行できます。乱数に属性を追加することで、それぞれの側にスコアを生成させることができ、最高値を獲得した人が勝者となります。また、これらのシステムを変更して、ラウンドごとに動作したり、ヒットポイントや士気ポイントなどを差し引いたりすることができます。どのシステムでも機能しますが、プレイしたい方法でバランスを取る必要があります。最終的に戦闘のモデリング方法の選択はゲーム設計の重要な部分であり、他の人があなたに与えることができるものではありません。


あなたは完全に正しいカイロタンです。ゲームの設計を開始する前に、戦いについていくつかのアイデアがありました。しかし、この質問を投稿して、より良い設計方法があり、それを実装する最善の方法を見つけました。私は両方の目的で勝ったと思います:)私の友人、これらの数学的アプローチについての詳細情報をどこで見つけられるか教えてください。また、システムの選択について尋ねるすべての質問に回答した場合、どのケースが私のケースに最適であるかをアドバイスしてもらえますか?ご清聴ありがとうございました:)
アリアルバラーニ

どちらが最適かはわかりませんが、必要に応じて、おそらく簡単に始めて改善する必要があります。トラビアンは、2つのユニットタイプ(歩兵と騎兵)と、それに応じてユニットあたり2つの防御スコアを備えた、単純な攻撃対防御システムを持っているようです。Civilization 1で使用されているように、戦闘を解決する簡単な方法は、攻撃者の攻撃スコアをその合計と防御者の防御スコアで除算することです。これにより、割合が得られます。次に、0〜100%の乱数を選択します。攻撃者の攻撃スコアよりも低い場合、攻撃者が勝ちます。それ以外の場合、ディフェンダーが勝ちます。
キロタン

15

Solar Realms Eliteの場合、戦争をモデル化するためのLanchesterの方程式に触発されました。戦闘の各ラウンドで同時にいくつかの戦いがありました。

最初の戦いでは、全員が兵士を攻撃しました。SREでは、兵士は兵士に最も適しています(じゃんけんではなく、歩兵、航空攻撃、深宇宙)。私は、兵士が最高の攻撃を受けた攻撃と防衛力を設定しました。

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

2番目の戦いでは、全員が防衛ステーションを攻撃しました。SRE戦闘機(空中)では、防衛ステーション(対空など)に対して最適です。

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

3番目の戦いでは、全員が重巡洋艦を攻撃しました。SREでは、重巡洋艦は宇宙にあり、他の重巡洋艦に対して最適です:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(使用した定数は覚えていません。これらは単なる例です。)戦闘の各ラウンドで、攻撃者は防御力の一部を失い、防御者は攻撃力の一部を失います。これは、ランチェスターの二乗法則(式はこちら)に対応すると思います。ランダム性を追加しましたが、正確な場所を覚えていません。戦闘の各ラウンドの後、軍隊は小さくなります。ラウンド数に上限を設けました。その後、負けた側は退却します。

地上の歩兵を深宇宙に発射することは現実的ではありませんでしたが、ゲームプレイ上の理由で、すべてのユニットが他のすべてのユニットと戦うことができました(効果は低下しました)。


12

「明示的な解決策が見つからない場合は、暗黙的な解決策を探してください」と言う傾向があります。1つの軍隊が一掃されるか撤退するまで、ゲームの結果に応じて内部で戦闘をシミュレートできます。

私は次のようなものを使用します:

戦闘の反復ごとに、すべてのユニットは日和見的であるため、可能な限りのダメージを与えようとします。各ユニットは、既知の長所/短所に基づいて、このラウンドを攻撃する敵ユニットを選択します。

その後、すべてのサブファイトが実行されます。例:

槍兵は騎兵隊に対して効果的であり、カバラライは射手に対して効果的であり、射手は槍兵に対して効果的である。

これらの基本ユニットの両方のタイプで構成される2つの軍隊間の戦いでは、すべての槍兵が騎兵隊を攻撃し、すべての騎兵隊が射手を攻撃し、すべての射手が槍兵を攻撃します。たとえば、一方の側に射手がいない場合、他方の側の騎兵隊は次に最適なタイプのターゲットを選択します(敵の騎兵ユニットである)

各ユニット-攻撃-ユニットイベントは個別に解決され、負けたユニットは損傷するか、破壊されたとマークされます。

個々の戦闘がすべて解決した後、重大な損傷または破壊を受けたすべてのユニットを削除します。

次の反復は、現在削減された軍隊を使用して開始されます。


この投稿に本当に同意します。戦闘を1つの方程式に減らすのではなく、戦闘を繰り返す方が良いです。そして、私は間違いなく少しランダム性を追加します。弱いディフェンダーがハイに転じてクリティカルを獲得するほどのわずかなチャンスがあるはずです。反復のもう1つの利点は、イベントのナレーションを作成してプレーヤーを表示できることです。「剣士は攻撃し、すぐに足軽を間引きが、その後カルバリは...到着し、」
ティム・ホルト

私はあなたの答えがとても好きです、そして、私はランダムにそれを実装すると思います:)
アリアルバラーニ

3

現在、ソーラーレルム(スターエンパイアエリート)のシンプルバージョンであるゲームのベータテストを行っています)のを行っており、Amitの方程式(上記)に似たものを使用することから始めました。特に、戦闘に3つのフェーズがあり、3つのうち2つを勝ち取らなければならないというアイデアが好きでした。しかし、私はまた、戦闘にランダムな要素を導入したかったため、いくつかの卓上ゲームの影響を受けました。

ゲームがスケーリングする場合、処理は懸念事項であるため、上記のsum1stolemynameで提案されている方法には従いたくありませんでしたが、サーバーではなくクライアントが結果を処理するためにクライアントを使用している場合、これは良いアプローチ。

戦闘を2つのフェーズ(Amitのモデルの3つのフェーズに類似)に分割することにしました:空中と地上。攻撃力と防御力を計算し、攻撃力をわずかに調整します(防御側に利点を与えるため)。その時点で、攻撃力と防御力が等しい場合、攻撃の勝利確率は50%です。そこから、攻撃者が防御者と比較してどれだけ多くの(または少ない)強さを持っているかに基づいて、勝利の確率を増減します。空気の簡単な方程式を次に示します。

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

chance_of_victoryが80を超えたり、5未満にならないように指定します。そこから、100個の乱数を生成し、その結果を地上戦に持ち越します。

私が満足に解決していないことの1つは、損害率です。しかし、私はこれを理解する良い方法は、chance_of_victoryを生成された乱数と比較し、それを使用して攻撃防御力の一部を死傷者とすることだと考えています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.