見出し画像

FCキャプテン翼の演算部分と宇宙の戦士

はじめに

 この記事は「FCキャプテン翼の演算部分がどのように出来たか」という経緯と「どういう思考プロセスで構築されていったか」について書いたものです。
 前者は「昔のゲーム開発のお話」として、後者は「ゲームの演算システム構築の例」として、捉えられると思います。
 前者のお話は割と他の箇所でも書いていますから、今回は後者の「どういう思考プロセスで構築されていったか」を主に書こうと思っています。
 もし、なんらかの未経験の演算方式を作るハメに陥ったプランナーの方などの参考になれば、と。


FCキャプテン翼の演算部分の経緯

サッカーの選手の移動や対決部分の演算

 何か参考になるものは無いかと、スポーツのボードゲームなどを買って調べたりしました。
 確かバスケットのボードゲームを買って「これが参考になるかも!」とキャッホうふふしたのですが、移動の解像度が低く、このエリアからこのエリアにボールを移動させる、というもでした。
 1対1の対決の解決方法や2対1の場合などを期待したのですが。
 それはありませんでした。

つっぱり大相撲

 そんな中、外注で開発していたつっぱり大相撲が頓挫。発売日を発表していたので急遽社内で開発する事になりました。
 2ヶ月(3ヶ月だったかも)という短い期間での開発。
 私の担当は、試合内の力士のドット絵と試合内の仕様。能力のあるプログラマさんだったので、サクサク作ってくれる。
 ところが、力士の演算の所が大変な難所に。
 上手く機能しないのです。
 味方、敵力士ともHPを持っているのですが、このHPをどのように減らしたら良いか、という部分です。
 私はデータを使った方法で、プログラマさんは演算メインの方法でアプローチしましたが、上手く行かない。
 この演算部分でプログラマさんと衝突して、一時結構険悪な感じにもなりました。
 ある日、プログラマさん「消したから、演算部分のプログラム。考えて」と。
 頭が真っ白になりました。
 その後、どこをどうやって思い付いたのか、アバロンヒル社の「宇宙の戦士」というボードゲームの戦闘解決方法を下敷きにして、演算方法を構築しました。
 上手く行きました。
 どのような思考プロセスだったのかは、後述します。
 記憶を元に整理した形式になっていますので、過去の思考プロセスそのままでは無いと思います。
 こうして、つっぱり大相撲は完成し、キャプテン翼の開発に戻ります。

キャプテン翼の演算

「これ、つっぱりの演算とてるんだけど」
 キャプテン翼の演算仕様を読んだプログラマさんがそう言いました。
「そうさ、つっぱりの作ってる時に思ったんだ。これは翼にも使えるって」
 こういう会話をしたのを覚えています。
 キャプテン翼の開発を中断したつっぱり大相撲、そのつっぱり大相撲がキャプテン翼の演算のベースとなっていたのでした。
 いわゆる「人生何が役に立つか分からない」の法則の発動です。

おまけ

 この辺のお話、昔のHPに掲載しています。
 http://old.turu3.net/kipple/memory2.html

どういう思考プロセスで構築されていったか

まず「宇宙の戦士」というボードゲームの話を

 どんなボードゲームか?というのはこちらのサイトに詳しく書かれているので、読んでみると良いかな、と。
https://bodoge.hoobby.net/games/starship-troopers/reviews/24424?srsltid=AfmBOoqtvc2vgJmWo0E3qR-3a_v5C52iHV-sRKODRjpEUcyq8jV8L_9R
 ざっと説明すると。
 ロバートAハインラインの「宇宙の戦士」という小説(後に映画「スターシップトルーパーズ」になった)のボードゲーム、いわゆるウォーゲームというジャンルのボードゲームです。
 プレイヤー二人で地球側、宇宙人側としてプレイ。
 地球側は「起動歩兵」という、とても機動力に富んだ歩兵。何しろ、移動、攻撃、さらに移動、というヒットアンドウェイが出来る上に、ウォーゲームでは珍しいスタックが無制限。スタックというのは、マスの上に複数のコマをおく事。
 宇宙人側は、省略。知りたい方は先のサイトを見てね。
 で、このゲーム、大学生の頃、かなりやりました。ゲームは今でも押し入れにあります。
 後で出てきますが、この戦闘解決の方法が重要なので、説明しますね。

「宇宙の戦士」の戦闘解決方法

ここでは、地球側が宇宙人側を攻撃しているとします。

  • スタックしている攻撃側の攻撃力を合計する

  • 宇宙人の防御力を出す。防御側1ユニット単位で戦闘解決を行うので、攻撃対象の宇宙人のコマに書いてある「防御力」を見る。

  • 攻撃力合計/防御力 を計算し、戦闘比を出す。

  • 戦闘解決の表を用意。
     参考のサイトの割と下の方にありますね。

  • サイコロを振って、戦闘結果を決める。
     攻撃結果表、ExcelのA〜Zとかに相当する所が、戦闘比。1〜がサイコロの出目に相当。交差した所が戦闘結果。
     地形効果は場所によってサイコロの出目に影響を与えるものです。

 ここの戦闘比が重要なんです。後で出てきます。

つっぱり大相撲の演算

 紆余曲折の話は先にした通りです。
 最終的な演算の形式ですが、残念ながらテクモを退社する時、仕様書をコピーしてなかったので手元にありません。
 以下は、記憶で再現したものです。

 攻撃力=技+力士の攻撃力
 防御力=技に対する力士の防御力
 戦闘比=攻撃力/防御力

 その技の戦闘結果表、例えば「つり」だったら釣り上げられるかどうかの判定など。つっぱりだとダメージ量が表に記載されてます。
 確か乱数も加えてたと。
 記憶によると、戦闘比にいくらか加えてたような。
「宇宙の戦士」と同じく、戦闘比と戦闘結果表で結果(技の成功、ダメージ量など)を決めます。

この時の思考はどう走ったか?

 技毎にダメージ量が違うし、ダメージじゃない技もある。
 どうしよう?
 まず「宇宙の戦士」の攻撃結果表が頭に浮かびました。
 これだ!と。
 技毎の表にすれば、上手くいきそうだ。
 すると、サイコロは乱数。戦闘比は?
 初めは 攻撃力ー防御力、というRPGのダメージ計算のように考えていたのですが、どうも表との相性が悪い。
 当たり前ですね。戦闘比は割り算ですから。
 攻撃力といっても、それが実際の何を表しているか良くイメージできない。
 でも、戦闘比なら三倍あればこれくらいの効果はあるだろう、というのはイメージできる。
 敵の兵力の三倍あれば無傷で勝てる。(六倍という話もあるようですが)
 というのを思い出しました。
 そして「宇宙の戦士」と同じ、攻撃力/防御力で、戦闘比を出す事にした訳です。
 計算部分がロジックで、表の部分がデータ、というハイブリッドな構造になったのでした。

キャプテン翼

キャプテン翼の対決シーンの解決の場合は?

 ゲームの構造から対決の結果は決まっていました。
 ドリブル中の対決なら、オフェンス勝利(ドリブルで突破)、こぼれ球、ディフェンス勝利(ディフェンスがボールを取る)。
 シュート対キーパーなら、オフェンス勝利(ゴール!)、こぼれ球、ディフェンス勝利(キーパーがボールを取る、またはパンチングする)
 というように。

 そして、状況でのオフェンスの行動やディフェンスの行動も決まっています。
 ドリブル中対決の場合、オフェンス:ドリブル、パス、シュート。ディフェンス:マーク、タックル、パスカット。
 シュート対キーパーの場合、オフェンス:無し。ディフェンス:キャッチング、パンチング。

 演算に必要な要素として、選手のパラメータで、各コマンド毎のパラメータや、飛んで行くボールの威力、という内部パラメータも加わります。
 今書き出してみても「めんどくさい」が山盛りですね。
 さらに、パラメータの数値の重み付けとしての意味をどうイメージしたら良いか?というのもあります。
 このイメージは割と重要で、ドリブル30はパスカット30と対峙したら、どれくらいの割合で、それぞれの結果が出るのが良いか、という事につながるからです。

 こんなのに悩んでいた時に、つっぱり大相撲が割り込んで来た訳です。
 そして、前述の演算方法が導かれた、という流れです。

そして対決結果表に

 各対決のコマンドと結果は戦闘結果のようにまとめられます。
 全部を書くと長くなるので、1例を。
 ドリブル中の対決:オフェンス、ドリブル:ディフェンス、タックル
 結果:オフェンス勝利(ドリブル成功)、こぼれ球、ディフェンス成功(ディフェンスボールに)
 これに、ドリブルの威力とタックルの威力を使って、サイコロの出目にあたるものが用意できれば、表の完成です。
 その前に、選手のパラメータのドリブル力からドリブルの威力、というように一度変換しています。
 確か、選手の基本パラメータ+ドリブル力=ドリブルの威力、というようにしていたかと。
 それとこのドリブルの威力は変動したと思います。
 例えば3人に囲まれているとして、ドリブルの威力が大きくても、一人目で-10、二人目で-10、となって行けば、多人数で囲めばディフェンスがボールを取れる可能性が高まる、というような。
 漫画のキャプテン翼でシュートがディフェンスを吹き飛ばしていきますが、それをモデル化して、ディフェンスを吹き飛ばすと、シュートの威力が減衰する、というのも同じ考え方からです。何人もが吹き飛ばされて、ボールの威力は弱まり、キーパーがゴールを守る事が出来る。
 このモデル化、というのも重要な点です。
 話を元に戻すと、ドリブルの威力とタックルの威力、この数値をどうやって表に割り当てるか。
 これも初めはつっぱり大相撲の時と同じく引き算で行おうと考えていました。
 しかし、つっぱり大相撲で割り算を使い、戦闘比を出す方法を使って上手くいった経験から、翼でも戦闘比で行おうと。
 戦闘比=ドリブル威力/タックルの威力
 ここでもドリブルの威力がタックルの威力の三倍なら、余裕でドリブル成功だよね、というイメージを掴む事ができます。
 これが引き算だと、差が10の時と20の時でどう違うの?という、これまた循環する悩みの渦に囚われてしまいます。
 これも数値のモデル化ですね。

 こうやって、対決結果表が出来上がりました。

パラメータの数値イメージ

 各選手には選手レベルというのが割り当てられており、そのレベルに応じて各パラメータの基本値が決まり、それに個性パターンからの修正値が加わる形式だったと思います。
 ここで選手レベルというのが出てきますが、各パラメータと選手レベルの関係はどうするか?という問題が出てきます。
 この辺りは、難易度を作った方と相談してモデル化しました。
 具体的な数値は覚えていないので、以下の数値はご参考までに。
 レベル差が5あると、標準的なレベル6の選手のドリブルをレベル1の選手のタックルでは止められない。
 という定義です。
 止められない、という結果は、先の話で三倍の能力差、という事になります。
 5レベル差は、三倍の能力差、と導けます。
 数学に強い方なら「ははぁ、対数だな」と気づくと思います。私自身はそこまで数学に強く無いので述べるのを差し控えたいと思います。
 さて、5レベル差で三倍になるように選手のパラメータを作れば、先の演算式と表で思った通りの結果が出せるようになります。

パラメータの数値イメージの補足

 選手パラメータ、翼の1では数値を決めて、割り算で求めていましたが、レベル差が5、という調整で上手く行ったので(調整したのは私じゃ無いですが)、確か翼2か3で、パラメータをレベル数に変えて、レベルの引き算で求めるようにしたと思います。
 選手パラメータはレベル数(確か小数部ありだったと)で持ち、表示する時はそれをレベルと数値の対応表で数値化してたんじゃないかと。

どうやったらその行動の結果を決めたら良いか分からない場合のアプローチ

 つっぱり大相撲、キャプテン翼、行動と結果の割り出し方が分からず困った話と、その解決策のお話をしました。
 では「どうやったらその行動の結果を決めたら良いか分からない場合」どうアプローチすれば良いか、について分かる範囲でお話ししようと思います。

入力と出力を整理する

 何をしたら、どうなる、という形式をまず考えます。
「何をしたら」は入力、「どうなる」は出力です。
 キャプテン翼の例では、ドリブル中の対決では、入力は「ドリブル」「タックル」などになりますね。
 ここで「ドリブル中の対決」「オフェンス」「ディフェンス」という分類が出てきます。
 これらの項目毎に要素を書き出すのが「入力」の一覧の作成になります。
「ドリブル中の対決」の他にどんな対決があるか、というのも一覧の作成作業です。

 出力は、対決の結果生じる現象です。これもそれぞれの「対決」や「オフェンス」「ディフェンス」毎に書き出します。

入力と出力を図にしてみる

 入力と出力との関係を図にしてみます。全部です。
 しばらく眺めてみます。
 そしたらパッと、思い付いたら良いのですが、なかなかそうはいきません。
 類似する関係のものが無いか、記憶を探るのも良いですし、調べてみるのも良いでしょう。
 良いプロンプトが思いつけば、AIに質問してヒントを得るのも良いと思います。

 別のアプローチとしては、出力の割り振り方と関連する要素(翼の場合は選手のパラメータのような)を書き加える方法です。
 選手パラメータも入力要素ですね。
 具体的な数値があれば、それを入れてみると良いでしょう。
 数値間の関係をモデル化できれば、後はモデルを仕様に落とすだけ、と言う段階になります。
 つっぱり大相撲や翼の場合は三倍、と言うのがモデル化の基本となりました。三倍だから割り算だった訳です。5レベル差なら引き算です。
 このようなものを見つける訳です。

 ドリブル中対決の結果 = F(オフェンス行動とそのパラメータ、ディフェンス行動とそのパラメータ)

 というモデルになり

 ドリブル成功 = オフェンス行動のパラメータ ≧ ディフェンス行動のパラメータ x 3
 という事になります。

 この具体的な数値関係からF()という関数の中身を考えるというアプローチです。
 結果がダメージ量のような数値でしたら、関数の中身は計算式、という事になると思います。
 つっぱり大相撲やキャプテン翼の結果のように状況が変わるもの場合は、結果表を取り入れると良いと思います。

おわりに

 モデル化を考える下準備の考察を「おわりに」に書こうと思います。

 色々なゲーム(コンピュータゲームに関わらず)の入力、出力のモデルを理解して、頭の引き出しに入れておくのはとても良い方法だと思います。
 ゲームを遊ぶ際、この結果はどんなモデル化やアルゴリズムで導かれているんだろう?という好奇心を持って、遊ぶと事です。
 ボードゲームなどは、入力と出力の機序がルールとして書かれているので、参考にしやすいですし、コンピュータゲームならそのゲームの攻略サイトに攻略方法としてその機序が書かれている場合もあるでしょう。
 遊んだり、興味を持って情報を探したりすると、頭の引き出しに蓄えられていきます。
 大事なのは「好奇心」「興味を持つ」だと、思っています。

 この記事が、未経験の演算方式を作るハメに陥ったプランナーの方などのお役に立てれば幸いです。

宜しければ、ゲーム制作などのクリエーター活動のサポートをお願い致します。