paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

【問題解説】プログラミングで一攫千金する人続出!その方法とは…?


paizaで公開中のプログラミングカードゲーム『一攫千金プログラミング~ボットdeジャックポット~』にたくさんのご挑戦ありがとうございました!

今回はプログラミング初心者の方向けに、ボットdeジャックポットをプレイするためのコーディング方法を解説します。(※解答コードはPythonで記述しています)


ボットdeジャックポットで遊んだ結果やご自分で書かれたコードなどは、ご自由にブログ等で公開していただいて構いません!また、プレゼント対象となる期間は終了しておりますが、何度でも挑戦していただけます)

ボットdeジャックポットの遊び方例


まず、必ずプレイヤーとディーラーの1対1の勝負となります。

使用するカードは52枚、1〜13のカード各4枚ずつで、ジョーカーは含みません。2 〜 10 は数字の通り、また、11, 12, 13 はブラックジャックにおける J, Q, K 同様 10 、 1 はブラックジャックにおける A と同様に 1 もしくは 11 として扱います。

通常のブラックジャックとは異なり、プレイヤーがとれる行動は以下の2種類です。

  • "HIT" と出力  カードを追加で1枚引く
  • "STAND" と出力  現在のカードで勝負

勝敗は最終的にカードの合計が 21 に近いほうが勝ちです。22 以上になってしまった場合は強制的に負けとなります。また、同点もディーラーの勝ちとなってしまうので、ディーラーの方が割と有利ですね。

初回の入力では、1行目には必ず 0 と貴方の所持チップ数が渡されます。その場合は、ベットするチップの枚数を出力するタイミングとなります。

入力に関してはディーラーによって違うので、まずは最初の「猫先生」の場合でやっていきます。

賭け方の効率はひとまず置いておいて、 100 枚ずつベットするプログラムにしておきましょう。賭け方を出力した後は、「猫先生」の場合はプレイヤーの手札がスペース区切りで入ってくるだけとなります。

こんな感じで、単純に 17 以上の場合は STAND 、 17 未満であれば HIT という動きをするプログラムを作成しました。エースの処理は省略して、とりあえず 1 として扱います。また 11 以上のカードは一旦全て 10 と変換して扱うようにしました。

この場合はディーラーと同じロジックに近い(エースの処理はしていませんが…)コードになるので、勝率はそこまでよくないかと思います。

これにエースの処理を追加しても、それほど劇的な効果はなさそう(使用するカードが52枚で、エースの出現自体が確率的に13分の1なので…)ですが、せっかくなので追加してみるとこんな感じですね。

とりあえず持てるエースの枚数は最大で 4 枚までありえるので、 N(Nは0から4枚) 枚中 0〜N枚 が 11 となるような全パターンで、 17 以上の数値があれば STAND 、なければ HIT としています。

これでも、まだそんなに強いコードではないですね。

■ベーシックストラテジーを考慮してみる?

ブラックジャックについていろいろ調べてみると、ヒットすべきかスタンドすべきかを確率的に計算した「ベーシックストラテジー」というものがあるそうです(条件がトランプのデッキ数が52枚を6組使うような場合のために計算されたものが多いようです)

というわけで、ベーシックストラテジーに従ったコードを書いてみましょう。ベーシックストラテジーは表として表示されている情報がほとんどですが、条件文っぽく整理してプログラミング。また、ボットdeジャックポットではスプリット、サレンダー、ダブルダウンが不可能なルールなので、そのへんも少しアレンジを入れます。

  • 8以下であれば必ずヒット
  • 9以上、16以下の場合はとりあえずヒット(ベーシックストラテジーの場合は、ディーラーの見せ札によりスタンド or ヒット or サレンダーを使い分けるようです)
  • 17以上であれば必ずスタンド
  • エースが1枚混ざった状態での 1と扱い 7 以下ならばヒット、8以上であれば 17 としスタンド(ベーシックストラテジーの場合は、ディーラーの見せ札によりスプリット or ダブルダウン or ヒットを使い分けるようです)

同じカードが来た場合は、 5,5や10,10や1, 1とかだとスプリットを行うべきケースやそのまま勝負すべきケースなどいろいろあるようですが……ボットdeジャックポットではスプリットできないので、上記のルールに従ってヒットかスタンドをします。

これをプログラミングすると…

案外シンプルなコードになりましたね。


ちなみに、ボットdeジャックポットではある程度ゲームを進めていくと、ディーラー側のカードが見える仕組みが解禁されます。

その場合は、9以上16以下のときはベーシックストラテジーのルールに従って、追加で条件分岐を加えられそうですね。具体的に言うと、手札合計が 12 〜 16 の時にディーラーの見せ札が 7 〜 10, A であればヒット(ただし特定条件下でサレンダー、ギブアップをする)などといった動きも組み込めそうです。

加えて、ボットdeジャックポットでは一組のトランプで勝負しているので、残りのカードが尽きるという状況もあります。そのへんを考慮するともっと強いコードができるかもしれません。




paiza転職は、転職時のミスマッチをなくし、エンジニアがより技術面にフォーカスしたやりがいある仕事を探せる転職サービスです。プログラミングスキルチェック(コーディングのテスト)を受けて、スコアが一定基準を超えれば、書類選考なしで複数の会社へ応募ができます。

詳しくはこちら
paiza転職


まずはスキルチェックだけ、という使い方もできます。すぐには転職を考えていない方でも、自分のプログラミングスキルを客観的に知ることができますので、興味がある方はぜひ一度ご覧ください。

詳しくはこちら
paizaのスキルチェック