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

·1 分で読めます
ターミナルで花札こいこいを遊べる 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@latest

macOS / 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.goCPU AI(3 段階の難易度)
ui.gogocui ベースの画面描画・キーバインド・マウス操作・フェーズ管理
settings.go / save.go設定とゲーム進捗の永続化

実装で手間がかかったのが、役判定の排他制御 です。たとえば、赤短と青短が両方そろったら「赤短青短」として一つにまとめる、五光が成立しているときは下位の四光・三光を二重に数えない、といった「役どうしの優先・打ち消し」を、ルールどおりに処理する必要があります。yaku.go は、ここをテストで固めながら書きました。

CPU の打ち筋 も、難易度ごとにロジックを変えています。「ふつう」は、場に出ている札との取り合わせから各手の価値を評価して、最善手を選びます。「つよい」は、さらに役への近さも加味して、勝負どころで積極的にこいこいを仕掛けます。

フィードバックのお願い

普段は、自分で遊んでいて気づいた不具合を直す、ゆるやかなメンテナンスで続けています。「この役の判定がおかしい」「この操作で落ちた」「CPU のこの打ち方は変ではないか」といった報告は、とても助かります。

バグ報告や機能リクエスト、プルリクエスト、それから「遊んでみました」という一言も歓迎しますので、お気軽にお声がけください。リポジトリはこちらです。

https://github.com/ngs/go-koikoi

ターミナルでの息抜きに、ぜひ一局遊んでみてください 🎴