こんにちは!株式会社アトラエで「転職サイトGreen」のエンジニアをしている浅水です。
この記事では、僕がポーカーのヘッズアップを愛用のターミナル上でやってみたい!!と夢見そして、
半分成功、半分夢半ばで挫折した話を書いていきたいと思います。
作ったもの
こんな感じで、**go_poker**というTUIで起動するポーカーゲーム(と言えるほどのクオリティではない)を作ってみました。
使用したもの
- Go 1.17
-
tview
- TUI作成のライブラリ的な
できること
- ターミナルでテキサスホールデムのヘッズアップがなんとなくできるよ
モチベーション
今回作成するにあたっては、大きく以下の2つのようなモチベーションで作りました。
- Goのキャッチアップがしたい!!
- TUIアプリを作ってターミナル作業に疲れたら遊びたい!!
1つ目のGoのキャッチアップに関しては、
僕がアトラエにJoinしたのが今年の7月なのですが、前職では主にインフラの領域を触っていたということもあり、
Greenで使用される技術の1つとして、完全初心者であるGoのキャッチアップをしたいと思ったからです。超絶シンプルです。
2つ目については、以前にQiitaで見かけた**ファイルパーミッションでスロットがしたい**という記事に衝撃を受け、
自分でもTUIアプリを作っておもろいことがしたくなったからです。。
TUIの画面構成
こんな感じでターミナル上で動くアプリをTUIアプリと呼ぶ(らしい)のですが、Golangには多数のTUI作成用のライブラリがありました。
こちらの記事を参考にしつつ結論、新し目でイケてそうなやつということで今回はtviewを採用しています。
Player & Enemy Table
見たまんまの情報ですが、ターミナル向かって左側がPlayer's Table、右側がEnemy's Tableとなっています。
名前 | 用途 |
---|---|
Hand | プレイヤーに配られた2枚のカードの内容(Enemy側はShowDown時にオープン) |
Total Money | 残りの金額 |
Bet | ベットしている金額 |
Action | Fold, Call, Raise, Checkの各アクションとTUIを終了するQuit(Enemy側は存在しない) |
基本的にプレイヤーはActionのリストの中から選択して、ゲームを進行するような感じです。
Center Table
プレイヤーに紐づかない情報や、ゲーム自体の管理に関する情報はTUIの真ん中に大きく枠を取ってます。
名前 | 用途 |
---|---|
Turn | ターンの進行 |
Pot | 溜まったPotの額(今回は両プレイヤーのベット数に等しい) |
Flop | フロップのカード情報 |
Information | 現在の進行情報や手役の結果など |
半分挫折したとこ
今回かなり見切り発車で作ったこともあり、以下の課題点を残してます。
- 手役が同じ時に勝敗の判定がイカレる(くそ)
- Raiseする時にベット額指定できない
- Enemyのアクションがテキトーなランダム
- そもそもポーカー初心者なのでヘッズアップのルール的に合ってるか怪しい
この辺りは随時修正しつつ、特にEnemyのアクションなどは今後面白くしていけたらいいなと思います。
TUIアプリを作ってみて
今までターミナルは好きであれどTUIアプリとか独自コマンドみたいのは全然作ってこなかったのですが、
ライブラリの充実により比較的簡単に且つ愛用ターミナルの上で自分のゲームが動くのはシンプルに楽しかったです!
とりあえず、**「疲れたからターミナルでポーカーで遊ぶ!!」**はできると思うので、よかったら試してみてください!