大森田不可止氏が語る『いただきストリート』に実装されたキャラクターAI:懐ゲーから辿るゲームAI技術史vol.3
『いただきストリート』とは?
1991年にアスキーから発売されたファミリーコンピュータ用ソフトで、『ドラゴンクエスト』シリーズでもおなじみの堀井雄二氏が考案したボードゲームです。サイコロを振って出た目の数だけマス目を進みながら、店や株を購入して資産を増やし、マップごとに設定された目標金額まで一番早く資産を増やし、スタート地点に戻ったプレイヤーが勝利となります。最大4人まで同時プレイが可能で、プレイヤーが4人に満たない場合はCPUキャラが参戦します。
マップ上のあちこちにある店を購入すると、以後他のプレイヤーが止まるたびに「買い物料」を、つまりお金をもらうことができます。逆に、他のプレイヤーが保有する店に止まった場合は、相手プレイヤーにお金を支払うことになります。
購入した店は、さらに増資をすることによって店の価値が上がり、他のプレイヤーが止まったときに支払ったり、店を売却する際の金額をアップさせることも可能です。また、銀行でエリア株を購入しておくと、そのエリアにある店を増資するなどの方法で株を値上がりさせることで、さらに儲けることができます。
続編のスーパーファミコン用ソフト、『いただきストリート2』からはエニックスが発売元となり、現在もシリーズ作品がスクウェア・エニックスから発売されています。
『いただきストリート』(以下、『いたスト』)に登場するCPUキャラは全部で7人。リスクを極力避ける堅実なプレイスタイルが持ち味のキャラクターもいれば、勝利のためならありとあらゆる手段を使う攻撃型のキャラクターもいるなど、それぞれ性格が異なるので1人で遊んでも十分に楽しめるのが特長です。
今年3月で、ちょうど発売30周年を迎えた『いたスト』では、キャラクターごとに異なる個性を出すために、どのようにしてAIを作っていたのでしょうか?
非力なハードでも動かせる、対数を利用したAIプログラムを開発
——本日はよろしくお願いいたします。まずは大森田さんが『いたスト』の開発に参加することになったきっかけから教えていただけますか?
大森田不可止氏(以下、大森田):ゲームスタジオの遠藤(雅伸)さんから「プログラマーを探しているんだけど、ゲームスタジオでは受けられないので、受けてくれないか?」と紹介されたのがきっかけです。
——『いたスト』の主な開発スタッフは、大森田さんのほかにどなたがいらっしゃいましたか?
大森田:プロデューサーは、当時『ファミコン通信』の編集長だった塩崎剛三さんです。サブのスタッフにはYanaKen(柳澤健二)さんと、キャラメル・ママの社長で『ドラゴンボール』の亀仙人のモデルになった松本常男さんがいました。企画は堀井さん、イラストは荒井清和さんで、サウンドはゲヱセン上野(利幸)さんですね。プログラマーは私1人でしたが、最後にピンチヒッターとして遠藤さんにも手伝っていただきました。
——開発中は、アスキーのオフィスに出掛けてプログラムを作っていたのですか?
大森田:基本的には自宅作業でしたが、だんだん忙しくなってきてからはアスキーに席を用意していただきました。ちょうど薗部(博之)さんと机を並べながら仕事をしていましたね。
——PCや開発機材は、どのようなものを使っていたのでしょうか?
大森田:ファミコン用ソフトなので、大規模な開発機材などは必要ありませんでした。当時はPC-9801でプログラムを書いてからコンパイルして、ROMに焼いてチェックしながら作っていたと思います。
——当時であれば、すでにファミコンソフト開発用のICE(In-Circuit Emulator)はあったと思いますが、ICEは使わなかったんですね。
大森田:ICEはなかったのですが、途中でRAMにデータを転送すると動かせる、ROMの代わりとしてRAMが使える環境ができましたので、それからは作業効率がアップしたように思います。
——『いたスト』に登場するCPUキャラは全部で7人いて、それぞれ性格が違っているようですね。個々の性格や設定は誰が決めたのでしょうか?
大森田:私が決めました。荒井さんがデザインしたキャラクターはすごく立っていたので、「こういう姿をしているから、こんな性格だろうな」と絵を見て想像しながら作りました。例えば、ゲームの中に「5倍買い」(※)というルールがあるのですが、これは普通の人はなかなかチャレンジしないんですよ。そこで、「水沢けいこ」というイケイケ風のお姉さんキャラに、無理矢理「5倍買い」をするプログラムを入れたりもしていました。要するに、CPUがチュートリアルの役割を果たせるようにしたんですね。
※「5倍買い」:自分以外のプレイヤーが保有する店に止まったときに、お店の5倍の金額を払って店を買収する行為。主に、特定のプレイヤーが同一エリアの店の独占を阻止する際に用いられる。
——開発がスタートしてから、ゲームが完成するまでにどのぐらいの時間が掛かりましたか?
大森田:開発期間がとにかく長くて、約3年掛かりました。私以外のスタッフはみんな仲良しで、塩崎さんが毎週土曜日の夜に、みんなを集めて企画会議を開きながら作っていましたが、堀井さんが中心になって作っていたように思います。堀井さんの頭の中には、最初から完成形が描けていたようで、「ここはどうしますか?」とか「あれはどうしますか?」と相談すると、翌週には「こういうふうに作って」と仕様を完成させて持ってきてくれましたね。
——CPUキャラのAI、思考ルーチンも、最後は堀井さんがチェックしてオーケーを出したのでしょうか?
大森田:そうですね。実際に遊んでいただいて、特に文句などは出ませんでしたから、これはオーケーだろうなと思って作りました。当時はまだ誰もAIのことが分からず、「AIって、どうやって作ればいいの?」という時代でしたので、『いたスト』のAIは私や堀井さんが以前にやっていた『モノポリー』の研究を土台にして作ってあります。
——そもそも、堀井さんが『いたスト』を企画したきかっけは、『モノポリー』にインスパイアされたところが大きかったわけですよね?
大森田:はい。『いたスト』にはアメリカ大陸のマップが登場するのですが、最初の完成したマップがまさにアメリカ大陸でした。そこから開発がなかなか進まなくなったので、私がPC-9801のBASICで試しにゲームを作り、それを実際に遊んでもらうことを繰り返しながら開発を進めていきました。堀井さん以外のスタッフは、過去にゲームを作った経験者がほとんどいなかったので、私が作ったものを実際に見てもらいながら開発していました。
——AIのプログラムの制作期間はどのぐらいでしたか?
大森田:6か月ぐらいで作って、あとは自分で遊びながら少しずつ修正して完成させました。自分で遊んでいると、「ここをちょっと直したいな」という部分がたくさん出てきてしまうので、かなり時間が掛かってしまいましたね。
それと、個人的に一番面白かったのは、『いたスト』というゲームが本当に面白いゲームなのかどうか、分からなくなってしまった時期があったんです。ですが、ある日遊び始めたら「アレ? これって意外と面白いな」と気付いたときがあって、これで大丈夫だという自信が持てました。
自信を持つまでの間は、何度も繰り返し見ているゲーム画面なので、他人が見て本当に面白く見えるのか、あまり自信が持てなかったのですが、自分で遊んでいるうちに楽しくなったので、これでいけるなと。
——では、デバッグやテストプレイにはどのぐらいの時間を割いたのでしょうか?
大森田:デバッグはあまりやっていなかったと思います。確か、関連スタッフが遊んでいる最中に不具合いを見付けたら報告してもらって修正する形でデバッグしていたとは思いますが、あまり直した記憶がないですね。私自身もメチャクチャ長い時間遊んでいましたし、もともとナムコにいた頃から(※)、私のプログラムはバグが少ないことで定評があったので(笑)。
※筆者補足:大森田氏は、かつてナムコでMSX版『キング&バルーン』や、ファミコン版『ギャラガ』などのプログラムを担当していた。
——CPUキャラが自身の行動を決定するプログラムは、どのような仕組みになっているのでしょうか?
大森田:例えば、誰にも買われていない店がまだ残っていれば、店を買うことを優先しますが、だんだんゲームを進めていくと高額物件が出現しますので、もし高額物件が出てきた場合は、そこを通り越せる場所に進むことを優先するようになります。もし高額物件の反対方向から進んでしまうと、次のターンでそこに止まっちゃう可能性が生じますからね。
つまり、支払期待値がなるべく下がる作戦を取るようにするために、どれを優先にするのかを決める数式を用意して、その計算させてっていうのをプログラムの中でやっているわけです。
——その数式は、具体的にどのような計算をするのでしょうか?
大森田:ファミコンのCPUで計算できるのは8ビットで、しかも掛け算ができないので、とにかく計算が苦手で時間が掛かるハードなんですよ。そこで、計算を簡単にするために8ビットの対数表を持たせてあります。対数を使うと掛け算が足し算になるので、非常に簡単に計算できるようになりますし、大小関係もちゃんと維持されますので。でも、本来ならば対数を元の数値に戻さなければいけないのですが、実際は元に戻さずに大小の比較チェックだけを実行していましたから、大雑把な計算しかできないんですよね。
——ファミコンみたいな8ビットのハードでは、容量的にも制約が厳しかったのでしょうか?
大森田:ええ。容量もそれほど大きくないですし、とにかく8ビットの計算しかできないのは厳しかったです。CPUにZ80を使っていれば16ビットの加減算まではできたのですが、ファミコンのCPUに使っていたのは完全8ビットの6502だったので、もし16ビットの計算をさせようとするとクロックをたくさん使わなくてはいけないので、何とかしてそれを回避する必要がありました。確か、ファミコンは1.7 MHzで、それが60分の1秒でワンセットの処理を終了させないといけない仕様でしたから、何とかその範囲内で計算ができるように工夫するのがなかなか大変でした。
収入・支出の期待値を調整してCPUキャラの個性を作成
——CPUキャラごとの性格や特徴などはどうやって調整したのでしょうか?
大森田:基本的には、先に数式を作っておいて、後からそれを修正しながら仕上げました。一度数式を作っておけば、あとはパラメーターを変えるだけで、キャラごとの個性が出せるんです。基本はあくまで数式ですが、例えば株の売買のように計算できない部分もありますので、そういう場合は人間のプレイヤーの真似をして動くようにしてあります。
——ゲーム中に、プレイヤーの行動を見て真似をするプログラムが入っていたんですか?
大森田:いえいえ。そうではなくて、開発中に私が別の人のプレイを見て、その人と同じ買い方をさせるプログラムそのものを組んだんです。
——AIを作るときは、ついつい強くしようとし過ぎると失敗するので、より人間らしくする必要がありますよね?
大森田:普通に一番バランスのいいキャラクターを作ろうとすると、みんな行動が似てきちゃうので、何とかそれを外すようにいろいろ仕込んでいました。さっきもお話をした「けいこ」の5倍買いもその一例ですね。「いただきストリート」では、バランスの取れたプレイが一番強いハズなのですが、そこから多少外れても意外と裏目に出て強かったりする面もあるんですよ。例えば、全然関係ない株を買ったら、後でたまたま値上がりしちゃうこともありますので。
——例えば、チャンスのマス目に止まってカードを引いた場合は、完全に運の要素で資産が突然増えたり減ったりしますからね。
大森田:ええ。多少は自由度の高いプレイをするようにプログラムは組んであったと思います。みんな同じような個性になると、遊んでいて面白くないですしね。一番プレイしたのは私でしたから、私自身が遊んでいて面白くなるようにちゃんと作ってありますよ(笑)
——AIに関しては、ほかのスタッフから何か意見や改善の要望を受けたことがありましたか?
大森田:AIがどう動いているのかを誰も想像できなかったみたいで、意見はあまり出てこなかったですね。AIに関しては、私のほうでかなり自由に作っていました。
——ちなみに、大森田さんは学生時代にAIの勉強をされたことはあったのでしょうか?
大森田:それほどはやっていなかったですね。学生の頃は、ちょうど第2次AIブームでニューラルネットワークが注目されていた時期だったので、多少は関連書籍を読んではいましたが、まだまだコンピューターが非力な時代でしたから、実際に試せる環境は全然ありませんでした。
——では、当時からAIへの興味自体はあったわけですね?
大森田:そうですね。薄くではありますが勉強していました。あの時代は遺伝的プログラミングとか、成果はほとんど出なかったのですが、いろいろと実験的なプログラムが流行したので、まあ面白い時代ではあったように思います。
——ニューラルネットワークから進化したものがディープランニングになるかと思いますが、「いたスト」では対戦を繰り返すごとに強くなる、学習するAIを作っていたのでしょうか?
大森田:ちょっとだけ考えましたが、ファミコンの性能ではそこまで実装することはできなかったですね。バックアップRAMの中に、いろいろな経験を積み上げること自体は可能なのですが、容量が2キロバイト程度しかなかったので、直前の局面を記憶するだけでもう精一杯でした(笑)。でも当時としては、あのハードであれだけのものを遊べるようにできていたこと自体が大きかったと思います。
——ターボファイル(※)を使っても、学習するAI実装は無理だったのでしょうか?
大森田:そうすると、開発がすごく大変になってしまう問題が出てきますね。もしプログラムを学習型にすると、特にデバッグがメチャクチャ大変になって、完成させようと思ったら相当な労力と気合いが必要になると思います。ゲームって、たまにしか起こらないことを仕込むと、デバッグが大変になるんです。
ある知り合いの会社で作ったシミュレーションゲームで、滅多に出ないイベントを仕込んだらデバッグで一度も発生しなくて困ったことがあったそうです。「本当に機能してるのかな?」って(笑)。プログラムを作るときは、そこまで考えなければいけないので難しくなりますよね。
※ターボファイル:アスキーが発売していたファミコン用データレコーダーのこと。乾電池による駆動で、対応するタイトルのプレイデータをセーブすることができた。
——『いたスト』における、AIのプログラムで最も工夫したポイントはどこですか?
大森田:やっぱり、対数が一番のキモでしょうね。掛け算をさせたくてもできないので、対数で何とかごまかそうと……(苦笑)。
——ソフトの発売後、『いたスト』のAIのプログラムについて同業者や業界内での評判はいかがでしたか?
大森田:あまり聞いたことはないのですが、「よく考えて行動するな」とはみんな言ってくれてましたね。
——後に、大森田さんはスーパーファミコン版の『モノポリー』(※1993年にトミーから発売)でもCPUキャラのAIを作ることになりますが、『いたスト』のプログラムで得た経験がここでも生かされたのでしょうか?
大森田:はい。『いたスト』の開発には3年掛かりましたが、『モノポリー』は以前から研究していた成果もあったので3か月で完成しました(笑)。
——『いたスト』では、プレイヤーが任意のタイミングで保有する店を競売に出したり、他のプレイヤーと交渉してお店を交換することもできますよね?
大森田:基本的には、収入期待値と支払期待値というものがあって、前者はできるだけ大きく、後者はできるだけ小さくするように計算するプログラムを組んでいますので、物件の交換とかの場合は、交換する前後で期待値がどう変化するのかを見たうえで判断しているハズですね。
——終盤戦になると、負けているCPUキャラがあえて相手に有利になるように店を交換するなどの方法で、イチかバチかの勝負を仕掛けることもあるようですが、これもあらかじめプログラムしていたのでしょうか?
大森田:ええ。それもやっていたかもしれませんね。支払期待値は大きくなってしまうけど、負けているときは多少のリスクは負わなくてはいけない、というプログラムも作ってあった気がします。要は、将棋の勝負手みたいなものですよね。ただし、8ビットの対数はすごく精度が低いので、もしかしたら精度が低かったせいで、たまたまそうなった可能性も無きにしもあらずですが(苦笑)……。
——参加プレイヤーを0人に設定すると、CPUキャラだけが参加するゲームを見ながらルールを勉強することもできますよね? 企画段階から、チュートリアルも兼ねた観戦モードを用意する構想があったのでしょうか?
大森田:いいえ。プログラマーの遊びです。「あ、こんなこともできるじゃん」と思いついたので、面白いかどうかは別にして「じゃあ、やっちゃえ」と作っただけですね(笑)。
——もしかして、0人プレイはもともとデバック用に作ったものを製品版にもそのまま残したのでしょうか?
大森田:いえいえ。そこまでの発想はなかったですね。デバッグの最中は、どの道ずっと画面を見ている必要がありましたから、自分でプレイしたほうが一番しやすかったんですよ。
CPUキャラの調整以外にもあった、AIのプログラムに工夫を凝らした理由
——ゲーム開始時に、CPUキャラの強さを「強い」「普通」「弱い」などのように、プレイヤーが任意に設定できる機能を実装しようというお考えはなかったのでしょうか?
大森田:それはなかったですね。個性を付けて、ちゃんとプレイできるCPUにするだけで手一杯で、そこまでは手が回りませんでした。キャラクターは全部で7人いますから、組み合わせによっては簡単だったり、逆に難しくなったりすることはあればいいかな、と思ったぐらいですね。
『いたスト』は、サイコロの目がかなり大きく影響するゲームで、いい目が出続ければ弱いキャラでもときどき勝ってしまうこともありますので、この点でも面白くできたなとは思います。
——サイコロの出目は、CPUキャラによってバラつきなどが発生するのでしょうか?
大森田:サイコロに関してはまったくいじっていません。一番最後に振られた目のデータは保存するように作ってあるので、電源を切ってからやり直してもまた同じ目が出るようになっています。それ以外のときは、基本的にはプレイヤーが順番を待っている間に乱数を更新しているので、ボタンを押すタイミングによって目が変わってしまうのですが、プレイヤーにはそれが伝わりませんので。つまり、サイコロのズルは一切しないプログラムにしてあります。
——現役のプログラマーに向けて、『いたスト』のAIプログラムで参考にしてほしい、あるいは継承してほしい部分などはありますか?
大森田:長いこと苦労しながら作ったので、それなりに愛着はありますが、今とはハードの能力が違いすぎるので……。ファミコンは8ビットでレジスタが3個しかありませんが、今のPCはレジスタが32個もあって、64ビットの浮動小数点演算を1クロックでできますしね。
ただ、ゲームを面白くする上での工夫は、色々と入っていると思います。CPUの能力が上がっても、ゲームに関して工夫する部分は今もそれほど変わっていない気がしますので。『いたスト』は、遊んでいるうちにいろいろなことが起きるので、CPUキャラを強くするにはどうすればいいのか、なかなか一筋縄ではいかないのも面白いところですね。自分でプログラムを作っていてすごく思いました。『いたスト』みたいな昔のゲームを、今のマシンパワーでリメイクしたら、もっと面白くなりそうですよね。今の『いたスト』シリーズでも、すでにAIはかなり賢くなっているとは思いますけど。
——ゲームを面白くするポイントについて、詳しく説明していただけますか?
大森田:実は、AI以外の部分にもいろいろあるのですが、例えば画面分割しているところですね。『いたスト』では画面分割をしているけれど、ハードウェアを載せていないんですよ。普通はタイマーチップとかを載せるのですが、力ずくで画面分割をさせていますので、もしAIの処理が重くなると、画面分割がときどき乱れることがあるんですよ。
——ナルホド。AIのプログラムをうまく作らないと、別のところでも支障が出ちゃうんですね。
大森田:それから、荒井さんにイラストをお願いするときに「ファミコンは4色まで使えますよ」と私が言ってしまったせいで、荒井さんが背景とは違った色を1色使ってキャラを描いちゃったんです。でも、せっかく描いていただいたので、何とかして5色とも表示させたいなあと考えていました。
そこで、5色のうち一番面積の小さいところに、スプライトをパッチとして充てる方法を思い付きました。例えば、赤が最も面積が小さかったら、スプライトを使って赤を出すみたいな処理をするわけですね。ですので、イラストを元にしながら、どの色の面積が一番小さいのかを計算するプログラムを作ってあります(笑)。
ただし、スプライトの面積が大きくなった場合は、下の画面の色が足りなくなって、その分だけでスプライトを借りてくる形になってしまうので、マップの色がチラつくようになってしまいましたね。ただ、プレイヤーの目線は上側、つまりキャラクターの方を向くだろうから、多分気付かれないだろうなと思っていました。でも、後から何人かに気付かれちゃいましたけど……。まあファミコンの性能では、多少のところは目をつぶらないといけない面はありましたね。
——細かいところで、すごい工夫をされていたんですね。
大森田:画面分割をしているので、分割するところまでにすべての処理を終わらさないといけないので、まあ大変でした。時間はあったので、いろいろと凝った処理を作っていましたね。
——もしかしたら、『いたスト』のようなゲームはオンラインでプレイデータ集めるようにすればAIをさらに強くできるのではないでしょうか?
大森田:そうですね。『いたスト』であれば、オンラインの実装はそれほど難しくはなさそうですし、今どきのAIの作り方ができるかもしれないですね。CPUキャラの数が7人いてちょうどよかったとは思いますが、もっと人数を増やして個性を出してもありかなあとは思います。
『モノポリー』のときは、CPUキャラを30人ぐらい作りましたが、そのなかには実在のプレイヤーをモデルにした人が2人いて、いつもその2人は張り合う設定にプログラムしたら、ちゃんとゲーム内で競い合うように動いてくれたので面白かったですね。
取材・文/鴫原盛之
©ARMOR PROJECT/ KADOKAWA CORPORATION