TL;DR
ブラックジャックのシミュレータを作りました
https://imam-blackjack-simulator.web.app/
github でソース公開してます
温かい目で見ていただければ。。。
前提
ブラックジャックのルール
- プレイヤーとディーラーがそれぞれ複数枚カードを引いて、21を超えない範囲でカードの値の合計が21に近いほうが勝ちです
- 21を超えると負けです
- 絵札は全部10点扱い、エースは1 or 11の都合の良いほうに数えます
- 詳しいルールはgoogle大先生に聞いてください(自分は ここ のサイトを見てます)
動機
- ブラックジャックおもろい
- が、負けるのはいや(まー当たり前)
- ブラックジャックは期待値-1%なので、基本的には
負ける=資金ショート
==> ということはいかに資金をショートさせないかがクリティカル
しかし、資金の増減がどれくらいのもんなのかよく分からんのでシミュレーションしたいなーと思いました
本題
やりたいこと(やること)
- 現実に忠実なシミュレータを作りたい
- ルールの違いをユーザーが設定できるように
- テーブルの違い(カード配給方式など)も反映したい
- カウンティングの効果も見える化したい
- マネーシステムも組み込みたい
モデル化
基本的には現実の世界を模してモデルを作ります。 DDDの考え方を応用します。
大枠だけモデル図をば。
コンポーネント
- カード: トランプカード。本来スートは関係ないが、一応持つ。
- カードセット: 現実にはない概念。プレイヤーのベット一つに対して作られるカードのまとまりのこと(スプリットすると増える)。
- カードディスペンサ: シュー方式・カタツムリ方式などを再現するために共通のインターフェースを持たせる
人
人は必ずカードを保持して勝ち負けを判断する主体なので、基本的には同じ。
- 人: 抽象クラス。カードセットを保持して勝ち負けをどうのこうのする主体
- プレイヤー: アクションを判断したりカードセットを複数持ったりできる
- ディーラー: 基本的にカードを持っているだけ
テーブル
コントローラの扱い。プレイヤーにアクションを尋ねてそれに応じてカードを引き、与えて。。。という動作をします。
本来はディーラーの仕事ですが、ディーラーとプレーヤーを並列に扱いたいのでディーラーもテーブルの指図に従うようにします。
現実もディーラーはハウスの決めたことしかしないので特に違和感はないですね。
サマリー
ゲームの結果を保持しておかないといけないので、つくります。
- ゲーム: 進行中のゲームを管理して、サマリー全体の面倒を見ます
- ターン: 1回のゲームを管理します
- アクション: プレイヤーの1回のアクションを記録します
ルール
管理すべきルールのグループごとにクラスを作成して管理します
- スプリットルール
- ダブルルール
- 配当ルール
ポリシー
プレイヤーのスタイルを表現
- マネーシステム
- カウンティング
ゲーム開始まで
テーブルの作成
- 初期化する
ルール・ポリシーを作成
- テーブルコンテキストとして与えます
プレイヤーの追加
- テーブルコンテキストからプレイヤー独自のポリシー部分を追加して初期化 -> テーブルに追加
1ゲームの流れ
カード配給
- プレイヤーとディーラーに2枚ずつカードを配給する
- ディーラーは最初に1枚しかとらない方式もありますが、そこは割愛
プレイヤーごとのターン
以下をずっと繰り返します
-
- プレイヤーにアクションを尋ねる(プレイヤーは自身のカードとディーラーのカードをもとにBSで判断する)
-
- アクションがカードを必要とするものであればカードを引いてプレイヤーに与える
-
- アクションが
None
であればそのプレイヤーのターンを終了する
- アクションが
決算
- ディーラーの合計点を計算してプレイヤーに渡し、勝ち負けとそれに伴うチップの増減を計算させる。(現実はディーラーが行いますが、情報をプレイヤーに持たせているので仕方がない)
- サマリーを記録する
アプリケーションについて
- vue.js + typescriptで実装してます
- 計算はすべてクライアントで(特に保存すべきデータもないので)
- デザインはフレームワークは入れてないですが、マテリアルデザインを意識してます
- グラフ描画はchart.js(これだけでキレイに見える説)
- トランプ画像は こちらのサイト から頂きました
TODOとか言い訳とか
- これだけ大そうに書いておきながら、個別のルールとか実装できてないです(増殖させるだけの作業ゲーにやる気が湧かない件)
- ソース汚い: そのうちリファクタします(するする詐欺かもしれない)
- できることをもう少し増やせればいいですね
感想
- モデル全体としては小規模ですが、それなりに良いモデルが作れたのではないかと思います(まぁ、これくらいだと誰がやってもあまり変わらないまでありますが......)
- シミュレータ動かすの楽しいけどいくらやっても勝率には関係なし(汗)
動かしてみて思ったことを こちらの記事 にまとめてます