4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ブラックジャックシミュレータを作ってみた

Last updated at Posted at 2019-12-27

TL;DR

ブラックジャックのシミュレータを作りました
https://imam-blackjack-simulator.web.app/

demo.png

github でソース公開してます

温かい目で見ていただければ。。。

前提

ブラックジャックのルール

  • プレイヤーとディーラーがそれぞれ複数枚カードを引いて、21を超えない範囲でカードの値の合計が21に近いほうが勝ちです
  • 21を超えると負けです
  • 絵札は全部10点扱い、エースは1 or 11の都合の良いほうに数えます
  • 詳しいルールはgoogle大先生に聞いてください(自分は ここ のサイトを見てます)

動機

  • ブラックジャックおもろい
  • が、負けるのはいや(まー当たり前)
  • ブラックジャックは期待値-1%なので、基本的には 負ける=資金ショート

==> ということはいかに資金をショートさせないかがクリティカル

しかし、資金の増減がどれくらいのもんなのかよく分からんのでシミュレーションしたいなーと思いました

本題

やりたいこと(やること)

  1. 現実に忠実なシミュレータを作りたい
    • ルールの違いをユーザーが設定できるように
    • テーブルの違い(カード配給方式など)も反映したい
  2. カウンティングの効果も見える化したい
  3. マネーシステムも組み込みたい

モデル化

基本的には現実の世界を模してモデルを作ります。 DDDの考え方を応用します。

大枠だけモデル図をば。

bj-model.png

コンポーネント

  • カード: トランプカード。本来スートは関係ないが、一応持つ。
  • カードセット: 現実にはない概念。プレイヤーのベット一つに対して作られるカードのまとまりのこと(スプリットすると増える)。
  • カードディスペンサ: シュー方式・カタツムリ方式などを再現するために共通のインターフェースを持たせる
     

人は必ずカードを保持して勝ち負けを判断する主体なので、基本的には同じ。

  • 人: 抽象クラス。カードセットを保持して勝ち負けをどうのこうのする主体
  • プレイヤー: アクションを判断したりカードセットを複数持ったりできる
  • ディーラー: 基本的にカードを持っているだけ

テーブル

コントローラの扱い。プレイヤーにアクションを尋ねてそれに応じてカードを引き、与えて。。。という動作をします。
本来はディーラーの仕事ですが、ディーラーとプレーヤーを並列に扱いたいのでディーラーもテーブルの指図に従うようにします。
現実もディーラーはハウスの決めたことしかしないので特に違和感はないですね。

サマリー

ゲームの結果を保持しておかないといけないので、つくります。

  • ゲーム: 進行中のゲームを管理して、サマリー全体の面倒を見ます
  • ターン: 1回のゲームを管理します
  • アクション: プレイヤーの1回のアクションを記録します

ルール

管理すべきルールのグループごとにクラスを作成して管理します

  • スプリットルール
  • ダブルルール
  • 配当ルール

ポリシー

プレイヤーのスタイルを表現

  • マネーシステム
  • カウンティング

ゲーム開始まで

テーブルの作成

  • 初期化する

ルール・ポリシーを作成

  • テーブルコンテキストとして与えます

プレイヤーの追加

  • テーブルコンテキストからプレイヤー独自のポリシー部分を追加して初期化 -> テーブルに追加

1ゲームの流れ

カード配給

  • プレイヤーとディーラーに2枚ずつカードを配給する
  • ディーラーは最初に1枚しかとらない方式もありますが、そこは割愛

プレイヤーごとのターン

以下をずっと繰り返します

    1. プレイヤーにアクションを尋ねる(プレイヤーは自身のカードとディーラーのカードをもとにBSで判断する)
    1. アクションがカードを必要とするものであればカードを引いてプレイヤーに与える
    1. アクションが None であればそのプレイヤーのターンを終了する

決算

  • ディーラーの合計点を計算してプレイヤーに渡し、勝ち負けとそれに伴うチップの増減を計算させる。(現実はディーラーが行いますが、情報をプレイヤーに持たせているので仕方がない)
  • サマリーを記録する

アプリケーションについて

  • vue.js + typescriptで実装してます
  • 計算はすべてクライアントで(特に保存すべきデータもないので)
  • デザインはフレームワークは入れてないですが、マテリアルデザインを意識してます
  • グラフ描画はchart.js(これだけでキレイに見える説)
  • トランプ画像は こちらのサイト から頂きました

TODOとか言い訳とか

  • これだけ大そうに書いておきながら、個別のルールとか実装できてないです(増殖させるだけの作業ゲーにやる気が湧かない件)
  • ソース汚い: そのうちリファクタします(するする詐欺かもしれない)
  • できることをもう少し増やせればいいですね

感想

  • モデル全体としては小規模ですが、それなりに良いモデルが作れたのではないかと思います(まぁ、これくらいだと誰がやってもあまり変わらないまでありますが......)
  • シミュレータ動かすの楽しいけどいくらやっても勝率には関係なし(汗)

動かしてみて思ったことを こちらの記事 にまとめてます

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?