丸日記

丸海てらむの日記です

読み合いについて

丸海てらむです。

 

 

 

格闘ゲームとか囚人のジレンマとかの「読み合い」とか「心理戦」についてずっと言語化しようとしてて、最近TLでそんな話があったのもありこの際ブログにまとめてみようと思った。目的は主に、格闘ゲームボードゲームで読み合いをやるときに、自分や他の人がどうやっているかを言語化して、後々の試合でもそれを意識的に再現できるようにすること。

 

 

 

 

 

 

普通のジャンケンとグリコのジャンケン

例えば一番簡単なのでいえばジャンケンが読み合いである。グーチョキパーのどれを出すか。どれが正解かはわからない。

でもジャンケンならだいたい正解はみんな知ってる通りで、「どの手を出すかわからないようにする」のがだいたい正解である。もしくは、相手の手を読んでそれに勝てる手を出すとか。

 

ちょっと難しくすると、グリコのジャンケンというのがある。グーチョキパーそれぞれに、グリコ、チヨコレイト、パイナツプルと言葉が割り振られていて、勝つとその文字数ぶんだけポイントを得られる。だいたい階段とか長い廊下とかで遊んで、勝った文字数ぶんだけ歩き、ゴールに到達したら勝ち、というルールで遊ぶ。

これはちょっと難しい。単純にそれぞれの手を1/3ずつ出すのが最善手ではない。何故って、グーが弱いのだ。グーで勝っても3歩しか進めないのに、グーで負けると相手はパーなので6歩も進まれてしまう。パーは勝っても6歩負けても6歩、なんとチョキは勝てば6歩も進めるのに負けても3歩しか進まれない。だからグーが弱くてチョキが強いのである。

ということでチョキだけ出してればいいんじゃないか? もし相手が全部の手を1/3ずつ出す人間だったら、自分はずっとチョキだけ出してればそれで絶対勝てる。さてここで問題だ。相手がずっとチョキしか出さない人間だったらどうしますか。当然グーを出す。そしてずっと3歩ずつ進んで勝てる。じゃあグーも強いんじゃないか。

多くの人はここで思考停止する。「なんだ、結局どれも同じなんじゃないか。適当に1/3ずつ出そう」ところがやっぱりそうではない。全部チョキはおかしいが、1/3ずつはやはり損に決まっているのだ。じゃあ正解はどこにあるのか。

答えを言ってしまおう。正解は、グーを2/5、チョキを2/5、パーを1/5の確率で出すのが最善手になる。らしい。ナッシュ均衡とか言って、こういうのを研究する学問があるのだ。数学的に最善手を求めることができて、するとこうなるらしい。チョキは強いがチョキに勝てるグーも強い、そしてパーはたまにしか出さない。らしい。

とりあえずこの「グー2/5、チョキ2/5、パー1/5」の戦略を取れば、相手に読まれることはない。もし相手がこの割合で手を出してきているとわかっても、どうしようもないのだ。

読み合いのゲームには「必勝法」はない。あるのは「最善手」だけで、「この割合で戦えば、必ず1/2の確率で勝てる」というものである。

ちなみに厳密には例えばゴール前だと3歩でも6歩でも勝てるからグーとチョキの価値が同じみたいなことになって複雑になるけど、今回そこは無視します。

 

読み合いに「勝つ」ということ

さてここで読み合いというものを考えます。もしグリコのジャンケンをやるとして、お互いにこれがわかっていたら、お互いに「グー2/5、チョキ2/5、パー1/5」の確率で出して、勝率はお互い1/2、完全に運ゲーということになる。

しかし実際に人間同士でグリコのジャンケンをやると、得意不得意がけっこう生まれるもんである。ましてや格闘ゲームとかボードゲームとかの複雑なやつでやると、もう絶対勝てない人とかめちゃくちゃ強い人というのが発生する。単に操作が上手いとかじゃない、「読み合いが強い」人が存在するのだ。そういう人はどうやって読み合いをやっているのか。まだ自分の中でも整理がついていないけど、箇条書きにでも言語化しようとしてみる。

 

「最善手」を考える力

まずさっき言った「最善手」を見つけるのがそもそもめちゃくちゃ難しい。普通のジャンケンなら全部の手を1/3ずつ出すこと。グリコのジャンケンならグー2/5、チョキ2/5、パー1/5の割合で出すこと。グリコのジャンケンですら教えてもらわないと思いつかないというか、聞いてもまだ「ほんとにそれで勝てるの?」と思ってしまう。いや勝てるというよりはバランスが良くて負けないってだけなんだけど。

これが格闘ゲームとかボードゲームになると、もう計算するのがほとんど不可能になる。まず手の種類が何倍にもなる。お互いそうなので組み合わせはもっとヤバイことになる。そして得点が複雑になる。3歩と6歩は単純に倍だけど、「200ダメージ食らって距離が離れる」と「100ダメージ食らって画面端で密着される」とかを一体どう比べたらいい。そして、プレイヤーによって持っている選択肢が変わってくる。例えば「前ジャンプに対して空中投げで迎撃する」ができるのはたぶんウメハラだけである。「豪鬼の垂直ジャンプを見てから前ステップで潜り込む」ができるのもpunkくらいである。逆に初級者になると、コンボを知らないとか最速風神拳のコマンドが安定しないとかで、選択肢が減ったりする。ジャンケンで言えば初心者はグーが出せないけど上級者はグーとチーの合体したグッチが出せるとかである。さらにこれが人によって違うので、この人はグッチが出せるけど相手はチーパーが出せるとか、何なら試合始まってみたら見たことないグチグチパーとかいう手を出されたりして、もう意味不明である。

ということで最善手を計算するのが死ぬほど難しい。でもゲーマーは頑張って考えるのだ。単純に波動拳を何回くらい撃つか、前ジャンプを何回くらいやるか、というバランス感覚。これがどれくらい正解に近いか、がそもそも問われる。

 

相手の「傾向」を見る力

自分でなるべくバランスよく戦いながら、同時に相手のバランスの崩れに気づく力も問われる。例えばジャンケンで言えば、自分は全部の手を1/3ずつ出していたところ、相手がどうやら2回に1回以上の割合でグーを出していると気づく。そしたら自分はパーを増やすことで勝てるようになる。

これが肝である。相手にグーが多いことに気づいても、そのまま1/3ずつの割合で出していたら、勝率は変わらず1/2である。相手のグーの多さに気づき、そしてパーを増やすことで、初めて「勝てる」ことになる。相手はグーをいっぱい出しているのに自分はパーを出している。これで初めて、勝率五分五分のはずのジャンケンで、自分が「読み勝っている」という状態になる。そして相手がこれに気づかなければ、そのままパーで勝ち続けて勝率は5割を超えていく。五分五分のはずのジャンケンで「勝ち越す」という現象が起きる。

格闘ゲームボードゲームでも同じである。相手が波動拳を撃ちすぎていると思ったら前ジャンプを増やしたり、相手がやたらと飛んでくるなと思ったら波動拳を控えたり、逆に飛んでこないならたくさん撃つようにしたり。難しいことに、単に相手の癖に気づいただけではまだ何も起きない。自分がそれに合わせて手を変えることで、初めて利益が生まれる。

この「傾向」に気づけるかどうかもちょっと個人差がある。

 

「癖」を読む力

「癖」と「傾向」はちょっと別だと思っているので分けた。傾向というのは割合とか確率みたいなものである。癖というのはいわゆる一点読み、法則みたいなものである。

例えば癖というのは、「グーの後はチョキを出す」とか、「同じ手を連続で出さない」とか「あいこの後はもう一回同じ手を出す」とか「三回以上勝っているときは相手の直前の手に対して負ける手を選ぶ」とかである。格ゲーで言うと長いコンボを食らった後はリバサ昇竜しがちとか、波動拳を二回打った後は灼熱を打ちがちとかそういう。

実は人間の中には乱数が存在しないと思っている。神はサイコロを振らないと言うが、人間自身もサイコロではないのだ。この状況ではこうする、っていう条件反射というか法則で動いてるものだと思ってて、相手のそれを読むことで次の動きを予想することができる。

これもかなり個人差がある。試合やってると、なんとなくわかる瞬間があるのだ。

後は手の選び方の法則だけでなくて、「グーを出すときは手に力が入る」とか「パーを出すときは掛け声のときから手の形がパーになっている」とか「チョキを出す前は出す手をもう片方の手で触る」とかいう要素も読み合いに存在する。有名な例だとピッチャーがカーブを投げるとき舌が出るとか。

 

バランスよく手を出す力

さっきの「傾向を読む」話の裏返しで、手の出し方が偏らないようにするのもまた難しいものである。ジャンケンですらうっかりグーが多いとかチョキが少ないとかやりがちである。これも難しい。

 

癖を出さない力

これも「癖を読む」話の裏返しである。なるべく規則性が出ないように、常にランダムに手を出す必要がある。もちろん「最善手」として考えた割合通りに。ましてや、グーを出すときだけ手を握りしめる癖があるのに気づいたら、どの手でもギュっと握りしめるとかグーのときも力を抜くとかする必要がある。この自分の癖に気づいて修正できるかどうか。

 

 

 

 

こんなもんじゃなかろうか。

 

総括すると、「最善手となる割合を考える」「その割合通りに、偏りなく不規則に手を出す」「相手の手が最善手からどれだけ離れているかによって自分の手を変える」「相手の癖を読んで、それに勝てる手を選ぶ」ということになるんじゃないかと思う。一応格ゲーだとコンボ練習して出せる手を増やすとか反応速度を上げて後出しするとかもあるけどそれはアクション要素ぽいので今回は無視する。ちなみに僕は後出しのうまさだけで勝ってます。

 

実際の勝ちパターン、負けパターン

実践編を考える。

例えば「最善手の考え方に差がある」場合。グリコのジャンケンで言えば、ほんとは5回に1回くらいしか出さないパーを、2回に1回くらい出しちゃう人がいるとする。相手はそれに合わせてチョキを増やして勝っているが、負けているほうは「癖を読まれてるのかな」と勘違いして、いろんなパターンで手を出すが、結局パーが多すぎることには気づいてなくて割合はこれで合ってると思ってるので、パーをチョキで狩られ続けて負けるなど。

例えば「傾向の読み方に差がある」場合。今度は普通のジャンケンで考える。片方はグーが多くてもう片方はパーが多いとする。グーを出してたほうはやたらと負けるので、これは自分がグー多めで相手がパー多めなせいだと分析し、チョキ多めに変更する。さっきパー出してたほうは最初勝ってたのに途中からやたら負けるようになるが、それが相手がチョキを増やしたせいだとは気づけずにそのまま負けてしまう、など。

最後に「癖の読み方に差がある」場合。これも普通のジャンケンを考える。例えば「負けた後は必ず手を変える」癖のある人がいて、もう片方がそれに気づいた場合。しばらく普通にジャンケンは進んでいくが、癖が読まれた途端、後者のプレイヤーは「ジャンケンに勝ったら、直前の相手の手に負ける手を選ぶ」ことによって、「一度勝つと、次のジャンケンは必ず勝ちかあいこになる」ということになり、長い目で見るとまあ勝つ。とか。

 

 

 

 

こんなもんじゃなかろうか。ある程度網羅した気がする。

 

 

 

ドリブルガールの場合 考察

ちなみにこれを書くきっかけになったのはクラスメイズというゲームのドリブルガールというボス戦で、確かボス側は「フェイントするか、攻撃するか」という二択で、こっちは「バックロールを使うか、使わないか」という二択になっていた気がする。

この駆け引きを整理すると、それぞれの手の勝敗はこうなる。

 

  • まずボスが攻撃してこちらがバックロールをした場合。ボスに大ダメージが入る。こっちが勝つわけである。ただしバックロールを使うのでスタミナは5減る。
  • 次に、ボスがフェイントしてこちらがバックロールの場合、バックロールは不発になる。お互いダメージは入らないが、スタミナが5失われる上に次のターンも行動不能になった気がする。
  • 次に、ボスがフェイントしてこちらがバックロールを使わなかった場合。お互いダメージは受けない。あとスタミナが1回復する。
  • 最後に、ボスが攻撃してこちらがバックロールを使わなかった場合。こちらが大ダメージを受ける。あとスタミナが1回復する。

 

 ちなみにスタミナの最大値は20。ダメージに関しては、こちらのバックロールが確か3回くらい成功すれば倒せた気がする。向こうからの攻撃は、回復とか込みで5回くらい喰らったら死ぬ気がする。レベルや装備にもよるけど。そしてお互いにこの駆け引き以外でダメージが入ることはないとする。一応弓矢と薬品の範囲攻撃も当たるので、残数無限の装備品を取っていれば全く話が変わってくるが、今回は無い前提で考える。

ではこの読み合いを、どっちも人間が選ぶとしたら、最善手はどうなるか。

つまり僕がドリブルガールだったらどうするか。答えは簡単で、「一生フェイントする」。もし僕がドリブルガールだったら、一生フェイントします。 フェイントに対して相手が何もしてなくても別に何も起こらないし、そのうちバックロールしてくれればスタミナが尽きる。そして相手のスタミナが5以下になってるときか、フェイントに引っかかって行動不能になってる間だけ攻撃します。これで勝てる。もしほんとに一生フェイントしかしなかったら、相手もわかってバックロールしなくなるけど、別にこれ何も起きないのだ。百回でも千回でもフェイントし続けて、どうせそのうちバックロールを出してくれるのでそれから攻撃すればいい。もし一万回とか十万回もフェイントしてるうちずーっと何もしないでいるのなら、それから初めて一回だけ攻撃する。一万分の一の確率で攻撃してくる相手に、その一万分の一回だけバックロールを合わせる、なんて、不可能なんである。何ならほんとに攻撃せずずっとフェイントしてれば、勝てることはないけど負けることもない。まあ一万回というのは極端だけど、まあフェイント10回攻撃1回とかの割合でもほとんどプレイヤーに勝ち目はないと思う。

という。たぶんドリブルガール戦に関しては、実はこういう構造になってます。実況中は気づかなかったけど、この「フェイントに勝てる選択肢がない(フェイントを何回読んでも倒せない)」ってのがまずいとこかなあと思う。後は体力とかの関係で、最初のバックロールは説明のために必ず成功するとして、実質読み合いの回数がかなり少ないこと。バックロールを1回か2回成功させたら勝ってしまう。さらに相手の攻撃を食らうのをたぶん3回か5回喰らったらもう負けてしまう。というのもある。

つまりだな、「最善手を考えると必ずこちらが負けるようにできていて」「傾向を読むほどの時間がなく」「機械なので癖も出ない(設定されていない)」という状況なわけである。実際の自分の実況では「普通に考えたら勝ち目ないけど、とりあえずバックロールを使ってみるもフェイントされて、その次は何もしないでいて見たら攻撃されてパーティが半壊したので、読み合いではない手段で(アイテムとかあったので)別途撃破した」ということになった。読み合いの回数は二回。法則を見出すとか傾向を見るとかできる回数ではないわけである。

ゲームオーバーになって繰り返し戦闘するにしても、一回ロードするごとに2回とか3回とか、回復込みでも5回とかいうのはちょっとつらい。戦闘に勝っても読みのおかげか偶然かわからない。

 

で改善案いきます。

まず試行回数を増やすとか。テンポよくして、戦闘が終わるまでに10回とか20回くらいやり取りができるようになれば、一回目の戦闘中でも読んで読み勝つことができるんじゃないかと思う。

次に、お互いが最善手を選んだときに良い勝負になるようにして、かつ敵が最善手にある程度近い行動をしてくるとか。ドリブルガール戦はお互い最善を尽くすとプレイヤーが絶対勝てないようになっていて、なのに攻撃を多めに選んでくれる、という仕様になっている。ちょっともやもやする。

その上で、傾向とか癖を用意する。例えば攻撃がちょっと多めなのでプレイヤーがそれに気づくと勝てるとか、何かしら法則があってそれに気づくと有利になるとか。パンチアウト!は後者である。相手ボクサーの行動に明らかに癖があって、細かい所作から次に何をしてくるかわかるようになっている。単純だけど、知らないうちは何だ勝てねえってなって、気づくとひらりひらり避けて倒せるのが楽しい。「傾向を読む」ほうは気づくと結局一つの選択肢しか選ばないことになって、気づいた瞬間は楽しくてそのあと興ざめなんだけど、どうにかして「プレイヤーの択の偏りに反応して、ボス側もそれに合わせた択を選んでくる(また別の偏りが発生する)」みたいなことができるとなおすごいかなと思う。というかこれが読み合いな気がする。プレイヤーの過去何回かの手を覚えておいて、それと最善手(最善の割合)とを見比べて、ずれているぶんだけ自分もそれに勝てる形でずらして手を抽選する、みたいな。このズレの修正を、毎回じゃなくて10回ごとにやるとか。

すると「傾向を分析してプレイヤーが手を変える」「しばらく読み勝つ」「それに反応して相手も手を変える」「それを見てプレイヤーがまた手を変える」ということをやる必要があって、プレイヤーが敵の手を分析するのにかかる読み合い回数のさらに4倍とか5倍以上の回数が必要になる。スマブラだと例えば前ステ一回ぶんくらいの距離で睨み合ったときどうするか、って読み合いが一試合のうち20回とか30回とかくらい行われてる気がする。たぶん。その中で自分が「相手は大ジャンプから飛び込みが多いからガードを張ろう」ってやってガーキャンで切り返して、何回かやるうちに相手が学習してすかし掴みやってきたり、その掴みを二回か三回くらい喰らって今度は自分も回避を増やしたり、というあたりで試合が終わる。30回くらい読み合って、読んだ読まれたは一往復か一往復半くらいしかしていない。こんなもんである。上手いプレイヤーならもっと早いサイクルで回るかもしれないが、初心者だと100回やられてようやく気付くとかだと思う。

ということで読み合いを再現するには試行回数はけっこう大事なんじゃないかと思った。一戦闘の中でお互いの火力を下げて何度もやり合うか、パンチアウトみたいに何回もやり直させるか。

 

実装はけっこう難しそうだなあと思った。

 

自分が「読み合い」ゲームを作るとしたら

 

実装案を実際に考えて見る。

 

例えばグリコのジャンケンを用意する。NPCはグーを4/10、チョキを5/10、パーを1/10の確率で出すとする。つまり最善手よりパーが少なくてチョキが多い形にする。プレイヤーが全部の手を1/3ずつ出すならこのNPCが勝つ。なぜなら全部を1/3ずつ出すってことはグーとチョキが足りなくてパーが多いということなので、チョキ多めでいれば勝てるわけである。さらに「チョキは勝っても6歩、負けても3歩だからチョキ強いじゃん」とチョキばっか出すプレイヤーにも勝てる。なぜならこのNPCはほとんどパーを出さないからである。1/5から1/10というのはあからさますぎるか。もうちょっとマイルドでもいいかもしれん。とにかくこれでプレイヤーに「このNPCの手の傾向を読むか癖を読むかしよう」と思わせることができる。

読むのはとりあえず簡単である。グーとチョキばっかでパーを出さないので、グーを増やせばよい。ということでプレイヤーはグーばかり出すようになる。

ここでもう一つルーチンを仕込んでおく。ジャンケンN回ごとに(4<N<11くらいにするか)プレイヤーの過去の手を確認して、直近30回の手を確認する。そのうち、グーは12回、チョキは12回、パーは6回というのが最善手になるはずだけど、もしグーが多くチョキが少なかったらNPCはパーの割合を増やしてグーとチョキの割合を下げる、というようなことをする。

という理屈でできそうでは。僕プログラミングよくわかんないので実装できんのか一切謎だけど。わかんない。

 

ドリブルガールの場合 改善案

もうちょっとドリブルガール戦の例を考えて見る。改善案を。

試行回数を増やしたいと思うんだけど、十ターンとかニ十ターンとかやるとせっかくのスピード感がなくなってきちゃってあれな気がする。

あと、今から「お互い読み合う」ルーチンを作るのも死ぬほど大変かと思うので、傾向を読む系の読み合いよりは、単純な癖読みのほうが良い気がしてきた。パンチアウト!方式。

例えば特定の攻撃の前にメッセージが出るっていうのも、めちゃくちゃ簡単だけどその一つである。まあもうちょっと別の形で実装したくはある。

「フェイントを使うターンには通常攻撃が効く」というのを考えたけど、別にここ解消しても傾向での読み合いができるだけで、実装的に厳しそうなので今回はパスだ。読んだのを読み返す仕組みがないと、最善手が一手に決まって白けてしまう。

やはり癖読みの方向で作るほうが良い気がする。格ゲーでも楽しいのは結局一点読みだ。

で癖をいくつか用意するか。例えばドリブルガール戦ってわりとセリフやエフェクトが多いほうだけど、それらと次の行動が対応してるとか。フェイントするとき「おっと、攻撃すると思った?」だと次は攻撃で、例えば別セリフを用意してそのときは次フェイントが来るとか。自分にバフかけるときなんかエフェクトが出るけど、これが普通は緑だけど赤のときは次絶対攻撃してくるとか。

ベタだけど。結局こういうシステムが楽なんだろうなあと思う。

いや実装が楽かどうかはわかんないけど。むしろめんどそう。

 

難しいね。

 

長くなっちゃったのでこのへんで。