ターミナルで花札こいこいを遊べる CUI ゲーム「koikoi」を作った

ターミナルで動く花札こいこいゲーム koikoi をリリースしました。任天堂のルールに準拠していて、ターミナルさえあれば、すぐに対 CPU で遊べます。
モチベーション
普段、仕事でも、その日のライフログを書くのでも、ほとんどの作業を Claude Code で行っています。つまり、一日の大半を、いわゆる “黒い画面” を見て過ごしています。
これ自体は楽しいのですが、作業をしていると、次から次へとアイデアが浮かんできて、手が止まらなくなることがよくあります。気がつくと、何時間も続けて作業していて、頭がまったく休まっていない、という状態になっています。
そういうときに、意図的に頭を休めるために作ったのが、この koikoi です。
息抜きのつもりで携帯を手に取ったり、SNS を開いたりすると、今度はそちらから戻ってこられなくなります。タイムラインを眺めているうちに、ずいぶん時間が経ってしまう、ということが自分にはよくありました。
それなら、“黒い画面” から離れずに息抜きができればよい と思い、あえてターミナルで動く CUI にしました。
koikoi と打てば、その場でこいこいを一局打てて、終わったらまた作業に戻れます。SNS のように長居してしまうこともなく、画面を切り替える手間もありません。自分にとっては、これくらいの距離感が、ちょうどよい息抜きでした。
役判定は任天堂のルールに準拠していて、五光・赤短青短・猪鹿蝶といった役もきちんと判定します。
使い方
起動すると、まず親決めの演出(ルーレット風のアニメーション)が表示され、あとは画面の指示に従って、手札と場札を合わせていきます。
koikoi操作は、キーボードでもマウスでも行えます。
| キー | 操作 |
|---|---|
| ↑↓ / j k | 手札カーソル移動 |
| ←→ / h l | 場札・選択肢カーソル移動 |
| Enter / Space | 選択・決定 |
| ? | ヘルプ表示 |
| l | 行動履歴表示 |
| o | オプション設定 |
| q | 終了(確認あり) |
マウスにも対応しているので、手札・場札・ボタンをクリックして操作することもできます。
主な機能は次のとおりです。
- 🎴 任天堂ルール準拠のこいこい(役判定・排他制御つき)
- 🖱️ マウスクリック対応
- 🎰 親決め演出(ルーレット風アニメーション)
- 🤖 3 段階の CPU 難易度(かんたん / ふつう / つよい)
- 💾 ゲーム進捗の自動セーブ(途中で閉じても続きから)
- 🏆 リーチ(テンパイ)表示
CPU は、難易度によって打ち筋が変わります。「かんたん」はランダムな要素が多く、こいこいをしません。「ふつう」は札の価値を評価して最善手を選びます。「つよい」は役への近さも考慮して、積極的にこいこいを仕掛けてきます。慣れてきたら、「つよい」を相手にどこまで勝てるか、試してみてください。
ラウンド数や CPU 難易度は o キーのオプションから変更できます。設定とセーブデータは、それぞれ ~/.koikoi/settings.json と ~/.koikoi/game.json に保存されます。
導入方法
Go が入っていれば、go install で導入できます。
go install go.ngs.io/koikoi@latestmacOS / Linux なら、Homebrew でも入ります。
brew tap ngs/tap
brew install ngs/tap/koikoiソースからビルドする場合は、次のとおりです。
git clone https://github.com/ngs/go-koikoi.git
cd go-koikoi
go build -o koikoi .
./koikoiあとは koikoi と打てば起動します。
Under the hood
遊ぶうえでは知らなくても問題ない、技術的な裏側の話です。
実装は Go で書いていて、TUI には awesome-gocui/gocui を使っています。シングルバイナリで配布できるので、依存するランタイムなしに、go install や Homebrew で手軽に入れられるのは、Go を選んだ利点です。
設計は、おおむね責務ごとにファイルを分けています。
| ファイル | 役割 |
|---|---|
card.go | 全 48 枚の札定義、月・札種の定数 |
yaku.go | 役判定ロジック(任天堂ルール準拠、役どうしの排他制御を含む) |
game.go | ラウンド管理・マッチング処理・親決め |
cpu.go | CPU AI(3 段階の難易度) |
ui.go | gocui ベースの画面描画・キーバインド・マウス操作・フェーズ管理 |
settings.go / save.go | 設定とゲーム進捗の永続化 |
実装で手間がかかったのが、役判定の排他制御 です。たとえば、赤短と青短が両方そろったら「赤短青短」として一つにまとめる、五光が成立しているときは下位の四光・三光を二重に数えない、といった「役どうしの優先・打ち消し」を、ルールどおりに処理する必要があります。yaku.go は、ここをテストで固めながら書きました。
CPU の打ち筋 も、難易度ごとにロジックを変えています。「ふつう」は、場に出ている札との取り合わせから各手の価値を評価して、最善手を選びます。「つよい」は、さらに役への近さも加味して、勝負どころで積極的にこいこいを仕掛けます。
フィードバックのお願い
普段は、自分で遊んでいて気づいた不具合を直す、ゆるやかなメンテナンスで続けています。「この役の判定がおかしい」「この操作で落ちた」「CPU のこの打ち方は変ではないか」といった報告は、とても助かります。
バグ報告や機能リクエスト、プルリクエスト、それから「遊んでみました」という一言も歓迎しますので、お気軽にお声がけください。リポジトリはこちらです。
https://github.com/ngs/go-koikoi
ターミナルでの息抜きに、ぜひ一局遊んでみてください 🎴
関連記事
2020-06-17
2020-05-15