Terminalから遊ぶ麻雀を作ってみた その2。
こんにちは k-jun です。Terminal から遊べる麻雀 (Mahjong TUI) を作ってみました!本記事では、この Mahjong TUI をできるだけ多くの人に見てもらうため、Mahjong TUI を紹介していきます!
はじめに
「Terminal で遊べる麻雀」というコンセプトは、見てもらったほうが圧倒的にわかりやすいでしょう。身近な周りのエンジニアにも見せたのですが、実物を見せる前の反応は「??」でした。
Mahjong TUI は麻雀の半荘戦全てを TUI として再現した麻雀ゲームです。上記はひたすらツモ切りを繰り返す CPU との対戦ですが、もちろん人間同士のオンライン対戦にも対応させています。麻雀のルールは半荘四麻赤アリアリのみ。その他、細かなルールはこちらの天鳳マニュアルを参考にしています。
「Terminal で遊べる麻雀」というコンセプトのため、諦めてしまった仕様も存在します。影響の大きいものは立直周りですね。立直の発声は無く、立直棒の演出もありません。Terminal の都合上、立直宣言牌も横向きになりません。ゲーム画面中央の得点が立直棒分 1,000 点減るので頑張って気づいて下さい!!
また、鳴き牌も横向きになりません。内部的にはどのプレイヤーから鳴いたのかは保持しているので、振聴、包などはきちんと処理されます。後述しますが、そもそも Terminal 上で麻雀を表現するというコンセプトが... ゲフンゲフン。
NPM で公開しており、実行するだけで Mahjong TUI を遊べるようにしています。ご興味を持って頂いた方はプレイしてみて下さい!まだまだデバックも行き届いていませんが、「Terminal で遊べる麻雀」の雰囲気だけでも味わって頂けると嬉しいです。
# install
npm install -g @k-jun/mahjong-tui
# game play
mahjong-tui
背景 & 目的
実は、4年前に Mahjong TUI の前身となる CLI Mahjong なるものを作成しています。当時はアイデアと UI だけ満足し、CLI Mahjong は麻雀の完成度としては非常にお粗末なものでした。この心残りを払拭するべく、ある程度ゲームとして成立した「Terminal で遊べる麻雀」を完成させたかったのです。
ここまで
ここからは、Mahjong TUI の開発過程についてお話ししていきます。全体の開発期間は、およそ半年。前半は得点計算や局進行といったインゲームに、後半は Terminal 上での表現やマッチングなどアウトゲームの実装をしています。それぞれの期間に何を考え何を実装したのか、つらつらと綴っていければと思います。
前半戦
Mahjong TUI の開発は、麻雀の核となる得点計算まわりから着手しました。得点計算やシャンテン数の算出には既存のライブラリも数多く存在します。ですが、Mahjong TUI ではそれらに頼らず、全て自前のライブラリで賄っています。特段理由は無く、「なんか面白そうだし自分で作ってみるか」で作ってみたのです。コンセプトが遊び心に溢れているのに、開発者が遊び心を持たないわけにはいきませんからね。
次点で着手したのが、麻雀自体のゲームロジックです。配牌、自摸、打牌、鳴き、和了時の処理や流局時の処理ですね。ここの実装で槍槓とダブロンが本当に嫌いになりました...。
麻雀のゲームロジックは上記の表のフローで基本的に進行します。そして、表の赤線を唯一経由するのが槍槓なのです。付随して、「真ドラをめくるタイミング」「槍槓時の一発の役判定」など悩みのタネが増えていきます。ダブロン・三家和了も厄介です。ダブロンは唯一同時発生する鳴きですが、トリロンになった瞬間に三家和了で流れになります。こちらも付随して「三家和了時に差し出した立直棒はどうなるのか」などの問題が発生します。何度、槍槓とダブロンを仕様から落とそうと思ったことか...。
後半戦
インゲームのゲームロジックはなんとか完成しましたが、まだ大きな問題が残っています。「Terminal で遊べる麻雀」を名乗るには、Terminal 上で麻雀を表現しなくてはなりません。Mahjong TUI では ink を活用して、TUI でのゲーム画面の更新とレンダリングを行っています。
なかなか難しいのが牌の表現です。例えば、🀇と🀅であれば以下の通りです。縦幅 3文字に、横幅 4文字。中に空いた 2文字分の空間に 萬子: m、筒子: p、索子: s に続ける形で 1-9 で数牌を、中、発、東で字牌を表現しています。
┌──┐┌──┐
│m1││發│
└──┘└──┘
└──┘└──┘
そして、この縦横比で立直時の横向きの牌を表現すると以下の通りになります。これは、縦幅 2文字に、横幅 6文字なり、中に空間が出来ず牌の名前が入りません。
┌────┐
└────┘
└────┘
では、中に牌の名前が入るように全体を大きくすると、Terminal に麻雀のゲーム画面が収まり切らなくなります。というか、そもそも Terminal の表現力自体が足りていません。なぜ僕は TUI なんぞで麻雀ゲームを作っているのでしょうか。阿呆です。
ここで僕の心が折れ、Mahjong TUI は牌の向きは心の目で感じ取っていただく状態になっています。僕の精神力が復活したら、後で修正されるかもしれません。
おわりに
出来ないことも色々とありますが、「Terminal で遊べる麻雀」としてある程度人前に出せるクオリティになったかなと考えて筆を取っています。どこまでいっても Mahjong TUI は GUI の麻雀ゲームのクオリティには叶いませんしね。利点は、仕事中に Terminal でこっそり麻雀ができるぐらいでしょうか。それでも、この記事を読んでくれた皆さんが、そして遊んでくれた皆さんが、少しでも笑ってくれたら僕としては嬉しいです。以上 k-jun でした!
参考
以下のサイト達には Majong TUI を作る上で大変お世話になりました。この場を借りてお礼申し上げます。ありがとうございました!!
Discussion