麻雀に関するプログラムを作ろうと思ったら、まずやるべきことは手牌の表現になるだろう。電脳麻将では以下の形式で表現している。
{ _bingpai: { m: [0,0,0,0,0,0,0,0,0,0], p: [0,0,0,0,0,0,0,0,0,0], s: [0,0,0,0,0,0,0,0,0,0], z: [0,0,0,0,0,0,0,0], }, _fulou: [], _zimo: null }
_bingpai
は副露牌以外の打牌可能な手牌*1の数を表しており、添字0は赤牌を表す。
_fulou
は副露した面子を表す。の場合は 'p23-4'
、 の場合は 'm550='
となる。'-'
が上家からの鳴き、'+'
が下家からの鳴き、'='
が対面からの鳴きを表していると言うわけ。暗槓は 'p9999'
、加槓は 's222+2'
のような形式とする。
_zimo
にはツモしてきた牌、あるいは直前の副露面子を設定し、打牌後は null に戻す。つまり _zimo
が null 以外の場合は打牌可能な状態であることを示している。
この表現方法だと
は
{ _bingpai: { m: [1,0,0,0,0,3,0,0,0,0], p: [0,0,0,0,0,0,0,0,0,0], s: [0,0,0,0,0,0,0,0,0,0], z: [0,0,0,0,0,0,0,2], }, _fulou: [ 'm78-9', 'z5555', 'z666=' ], _zimo: 'z7' }
と表せる*2。
これに自摸(zimo()
)、打牌(dapai()
)、副露(fulou()
)、暗槓、加槓(gang()
)の操作をするメソッドを追加したのがクラスMajiang.Shoupai
。
ソースコードはこちら。