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

*2026-06-15*

> ターミナルで動く花札こいこいゲーム koikoi をリリースしました


ターミナルで動く花札こいこいゲーム **[koikoi](https://github.com/ngs/go-koikoi)** をリリースしました。任天堂のルールに準拠していて、ターミナルさえあれば、すぐに対 CPU で遊べます。

<!--more-->

## モチベーション

普段、仕事でも、その日のライフログを書くのでも、ほとんどの作業を Claude Code で行っています。つまり、一日の大半を、いわゆる **"黒い画面"** を見て過ごしています。

これ自体は楽しいのですが、作業をしていると、次から次へとアイデアが浮かんできて、手が止まらなくなることがよくあります。気がつくと、何時間も続けて作業していて、頭がまったく休まっていない、という状態になっています。

そういうときに、意図的に頭を休めるために作ったのが、この koikoi です。

息抜きのつもりで携帯を手に取ったり、SNS を開いたりすると、今度はそちらから戻ってこられなくなります。タイムラインを眺めているうちに、ずいぶん時間が経ってしまう、ということが自分にはよくありました。

それなら、**"黒い画面" から離れずに息抜きができればよい** と思い、あえてターミナルで動く TUI にしました。

`koikoi` と打てば、その場でこいこいを一局打てて、終わったらまた作業に戻れます。SNS のように長居してしまうこともなく、画面を切り替える手間もありません。自分にとっては、これくらいの距離感が、ちょうどよい息抜きでした。

役判定は任天堂のルールに準拠していて、五光・赤短青短・猪鹿蝶といった役もきちんと判定します。

## 使い方

起動すると、まず親決めの演出（ルーレット風のアニメーション）が表示され、あとは画面の指示に従って、手札と場札を合わせていきます。

```bash
koikoi
```

操作は、キーボードでもマウスでも行えます。

| キー | 操作 |
|------|------|
| ↑↓ / j k | 手札カーソル移動 |
| ←→ / h l | 場札・選択肢カーソル移動 |
| Enter / Space | 選択・決定 |
| ? | ヘルプ表示 |
| l | 行動履歴表示 |
| o | オプション設定 |
| q | 終了（確認あり） |

マウスにも対応しているので、手札・場札・ボタンをクリックして操作することもできます。

主な機能は次のとおりです。

- 🎴 任天堂ルール準拠のこいこい（役判定・排他制御つき）
- 🖱️ マウスクリック対応
- 🎰 親決め演出（ルーレット風アニメーション）
- 🤖 3 段階の CPU 難易度（かんたん / ふつう / つよい）
- 💾 ゲーム進捗の自動セーブ（途中で閉じても続きから）
- 🏆 リーチ（テンパイ）表示

CPU は、難易度によって打ち筋が変わります。「かんたん」はランダムな要素が多く、こいこいをしません。「ふつう」は札の価値を評価して最善手を選びます。「つよい」は役への近さも考慮して、積極的にこいこいを仕掛けてきます。慣れてきたら、「つよい」を相手にどこまで勝てるか、試してみてください。

ラウンド数や CPU 難易度は `o` キーのオプションから変更できます。設定とセーブデータは、それぞれ `~/.koikoi/settings.json` と `~/.koikoi/game.json` に保存されます。

## 導入方法

Go が入っていれば、`go install` で導入できます。

```bash
go install go.ngs.io/koikoi@latest
```

macOS / Linux なら、Homebrew でも入ります。

```bash
brew tap ngs/tap
brew install ngs/tap/koikoi
```

ソースからビルドする場合は、次のとおりです。

```bash
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](https://github.com/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**

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

