Arduboyで麻雀ゲーム作る話(3)~ 放浪編

ただでさえ月末月初で忙しいところに大連の発注先がコロナでロックダウン一歩手前になってしまったり、大学生の息子が帰省してきたり、ラリーに参加する準備をしてたり、うっかり韓国語の単語を暗記を忘れていたり、うっかり青いドゥカッティモンスター696+を見つけてしまったり、もう何が何やらみたいな状況なのですが、時間を見つけてプログラミングを進めています。

ラリーの準備は楽しいなあ!

このブルーは多分全塗装だと思うのですが、、、

役判定を作らねば

さて、ここまででメンツが完成しているかどうかを判定するところまで作ったので、これからそれが役になっているかを判定するロジックを作ります。
最初は正規表現でズバッと解決しようと思っておったのですが、麻雀の役って改めて調べてみるとなかなかアナログで「いやだこれ、1パターンずつハードコーディングしたほうが早くない・・・?」みたいな感じです。 それだと個人的に面白くないので、なんかこうパターンマッチングできないかと試行錯誤して、

2段構えで対処することにしました。

例えばみんな大好きタンヤオなんかは、一九字牌以外のメンツで構成されているので、中張牌メンツの定義

define CHU ([TK][MPZ][2-8])|([S].[2-6])

としてやって、役そのものは

yaku TANYAO 1 'all CHU

なんて書いてやれればOKです。
わかりやすいように日本語に訳すと

  • 中張牌CHUってのは「対子か刻子」で「萬子筒子索子」の「2-8」か、「順子」で「2-6」
  • タンヤオTANYAOは、1翻で全部のメンツが中張牌

みたいな感じですね。

別にyaku直接メンツ構成を書いても構いません

yaku PINHU 1 'all (T[MPZ].)|(TFy)|(S..) #ただし両面待ち
ピンフは1翻で全部のメンツ「萬筒索」の対子オタ風の対子もしくは順子

・・・「両面待ちでアガったか」はハードコーディングするしかないかな~

それをどうするかというと「これら定義を元にCのソースを吐くpythonスクリプトを組む」のでした。

yacc&lexっぽいですね!
麻雀役だけに、麻雀ヤック・・・

「映画大好きポンポさん2」より抜粋
そして一部組んだものgithubにあります。
github.com

ファイル 説明
yaku.ms 役の定義をするスクリプトです
yaku.py yaku.msを食ってCソースを吐くpythonプログラムです
yakutest.h テスト用にgccに食わせる時に使うヘッダファイルです
役判定仕様.md yaku.msに記述するための定義仕様書

現状は本当に一部の役(しかも面前)しか想定してないです(←さすがに全部作るの大変かなあ・・・と諦めてきた^^;)

コマンドラインにて

#!/bin/bash
cat yaku.ms | py.exe yaku.py > ptest.c
gcc -fsyntax-only -w -DYKDEBUG ptest.c

などとしてやると、yaku.msを食ってptest.cを作って、gccでチェックしてくれます。

治具的なプログラムなので、エラーチェックがかなりいい加減なのもご愛嬌です。

さて次は

とりあえず、全部スクリプトを組んで、PCのコンソールアプリで役判定・点数計算できるとこまで開発しても良いかもしれません(デバッグが簡単なので・・・)。
Arduboy関係ないじゃん!という向きもあろうかと思いますが、最終的には乗せます故・・・