【Unity】麻雀ライブラリ
何をするライブラリなのか
麻雀のルール部分を実装したライブラリです。
卓上にある牌を管理して、鳴いたりロンしたりといったAPIを提供します。
あるのはルール部分の実装のみなので、「牌を画面に表示する」「ユーザー操作を受け付ける」「AIが打つ」といった部分は別途開発する必要があります。
使い方
半荘の開始
Game
をCreate
してルールを定める
var beforeRoundStart = Game.Create(Random.Range(0, 4), new RuleSetting() { end = new Mahjongs.Rules.EndRule() { extraRoundScoreThreshold = 30000, lengthType = Mahjongs.Rules.LengthType.東風戦, suddenDeathInExtraRound = true, }, payment = new Mahjongs.Rules.PaymentRule(30000, 20, 10, -10, -20), initialScore = 25000, redTile = Mahjongs.Rules.RedTile.赤ドラ3 } );
局の開始
var afterDraw = beforeRoundStart.StartRound();
局を進める
APIを呼ぶと戻り値としてIController
が返ってくるので、これを使ってゲームを進行していく。
// 牌を選択して捨てる var afterDiscard = afterDraw.Discard(tile, riichi: false); // 捨てられた牌を鳴く if (afterDiscard.CanChi(player)) { var afterDraw = afterDiscard.Chi(player, tile); } else { // 鳴かないなら下家へ手番を移す // このとき流局判定も行われる var afterDraw = afterDiscard.AdvanceTurn(out var roundResult, out var finishRoundStates); }
局の終わり
流局や上がりを処理するAPIは、RoundResult
を返す。
// ツモ if (afterDraw.CanTsumo()) { var roundResult = afterDraw.Tsumo(out tsumoResult); }
// ロン if (afterDiscard.CanRon(player)) { var roundResult = afterDiscard.Ron(out ronResult, player); }
// 次の局を開始する
var afterDraw = roundResult.beforeRoundStart.StartRound();
ゲームの終わり
RoundResult
がgameResult
を持っている場合はゲーム終了。
if (roundResult.gameResult != null) { // 終了処理 }
できていないこと
ローカルルールは設定で切り替えられたらいいなあ
- ダブル役満
- 国士無双の暗槓の槍槓
- オープンリーチ
- 花牌、季節牌(赤牌は実装済み)
- 九種九牌処理(流せません)
- 四家立直(流れません)
- 三家和(通常通り点の支払いが行われます)
- トビ無し(トビあり固定)
- 食いタン禁止(アリ固定)
- 喰い替え禁止(あり固定)
- 焼き鳥(なし固定)
- 八連荘(何も起こりません)
- 二翻縛り(常に一翻縛り固定)
追記
そういえば壁牌や山牌の状態については無頓着で、とりあえずシャッフルしてList
にしてある牌を前からとっていくだけというものになっています。
何がまずいかというと、鷲巣麻雀のような山牌もちゃんと管理しなきゃいけない変則ルールに対応できないんですね。要る?
追記2
鷲巣麻雀では山牌は見えずにランダムでしたね