Salvo · 考えるための糧
マスをクリックするという単純な行為の下には、隠された艦隊、確率で重みづけされた推論、そして隠蔽と発見という古典的な決闘をモデル化する決定論的なエンジンが横たわっています。3
英語で執筆・編集されました。この日本語版は機械翻訳によって作成されたものです。正確さが重要な箇所については、英語の原文が正式なものです。 英語の原文を読む →
ゲームの中心には一対の Board オブジェクトがあり、一方はあなたの隠された配置を、もう一方は相手の隠された配置を表しています。各ボードは罫線の引かれたグリッド上に置かれた艦隊を持ちますが、その位置は相手側からは隠されたままです。あなたが敵のグリッドに撃ち込む一方で AI はあなたのグリッドに撃ち込み、それぞれの一撃は艦に命中するか、何もない海に落ちるかのどちらかです。この二重ボードの構造こそが、隠された艦隊同士の決闘の根本的な情報の非対称性、すなわち各側は自分のボードを完全に把握しているものの、相手の配置はその射撃のパターンから推測することしかできないという状況を確立します。3
この構成の対称性こそが、このゲームに個性を与えています。どちらの側も相手の艦を直接見ることはありません。その代わり、両者は命中と外れというまばらなフィードバックから、隠されたグリッドの心的モデルを組み立てなければなりません。すべての一撃がデータとなり、すべての命中が可能性を絞り込み、すべての外れが検討対象から領域を消していきます。エンジンのゲームコーディネーターはこの二つのボードを管理し、射撃が記録され、命中が正しく帰属され、一方の艦隊がすべて沈められたときにのみゲームが終わることを保証します。3
プレイが始まる前に、エンジンは randomFleet を呼び出して AI の艦をランダムに配置します。このランダム性は恣意的なものではなく、シード化されています。つまり、あるシード値は常に同じ配置を生み出すということです。このシード化された決定論は、ゲームを再現可能でテスト可能にするための設計上の選択です。同じシードでゲームを実行すれば、同じ艦の配置、同じ AI の判断の並び、同じ結果が得られます。この性質は、デバッグにも、さまざまな条件下で AI がどう振る舞うかを理解するうえでも価値があります。3
艦隊が配置されてしまえば、プレイを支配するルールは固定され、決定論的です。AI はサイコロを振らず、エンジンはゲームの途中でランダム性を持ち込みません。AI が下すすべての判断は、それが維持している確率モデルから導かれ、あなたが撃つすべての一撃は記録され、分析されます。変動の唯一の源は、初期の艦隊配置を決めるシードです。つまりこのゲームは、突き詰めればパズルなのです。ルールという制約と射撃から得られるフィードバックのもとで、AI があなたの配置を推理するより先に、あなたは隠された配置を推理できるでしょうか。3
あなたが一撃を放つと、エンジンはそれを標的のボードに記録し、その一撃が命中したか外れたかを確認します。これは fire 関数を通じて行われ、この関数がボードの状態を更新して結果を判定します。命中はそのマスを艦が占めているものとして印をつけ、外れは何もない海として印をつけます。次にエンジンは、そのマスを含む艦のすべてのマスを調べて、その艦が完全に沈められたかどうかを確認します。ある艦のすべてのマスに命中していれば、その艦は撃沈となり、この情報は双方に伝えられます。3
勝利条件は単純ですが、重大です。相手の艦がすべて沈められたとき、その側が勝ちます。これは allSunk 関数を通じて確認され、この関数は相手のボード上のすべての艦が完全に命中を受けたかどうかを調べます。この条件が満たされると、ゲームは直ちに終了します。勝利条件のこの全か無かという性質のために、すべての一撃が重要になり、艦を素早く沈めなければならないという圧力は、自分の配置を明かさないようにする必要性と釣り合わされることになります。3
このゲームの相手は、単純なランダム射手ではありません。隠された各マスにどれほど艦が存在しそうかを比較検討する、確率ターゲティング型の AI です。AI は敵グリッドの確率モデルを維持し、射撃が行われてフィードバックが得られるたびにそれを更新します。残りの艦の配置制約のために艦が存在しえないマスは可能性が低いものとして印がつけられ、残りの配置を収めるために艦が存在しなければならないマスは可能性が高いものとして印がつけられます。そして AI は最も確率の高いマスに撃ち込み、当てずっぽうを情報に基づく探索へと変えるのです。3
この確率モデルは尤度の数学に根ざしており、そこでは事象は 0 から 1 の間の数で記述されます 2。確率が 0 であればその事象は起こりえず、確率が 1 であれば必ず起こります。AI はこうした数値的な記述を用いて射撃を導き、艦が見つかる確率が最も高いマスを優先します。このアプローチこそが、AI を純粋なランダム射手と区別し、その特徴的な狩りの振る舞いを与えているものです。
AI の振る舞いは、狩りと追撃という二つのフェーズで説明できます。狩りフェーズでは、AI は未発見の艦が最もありそうなマスに撃ち込むことで艦を探します。これは敵艦との最初の接触を見つけることを目指す広い探索です。命中が記録されると、AI は追撃フェーズに移行し、命中したマスの隣接マスに集中してその艦を沈め切ろうとします。この二段階のアプローチは、人間のプレイヤーがこのゲームに取り組むやり方を映しています。まず艦を見つけ、それから沈めるのです。3
狩りと追撃の切り替えは、直前の一撃が命中だったか外れだったかで決まります。直前の一撃が外れなら、AI は狩りモードに戻り、最も確率の高いマスを探します。直前の一撃が命中なら、AI は追撃モードに入り、命中したマスの隣接マスに撃ち込みます。この単純なルールが確率モデルと組み合わさることで、探索と活用のバランスをとる一貫した戦略が生まれます。AI はグリッドを探索して艦を見つけ、命中で得た知識を活用してその艦を効率よく沈めるのです。3
AI には、その振る舞いを調整する三段階の難易度の強さがあります。これらの強さは、AI が確率をどう重みづけし、どう判断を下すかに影響します。低い強さでは、AI はより多くの間違いを犯したり、狙いがそれほど攻撃的でなかったりするかもしれません。高い強さでは、AI の確率計算はより一貫し、狙いはより容赦のないものになります。この強さの幅があることで、プレイヤーは気軽なプレイから本気の勝負まで、自分に合った挑戦のレベルを見つけられます。
これらの強さの正確な実装は、エンジンの AI コンポーネントである SalvoAI クラスにあります。難易度レベルは、AI が確率モデルをどう解釈し、探索と活用のバランスをどうとるかを変更します。この設計によって、ゲームの根本的な仕組みを変えることなく、AI は気軽なプレイヤーにも取りつきやすく、経験豊かなプレイヤーにも手ごわいものになっています。3
古典的なルールの上に、ひとつのひねりが載っています。ソナーです。この能力を使うと、その手番の一撃と引き換えに、敵グリッドの 3×3 の範囲を読み取ることができます。ソナーは、3×3 の範囲内の各マスに艦があるか、何もない海かを明らかにします。この情報は艦の位置を絞り込むうえで計り知れない価値を持ちえますが、その手番の一撃を失うという代償を伴います。3
ソナーを使うかどうかの判断は、戦略的なものです。その情報はいつ代償に見合うのでしょうか。艦がなかなか見つからず苦戦しているなら、ソナーは必要な突破口を与えてくれるかもしれません。艦を沈める寸前なら、一撃を失う代償は大きすぎるかもしれません。ソナーはゲームに資源管理の層を加え、プレイヤーに情報の価値と行動の価値を天秤にかけることを強います。3
古典的なルールへのもうひとつのひねりは、1ゲームに1回の再配置です。各側はゲーム中に一度だけ、自分の艦のひとつを動かすことができます。この防御的な回避は手番を消費しないため、再配置したうえで、なおその手番に一撃を放つことができます。再配置の能力によって、脅かされている艦を危険から逃がしたり、より守りやすい位置に移したりできます。3
再配置の能力は一度きりの選択肢であり、だからこそ貴重です。いつ使うべきでしょうか。ある艦がまさに沈められようとしているなら、再配置がそれを救えます。現在の配置に自信があるなら、再配置は無駄になるかもしれません。再配置するかどうかは戦略的な判断であり、ゲームの現在の状態と相手のとりそうな行動を慎重に考慮する必要があります。3
これらすべての仕組みの根底にあるのは、1ターンに1発という古典的なルールです。各側はターンごとにちょうど一発ずつ撃ち、交互に手番を繰り返します。このルールがゲームのリズムを確立し、双方に等しく行動の機会があることを保証します。1ターンに1発というルールこそが、このゲームを速さの競争ではなく知恵の決闘にしているのです。3
この古典的なルールこそが、このゲームを海戦ゲーム(バトルシップ)の伝統に根づかせています。それは罫線の引かれたグリッド上で二人で遊ぶ戦略型の推理ゲームで、各プレイヤーの艦隊は相手から隠されています 1。1ターンに1発というルールこそが、このゲームを反射神経の試験ではなく、推理と確率の試験にしているのです。単純なルールですが、それがこのゲームに個性と挑戦しがいを与えています。
このエンジンは純粋で、シード化された決定論に従っており、自前のシード付き乱数生成器によって駆動されます。つまり、ゲームのあらゆる側面が、開始時に与えられたシード値によって決まるということです。同じシードが与えられれば、ゲームは常に、初期の艦隊配置から最後の一撃まで同じ出来事の並びを生み出します。この性質によって同じ状況を再現して検証できるため、ゲームはテスト可能になります。3
シード化された決定論は、ゲームを理解するうえでも意味を持ちます。特定の状況で AI がどう振る舞うかを理解したければ、特定のシードでゲームを実行し、その結果を観察できます。特定の戦略を試したければ、同じシードで何度もゲームを実行し、その戦略がどう機能するかを見ることができます。この再現性は、プレイヤーにとっても開発者にとっても価値ある特徴です。
Board with a hidden fleet, the human fires at the enemy fleet and the AI at the human's, one shot per turn (classic rules), fire records a hit or miss, and a side wins when the opponent's ships are all sunk (allSunk); the opponent is a probability-targeting SalvoAI with three difficulty strengths that "hunts" for ships by favouring the cells where an undiscovered ship is most likely to sit and then "targets" the neighbours of a hit to finish it; two twists sit on the classic rules, a sonar ping reveals a 3×3 ship/empty readout but costs that turn's shot, and each side may reposition one of its own ships once per game (a dodge that does not cost the turn); and the engine is pure and seeded-deterministic.