テキサスホールデムのゲーム設計

確率論

概要

 何となくテキサスホールデムのゲームを作ってみようという気分になっていて、設計を考えているのだが、テキサスホールデムは意外にルールがややこしい。また、実際のゲームのようにプレイヤーに自由を与えすぎる(レイズのチップ数を任意に定められる)と操作のテンポが悪くなってしまうような気がする。簡単にどのようなことを考えなければならないかをメモしていく。

 どういう方針のゲームにしたいかというと、

  1. 初期値として定めたチップからスタートして、敵プレイヤー(NPC)からチップを奪い取ることでチップを増やしていき、なるべく多くのチップを獲得することを目指す。チップが一定以上減少した敵プレイヤーは座席を離れ、別の敵プレイヤーが現れる。
  2. チップを多く獲得するほど、(チップを多く持っている)強い敵プレイヤーが座席に現れるようにする。保有しているチップの数がユーザのレベルを表すみたいなイメージだろうか。
  3. 最大獲得チップを記録しておき、この値を最大化することを目指す。勝てないレベルの敵プレイヤーが現れれると、チップを奪われて終わることになるため、この最大値で自分のプレイの強さを確認することができるだろう。
  4. おまけとしてイカサマ機能(手札の勝率確率を見えるようにする。敵プレイヤーの性格の情報を見えるようにするなど)を付ける。

のような感じだろうか。主要な関心事である敵プレイヤー(NPC)の設計(強い(あるいは弱い)AIをどうやって作ればよいかという話)については別のところで考えるとして、ゲーム設計上考慮しなければならない要素を列挙していこうと思う。

テーブルにおける状態変数とルール

 テキサスホールデムのプレイの外側(テーブル)にある状態変数は以下のとおりである。

  1. 座席に座っているプレイヤーの数
  2. 各プレイヤーが保有するチップの数
  3. ブラインド(最小の賭け金の数量)
  4. プレイヤーの座席の順番(ディーラーボタンを回す順番)
  5. 次のプレイでディーラーボタンを持つプレイヤー

これらの情報をデータとして保持していれば良いわけであるが、ゲームの設計上考慮すべき点を考えよう。一人用のゲームを想定し、自分以外のプレイヤーはすべてNPCであるとする。

 まず、座席に座っているプレイヤーの数はゲームの設定として固定/可変を最初に設定できるようにする。固定の場合は人数もユーザが指定することにする。固定の場合、離脱したNPCの後に次のNPCがすぐにやってくるようにすればよいだろう。可変の場合はランダムにプレイヤーが出入りして、2~10人になるようにするが、指数分布に従って離席、着席とかでモデリングすればよいだろう。NPCの離脱条件は、プレイ回数に比例して離席確率が上がるとか、NPCの保有するチップがユーザが保有するチップの数の半分以下になったら、など適当な条件を設定する。ゲームの性質上、チップの数に格差があるとチップが多いプレイヤーが有利になりすぎるためである。新しく入ってくるNPCはユーザが保有するチップと同じぐらいの枚数を持って入ってくるようにすればよいだろう。

 ビッグブラインドが支払うチップの数が最小の賭け金になるが、この大きさはユーザが保有するチップの1%程度になるように適宜引き上げた方が良いだろう。少ない金額でプレイを継続しても時間がかかるだけになってしまうように思う。プレイヤーの座席の順番やディーラーボタンは、番号(ID)で管理すればよいだろう。離脱するNPCの代わりに新しいNPCを補填する場合はディーラーボタンを持つプレイヤーの手前に入るように(ディーラーボタンが最後に回ってくる位置)追加するなどルールを決めておけばよいかもしれない。

プレイ中における状態変数とルール

 テキサスホールデムのプレイ中の状態変数は以下のとおりである。

  1. プレイヤーに配られたHole CardとCommunity Card
  2. 現在のベッティング・ラウンド(Pre-flop, Flop, Turn, River, Showdown)
  3. 意思決定の起点になるプレイヤーのID
  4. 次に意思決定をするプレイヤーのID
  5. プレイヤーがポットに投入したチップの数
  6. プレイヤーの状態(Live, Fold, All-inみたいな感じだろうか)
  7. ミニマムレイズの数量

意思決定の起点になるプレイヤーはビックブラインドの左隣(フロップ以降はスモールブラインド)であるが、レイズが行われた場合はレイズを行ったプレイヤーに変更になる。この起点になるプレイヤーの手前のプレイヤーまでが意思決定を行い、残っているプレイヤーの投入チップ数が等しくなっていれば、次のベッティング・ラウンドに移行するということになる(次のベッティングラウンドでは意思決定の起点になるプレイヤーはスモールブラインドのプレイヤーに戻す)。他に特筆して記述すべきことはなく、これらを管理すればよいというだけの話であるが、ユーザの操作をどのように設計するかが問題になるだろう。

 基本的に、ユーザの操作は三択であり、レイズ(ベット)、コール(チェック)、フォールドのうちいずれかを選択する。オールインはレイズした結果が保有チップを超えた場合や、保有チップを超えた賭け金でコールした場合、自動的にオールインにすればよいだろう。このうち、面倒くさい操作はレイズ(ベット)である。レイズはミニマムレイズの数量を超えていれば、基本的に任意の数量を指定することができる。しかし、これを任意にしようとするとテキストボックスで数量を入力させるという操作的にもプログラミング的にもやりたくない操作が生じることになる。

 所詮はゲームなので、ユーザの操作をもう少し限定的にして、選択ボックスで選べるレイズの額を制限してしまうというのが一つの方策だろう。ベットの場合は最小の金額がビッグブラインドの枚数なので、その枚数の何倍というのを指定されば良いだろう。レイズについては、現在の賭け金かミニマムレイズに対して、その何倍の額をレイズするかを指定させる。×1(ミニマムレイズ)、×2、×3ぐらいで良ければ、レイズボタンを3つ付けるでもいいかもしれない。もちろん、この方法ではプリフロップで一気に賭け金を吊り上げたいといった操作には対応できないので、選択ボックスの方がやはり現実的かもしれない。×1~×20ぐらい用意すればいいだろうか。いや、×1、×2、×3ぐらいしか使わないか・・・

プレイ後におけるルール

 1プレイが終わった後は、第2節の状態に戻るが、ポットに貯まったチップを配分しなければならない。現実のカジノにおけるテキサスホールデムでは、ポットに投入されたチップから2.5~10%ぐらいカジノの場所代として手数料(レーキ(Rake)という。これが寺銭(ハウスエッジ)であり、カジノの運営費になっている)が徴収されるらしい。そのため、返戻率が90~97.5%ぐらいのギャンブルになっていることに注意が必要である。理論上、カジノだけが儲かってすべてのプレイヤーが損をしている可能性があるし、実際にそうである場合も少なくないと思われる。このあたりは他の公営ギャンブルと仕組みは変わらないのだろう。ゲームとしてはこれを設定できるようにしてもいいけど、所詮ユーザからチップを奪う必要がないゲームなのでとりあえず手数料は考えない形式で良いだろう。

 テキサスホールデムは勝者総取りであるため、勝者が一人しかいない場合、ポットのチップがその勝者にすべて配分される。勝者が2人以上いる場合は、チップを均等に分割して配分する。勝者が3人など割り切れない場合は、残ったチップをスモールブラインドのプレイヤーに配分すればよいだろう。やっかいなケースはオールインのプレイヤーがいる場合である。オールインしたプレイヤーが負けた場合は勝者が総取りするだけであるが、オールインのプレイヤーが勝った場合の仕様が相当にややこしい。これは以下の手順で行う。

  1. 勝者は自分より賭け金が少ない他のオールインのプレイヤーのチップ、及び、自分が投入したチップと等しいチップの数(この合計額はサイド・ポットといわれる)を他のプレイヤーから受け取ることができる。
  2. 1.の手順で残ったチップについては、勝者であるプレイヤーより多くチップを投入しているプレイヤーのみで勝者の判定を行い、勝者であるプレイヤーが受け取る。
  3. サイドポットが複数ある場合は1.,2.の手順を繰り返す。

 具体例を挙げると、プレイヤー1が50枚でオールイン、プレイヤー2が150枚でオールイン、プレイヤー3と4が200枚投入しているとする。このとき、プレイヤー1が勝利した場合、プレイヤー1は200(50×4)枚受け取ることができる。残りの450枚については、プレイヤー1を除いたプレイヤー間で比較を行う。プレイヤー3か4が勝利であれば、通常の手続きで配分すればよい。プレイヤー2が勝利した場合は、プレイヤー2が受け取れるチップは300(100×3)枚となる。この場合、残りの150枚はプレイヤー3と4で比較を行い、勝者に配分するということになる。この例で、最初の勝者がプレイヤー2である場合は、プレイヤー2が受け取るチップは500(200+300)枚である。これはサイド・ポットを200,300,150と分けて、プレイヤー1は最初のサイド・ポットのみ、プレイヤー2は2つ目のサイドポットまでしか受け取る権利がないという考え方になるだろう。この処理をプログラムで実装するのが面倒臭そうに見える。

 チップの配分が終わったら、ディーラーボタンの移動、NPCプレイヤーの入退席処理などを行って、第2節の状態に戻るということになる。

敵プレイヤーが何も考えない場合

 ここまでのルールが実装できると、ゲームとしての体裁を一応整えることができる。敵プレイヤー(NPC)の設計は後で考えると書いたが、何も考えない決まった手順で行動する敵プレイヤーであれば容易に実装できるだろう。具体的には、ユーザの行動に対してすべて消極的に行動するようにするという方法である。すなわち、すべての手順でコール(チェック)のみを行い、レイズやフォールドをしてこない敵プレイヤーを考える方法である。この場合、賭け金はユーザが好きなように定めることができることを意味しており、ポーカーの手札の強さを適切に評価している限りはチップを増やし続けることができるという敵プレイヤーになる。最弱の敵とは言えないけど、これに勝てないようであれば、駆け引き以前にポーカーの手札の勝利確率を適切に計算できていないということになるだろう。

 ちなみに、オンラインカジノにおけるテキサスホールデムでは、二人対戦でこの形式の敵プレイヤー(ディーラー)が実装されていることが多いようである(もちろん、筆者はやったことないけど。おそらく日本からプレイすると違法行為であると思われる。)。ただし、プレイヤーは1回あたりのプレイについてアンテ(Ante)といわれる手数料を払う必要があり、かつ、レイズできる倍率にも上限があるため、どんなにうまくプレイしても期待値をプラスにすることができないように設計されているように見える。最適な戦略はコンピュータ上で容易にシミュレーションできるので、試してみれば期待値がプラスにならないことは比較的容易に確認できるのかもしれない。筆者が開発したいと思っているゲームは多人数プレイなので、この形式の敵プレイヤーだけだと敵プレイヤーが二人以上いる意味がなくなってしまうかもしれない。

 もう一つは、敵プレイヤーがランダムに行動してくる場合である。例えば、15%の確率でレイズ、80%の確率でコール(チェック)、5%の確率でフォールドしてくるなどの敵プレイヤーを考えることもできる。テキサスホールデムは意味もなくレイズしまくる(ブラフしまくる)プレイヤーというのは嫌な奴に見えるため、意味もなくレイズする確率が高いプレイヤーがいると、意外に負ける人も出てくるかもしれない。とりあえず、このあたりの仕様まで実装してゲームとしてプレイできるようにしてみた。以下のページを参照。