Arduboyで麻雀ゲーム作る話(3)~ 放浪編
ただでさえ月末月初で忙しいところに大連の発注先がコロナでロックダウン一歩手前になってしまったり、大学生の息子が帰省してきたり、ラリーに参加する準備をしてたり、うっかり韓国語の単語を暗記を忘れていたり、うっかり青いドゥカッティモンスター696+を見つけてしまったり、もう何が何やらみたいな状況なのですが、時間を見つけてプログラミングを進めています。
役判定を作らねば
さて、ここまででメンツが完成しているかどうかを判定するところまで作ったので、これからそれが役になっているかを判定するロジックを作ります。
最初は正規表現でズバッと解決しようと思っておったのですが、麻雀の役って改めて調べてみるとなかなかアナログで「いやだこれ、1パターンずつハードコーディングしたほうが早くない・・・?」みたいな感じです。
それだと個人的に面白くないので、なんかこうパターンマッチングできないかと試行錯誤して、
の2段構えで対処することにしました。
例えばみんな大好きタンヤオなんかは、一九字牌以外のメンツで構成されているので、中張牌メンツの定義を
define CHU ([TK][MPZ][2-8])|([S].[2-6])
としてやって、役そのものは
yaku TANYAO 1 'all CHU
なんて書いてやれればOKです。
わかりやすいように日本語に訳すと
みたいな感じですね。
別にyaku
で直接メンツ構成を書いても構いません。
yaku PINHU 1 'all (T[MPZ].)|(TFy)|(S..) #ただし両面待ち
→ピンフは1翻で全部のメンツが「萬筒索」の対子かオタ風の対子もしくは順子
・・・「両面待ちでアガったか」はハードコーディングするしかないかな~
それをどうするかというと「これら定義を元にCのソースを吐くpythonスクリプトを組む」のでした。
yacc&lexっぽいですね!
麻雀役だけに、麻雀ヤック・・・
そして一部組んだものが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関係ないじゃん!という向きもあろうかと思いますが、最終的には乗せます故・・・