設計書 / v0.1 draft

PitCall

2026-08-23
個人用ハンド判定アプリ
対象: iOS / Web(PWA)

場のカードを入力した瞬間に、ベーシックストラテジーに基づく最適アクション(ヒット/スタンド/ダブル/スプリット/サレンダー)を返す、オフライン完結の判定アプリの設計書。

オフラインファースト ルール可変(デッキ数・S17/H17 等) カウンティング支援は任意モード
← ツールに戻る
§1

概要

ブラックジャックの最適解(ベーシックストラテジー)は、自分の手札とディーラーのアップカードの組み合わせだけで機械的に決まる。つまり本質は「状態→アクション」のルックアップであり、リアルタイム性より入力の速さと判定の正確さが価値を決める。PitCall はこの一点に絞ったツールとして設計する。

対応外とする範囲も明確にしておく。ライブディーラー映像の自動認識、複数ハンドの同時管理、賭け金の実運用連携(電子決済等)は初期スコープに含めない。

§2

想定ユーザーと利用シーン

学習用途

ベーシックストラテジーの習得

自宅練習やオンラインカジノのプレイ中に、判断が正しかったかをその場で確認しながら覚える。

リファレンス

ルール違いの早見

店舗・卓ごとにルール(デッキ数、サレンダー可否等)が異なるため、切り替えて即座に正解を引ける状態にする。

実卓での使用について。 多くの実店舗カジノは、卓上での電子機器・戦略表の使用を規則で禁止している。PitCall は自宅練習・オンラインプレイでの利用、および事前学習を主用途と位置づけ、実店舗での使用可否は各施設の規則に従う旨をアプリ内に明記する。
§3

機能仕様

3.1 ハンド入力 → 最適アクション判定

プレイヤーの手札(2〜3枚以上)とディーラーのアップカードをタップで入力し、即座に推奨アクションを1つ返す。数字入力ではなくカードランクのボタン選択(A, 2〜10, J/Q/K はまとめて「10」として扱う)にして、入力ミスを構造的に防ぐ。

3.2 ルール設定

戦略表は使用ルールによって一部の判定が変わるため、以下を設定画面で切り替え、判定ロジックに反映する。

3.3 カウンティング支援モード(任意)

基本機能とは別のモードとして、Hi-Lo方式のランニングカウント/トゥルーカウントの手動集計を補助する。カードが出るたびにタップでカウントを進め、残りデッキ数から自動でトゥルーカウントを算出し、カウントに応じたベット単位の目安(ベッティングレイシオ)を表示する。

これは学習・分析目的の機能であり、実店舗での使用は §2 の注意事項と同様の制約を受ける。

3.4 セッション記録

プレイ時間、ハンド数、自分の判断とアプリ推奨が一致したかの正答率を記録し、練習の進捗を可視化する。金銭の勝敗管理は行わない(賭博の実運用支援に踏み込まないためのスコープ制限)。

§4

画面設計

推奨アクションは色でも即座に判別できるよう、実際のカジノチップの慣習色に寄せた配色を割り当てる。数字(データ)と判断(色)を分離しないことで、判定結果を一瞬で読み取れるようにする。

HHIT
SSTAND
DDOUBLE
PSPLIT
RSURRENDER
PITCALLS17 · 6D
Dealer Upcard
7
Your Hand
10
6
Total 16 · Hard
01 — ハンド入力
PITCALL16 vs 7
HIT
EV -0.54 相当 · 最善手
02 — 推奨アクション
COUNTINGHi-Lo
+4
Running
+1.3
True
3.0 単位
推奨ベット
03 — カウンティング支援
§5

判定ロジック / データモデル

戦略表は「ハードハンド」「ソフトハンド」「ペア」の3系統のルックアップテーブルとして持ち、ルール設定(§3.2)ごとに差分を適用する構成にする。差分は表全体を複製せず、基本テーブル+条件付き上書きルールとして持たせることで、ルール組み合わせの増加に対してテーブル数が爆発しないようにする。

ハードハンド戦略表(抜粋・6-8デッキ / S17 / DAS可 の例)

Player \ Dealer2345678910A
17SSSSSSSSSS
16SSSSSHHHHH
15SSSSSHHHHH
13–14SSSSSHHHHH
12HHSSSHHHHH
11DDDDDDDDDH

数値の出所: 標準的な6〜8デッキ・S17ルールのベーシックストラテジー(データ構造の説明用の抜粋)。実装時は最終的にWizard of Odds等の一次情報で全マス突合し、ルールバリエーションごとに再検証する。

擬似コード

// hand: プレイヤー手札, upcard: ディーラーのアップカード, rules: §3.2の設定
function getAction(hand, upcard, rules):
  if isPair(hand) and canSplit(hand, rules):
    action = pairTable.lookup(hand.rank, upcard)
    if action is defined: return action

  if isSoft(hand):
    action = softTable.lookup(handTotal(hand), upcard)
  else:
    action = hardTable.lookup(handTotal(hand), upcard)

  return applyRuleOverrides(action, hand, rules)
  // 例: ダブル不可の局面では D → H にフォールバック
§6

アーキテクチャ

判定はテーブル参照のみで完結し、ネットワーク通信もサーバー側の状態も不要。したがってクライアント完結・オフラインファーストを基本方針にする。

推奨構成

PWA(Web)+ ネイティブラッパー

戦略表・判定ロジック・画面をすべてクライアント側の静的アプリとして実装し、Service Workerでオフライン動作させる。iOSでの配布が必要になった段階でCapacitor等でラップする。プラットフォーム別に判定ロジックを二重実装しないための選択。

データ保存

端末内ローカルストレージのみ

ルール設定・セッション記録は端末内(IndexedDB等)に保持。アカウント登録・サーバー送信は行わず、プレイ履歴という性質上プライバシーを優先する。

§7

精度保証

このアプリの価値は判定の正確さそのものなので、戦略表は実装後に自動テストで全マス検証する。ハード/ソフト/ペアの各テーブル × 主要ルールバリエーションの組み合わせについて、一次情報の戦略表と1マスずつ突合するテストケースを用意し、CIで回す。手動レビューに頼らない。

§8

利用上の注意

§9

開発ロードマップ

MVP

単一ルールでの基本判定

6-8デッキ・S17・DAS可の1ルールに固定し、ハンド入力→推奨アクション表示のみを実装。戦略表の正確さの検証を最優先する。

Phase 2

ルール可変対応

§3.2のルール設定と差分上書きロジックを実装し、複数のルールバリエーションに対応する。

Phase 3

カウンティング支援・セッション記録

Hi-Loカウント補助とベット目安表示、プレイ記録・正答率の可視化を追加する。