ターンベースのゲームまたはローグライクゲームでヒットを計算するための属性


22

プレイヤーがローグライクゲームで敵を攻撃したときのヒットを決定するための良い公式を見つけようとしています。単純化したものを思いつきますが、D&Dや、AngBandやNetHackのような人気のあるRoguelikesで行われている方法には変わりありません。

これまでのところ、プレーヤーと敵の属性の違いをランダムな整数とともに追加しています。

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

これにより、不自然なゲームプレイが可能になります。プレイヤーは弱い敵を見逃すことはありません。ターンベースのゲームなどで使用される属性ベースの戦闘のガイドを知っている人はいますか?D&Dルールを逐語的にコピーする必要がありますか?

回答:


18

「保証されたヒット」と「保証されたミス」のチャンス(つまり、子猫がドラゴンをヒットし、ドラゴンが子猫をミスするチャンス)をどのようにするかを考えます。ランダムな結果を保存し、パワーの差を適用する前に、それらの範囲内であればヒットをマークします。これにより、100%のヒット/ミスチャンスの問題が回避されます。ただし、ヒットのチャンスを常に提供する別のオプションがあります。

D&Dは、可能性のあるロール結果全体に確率が均等に分散される「フラット」システムです。他のシステムでは、通常は複数のサイコロを転がして追加することで達成される、より湾曲した分布を使用します。このような曲線を作成するのは簡単です(rand()+ rand())/ 2が思い浮かびます)。

別の可能性は、「サイコロの爆発」です。ShadowrunやSavage Worldsのようなシステムでは、可能な限り最大のダイスの結果をロールすると、そのダイスを再ロールして新しい結果を追加できます。ゲームでは、ランダムな結果が特定のしきい値を超えているかどうかをテストし、そうであれば、再びロールします。サイコロを無期限に爆発させた場合、最も低いゴブリンでさえ神に当たる可能性があり、明示的な「保証されたヒット」メカニックは必要ありません。

したがって、湾曲したロール、紛失の可能性を保証し、サイコロを爆発させる1つの可能なアプローチは、

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

もちろん、それはテストされておらず、バランスが取れていません。それらが正しいと感じるまで、すべてのマジックナンバーを調整する必要があります。

ルールを逐語的にコピーすることに関しては、それに関して法的および倫理的な問題があります。ただし、D&Dや他の卓上ゲームからインスピレーションを引き出しても大丈夫です。そもそも彼ら全員がデザインされたのです。また、プレーヤーにルールの正確な動作を示す必要はありません。また、スムーズな浮動小数点サイコロカーブを使用すると、物理的なサイコロの整数制約に制限するよりも良いフィーリングにつながることがわかります。


3
面白いタイプ宣言で、それはどの言語ですか?それとも単なる擬似コードですか?
-tenpn

2
私はそれがActionscriptまたはJavascriptかもしれないと思うが、それに私を保持しません。
共産主義のダック

それはActionscript 3です。私はFlash開発者です。
グレゴリーエイヴリーウィアー

6

これはゲームのバランスに関する質問であり、コーディングに関する質問ではないと想定しています。これを処理する方法はたくさんあります。既存のアルゴリズムから、必要以上に複雑になっていると思われます(3つの属性と乱数は、プレイヤーの観点からすると非常に泥だらけのシステムになります)。私の最初の本能は単純化することです!

複数の属性によって決定される結果ではなく、複数のことを行う属性を優先します。DEXは、命中率の主要な決定要因としてうまく機能します。他のすべてを追加すると、バランスを取るのが難しくなります。このように考えてください。各ヒットでのプレイヤーの予想されるダメージは、ヒットしたときの平均ダメージにヒット率を掛けたものです。非常に多くの変数を持つ「期待される」または「典型的な」ヒット%をどのように計算しますか?

別の問題があります。それは、あなたのフォーミュラがスケーリングしないということです。これはおそらくあなたが経験していることです。DEX、LUCK、およびSPEEDはゲームの過程で増加する傾向があると仮定すると、これらの統計のプレイヤーとモンスターの違いも増加する傾向があります。ちょうど例として、プレイヤーの初期のゲームのDEXが4から6の範囲にあり、モンスターもそうである場合、それは10-20%の命中率修正です。ゲームの後半の段階で範囲が10〜20の場合、それは最大100%の修正です。

これを修正する1つの方法は、統計を修正したままにすることです。プレイヤーとモンスターの範囲はゲーム全体を通して同じであり、+ 1 DEXのようなものを取得するのは非常に多く、非常にまれで、そのように扱われます(存在する場合)。その後、式はゲーム全体で正常に機能し、全体を通してほぼ同じ命中率のプレイヤーが表示されます。

もう1つの方法は、ハードコーディングされた「10」をレベルに合わせて変更することです。そのため、「10 +モンスターレベル」または「10 +ダンジョンレベル」などになります。それに応じて彼らの統計。

3番目の方法は、他の人が言ったように、許容上限値と下限値にハードキャップを設定し、「計算値がXより小さい場合は、代わりにXを使用する」と言うことです。

完全を期すために、最初にヒットヒットロールを含めなければならない絶対法則はないことを指摘します。効果のないゲームでアクションを実行することは特に楽しくはなく、まれな場合を除いて実際にエクスペリエンスに追加されることはありません。別の方法は、プレイヤーに常に攻撃を与え、ダメージ範囲を混乱させるだけで、他のプレイヤーよりもダメージが少なくなる場合があります。複雑なシステムは、プレーヤーよりもデザイナーにとって楽しいことを覚えておいてください。


これは素晴らしい答えです。
seanicus

3

クリティカルヒット(通常、見逃すことのできないボーナスダメージ)とクリティカルミス(何があっても見逃す可能性があり、プレイヤーを幻惑させる可能性があります)を追加することができます。


0

多くのゲームは、通常のヒット式に加えて、すべての要因に関係なくヒットの5%の変化を使用します。

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