Skip to content

Majiang.Game

Satoshi Kobayashi edited this page Jan 31, 2024 · 20 revisions

局進行を実現するクラス

インスタンス生成後、Majiang.Game#kaiju の呼び出しで対局を開始する。 その後は対局者からの応答により非同期に Majiang.Game#next が呼ばれることで局が進行する。 対局終了時にはインスタンス生成時に指定したコールバック関数を呼んで処理が終了する。

クラスメソッドで進行の妥当性を判断するための関数を提供する。 これらのメソッドは Majiang.Game 自身が使用するだけでなく、Majiang.Player が使用することも想定している。

クラスメソッド

constructor()

players で指定された4名を対局者とし、rule で指定されたルールにしたがい対局を行う。 対局終了時に callback で指定した関数が呼ばれる(対局の牌譜が引数で渡される)。 title で牌譜に残すタイトルを指定できる。 rule を省略した場合は、Majiang.rule() の呼び出しで得られるルールの初期値が採用される。

static get_dapai()

Majiang.Shoupai#get_dapai を呼び出し、rule にしたがって shoupai から打牌可能な牌の一覧を返す。

static get_chi_mianzi()

Majiang.Shoupai#get_chi_mianzi を呼び出し、rule にしたがって shoupai から p でチー可能な面子の一覧を返す。 paishu には現在の残り牌数を指定すること。

static get_peng_mianzi()

Majiang.Shoupai#get_peng_mianzi を呼び出し、rule にしたがって shoupai から p でポン可能な面子の一覧を返す。 paishu には現在の残り牌数を指定すること。

static get_gang_mianzi()

Majiang.Shoupai#get_gang_mianzi を呼び出し、rule にしたがって shoupai からカン可能な面子の一覧を返す。 p が指定された場合は大明槓、null の場合は暗槓と加槓が対象になる。 paishu には現在の残り牌数、n_gang にはその局に行われた槓の数を指定すること。

static allow_lizhi()

rule にしたがって shoupai からリーチ可能か判定する。 p が null のときはリーチ可能な打牌一覧を返す。 p のときは p を打牌してリーチ可能なら true を返す。 paishu には現在の残り牌数、defen には現在の持ち点を指定すること。

static allow_hule()

  • rule - ルール
  • shoupai - Majiang.Shoupai
  • p -
  • zhuangfeng - number
  • menfeng - number
  • hupai - boolean
  • neng_rong - boolean
  • 返り値 - boolean

rule にしたがって shoupai で和了可能か判定する。 p が null のときはツモ和了可能なら true を返す。 p のときは p でロン和了可能なら true を返す。 zhuangfeng には場風(0: 東、1: 南、2: 西、3: 北)、menfeng には自風、状況役があるときは hupai に true、フリテンのときは neng_rong に false を指定すること。

static allow_pingju()

rule にしたがって shoupai で九種九牌流局可能か判定する。 第一ツモ順の場合は diyizimo に true を指定すること。

static allow_no_daopai()

rule にしたがって shoupai が「ノーテン宣言」可能か判定する。 paishu には現在の残り牌数を指定すること。

インスタンス変数

_players

インスタンス生成時に指定された Majiang.Player の配列。

_callback

インスタンス生成時に指定された対局終了時に呼び出す関数。

_rule

インスタンス生成時に指定された ルール

_model

卓情報

_view

卓情報 を描画するクラス。 Majiang.Game からは適切なタイミングでメソッドを呼び出して描画のきっかけを与える。

_paipu

牌譜

_status

Majiang.Game#call_players を呼び出した際の type を保存する。

_reply

対局者からの応答を格納する配列。 Majiang.Game#call_players 呼び出し時に配列を生成する。

_max_jushu

最終局(オーラス)の局数。東風戦の場合、初期値は 3。東南戦なら 7。 延長戦により最終局が移動する場合はこの値を変更する。

_diyizimo

第一ツモ巡の間は true。

_fengpai

四風連打の可能性がある間は true。

_dapai

最後に打牌した 。次の打牌で上書きする。

_gang

現在処理中のカンの 面子。開槓すると null に戻す。

_lizhi

各対局者(その局の東家からの順)のリーチ状態を示す配列。 0: リーチなし、1: 通常のリーチ、2: ダブルリーチ。

_yifa

各対局者が一発可能かを示す配列。 添え字は手番(0: 東、1: 南、2: 西、3: 北)。

_n_gang

各対局者が行ったカンの数。 添え字は手番(0: 東、1: 南、2: 西、3: 北)。

_neng_rong

各対局者のフリテン状態。 添え字は手番(0: 東、1: 南、2: 西、3: 北)。 ロン和了可能なら true。

_hule

和了応答した対局者の手番(0: 東、1: 南、2: 西、3: 北)の配列。 南家、西家のダブロンの時は [ 1, 2 ] となる。

_hule_option

処理中の和了が槍槓のとき qiangang、嶺上開花のとき lingshang、それ以外なら null。

_no_game

途中流局の処理中のとき true。

_lianzhuang

連荘の処理中のとき true。

_changbang

現在処理中の局開始時の積み棒の数。

_fenpei

現在処理中の和了、あるいは流局で移動する点数の配列。 添え字は手番(0: 東、1: 南、2: 西、3: 北)。

_sync

true の場合、同期モードとなり、setTimeout() による非同期呼び出しは行わない。

_stop

関数が設定されている場合、Majiang.Game#next 呼び出しの際にその関数を呼び出して処理を停止する。

_speed

局の進行速度。0~5 で指定する。初期値は 3。 指定された速度 × 200(ms) で Majiang.Game#next を呼び出すことで局の進行速度を調整する。

_wait

ダイアログへの応答速度(ms)。初期値は 0。 指定された時間後に Majiang.Game#next を呼び出す。

_timeout_id

非同期で Majiang.Game#next を呼び出すタイマーのID。 値が設定されていれば非同期呼出し待ちであり、clearTimeout() を呼び出せば非同期呼出しをキャンセルできる。

_handler

Majiang.Game#jieju から呼ぶ出される関数。 Majiang.Game#set-handler で設定する。

インスタンスメソッド

kaiju()

  • qijia - number

非同期モードで対局を開始する。 qijia で起家を指定することもできる(03)。 qijia を指定しない場合はランダムに起家を決定する。

reply()

対局者が応答の際に呼び出す。 id は対局者の席順(03)、reply は応答内容。

stop()

  • callback = ()=>{} - function

非同期モードの対局を停止する。 停止の際に callback を呼び出す。

start()

非同期モードの対局を再開する。

do_sync()

デバッグ用。同期モードで対局を開始する。 対局終了まで一切の非同期呼び出しは行わず、無停止で対局を完了する。

get model()

インスタンス変数 _model を返す。

set view()

  • view - object

インスタンス変数 _viewview を設定する。

get speed()

  • 返り値 - number

インスタンス変数 _speed を返す。

set speed()

  • speed - number

インスタンス変数 _speedspeed を設定する。

set wait()

  • wait - number

インスタンス変数 _waitwait を設定する。

set handler()

  • callback - function

callbackMajiang.Game#jieju から呼び出すように設定する。

内部メソッド

next()

対局者からの応答を読み出し、対局の次のステップに進む。

notify_players()

対局者に msg を通知する。対局者からの応答はない。 typeメッセージ の種別を示す。

call_players()

対局者に msg を通知する。 対局者からの応答を待って、Majiang.Game#next が非同期に呼び出される。 typeメッセージ の種別を示す。 timeoutMajiang.Game#next 呼び出しまでの待ち時間(ms)を指定し、局の進行速度を調整することもできる。 timeout の指定がない場合は、インスタンス変数 _speed に応じて待ち時間を決定する。

qipai()

配牌の局進行を行う。

zimo()

ツモの局進行を行う。

dapai()

dapai で指定された牌を打牌する局進行を行う。

fulou()

fulou で指定された面子を副露する局進行を行う。 大明槓は副露に含める。

gang()

gang で指定された面子で加槓あるいは暗槓する局進行を行う。

gangzimo()

リンシャン牌ツモの局進行を行う。

kaigang()

開槓の局進行を行う。

hule()

和了の局進行を行う。

pingju()

  • name - string
  • shoupai - 牌姿 の配列

流局の局進行を行う。 name が指定された場合は途中流局とする。 shoupai には流局時に公開した 牌姿 を指定する。

last()

対局終了の判断を行う。

jieju()

対局終了の処理を行う。

reply_kaiju()

配牌の局進行メソッドを呼び出す。

reply_qipai()

ツモの局進行メソッドを呼び出す。

reply_zimo()

ツモ応答の妥当性を確認し、次の局進行メソッドを呼び出す。

reply_dapai()

打牌応答の妥当性を確認し、次の局進行メソッドを呼び出す。

reply_fulou()

副露応答の妥当性を確認し、次の局進行メソッドを呼び出す。

reply_gang()

槓応答の妥当性を確認し、次の局進行メソッドを呼び出す。

reply_hule()

和了応答の妥当性を確認し、次の局進行メソッドを呼び出す。

reply_pingju()

流局応答の妥当性を確認し、次の局進行メソッドを呼び出す。

get_dapai()

  • 返り値 - の配列

Majiang.Game#static-get_dapai を呼び出し、インスタンス変数 _rule にしたがって現在の手番の手牌から打牌可能な牌の一覧を返す。

get_chi_mianzi()

  • l - number
  • 返り値 - 面子 の配列

Majiang.Game#static-get_chi_mianzi を呼び出し、インスタンス変数 _rule にしたがって手番 l が現在の打牌でチー可能な面子の一覧を返す。

get_peng_mianzi()

  • l - number
  • 返り値 - 面子 の配列

Majiang.Game#static-get_peng_mianzi を呼び出し、インスタンス変数 _rule にしたがって手番 l が現在の打牌でポン可能な面子の一覧を返す。

get_gang_mianzi()

  • l - number
  • 返り値 - 面子 の配列

Majiang.Game#static-get_gang_mianzi を呼び出し、インスタンス変数 _rule にしたがってカン可能な面子の一覧を返す。l が指定された場合は大明槓、null の場合は暗槓と加槓が対象になる。

allow_lizhi()

  • p -
  • 返り値 - の配列 or boolean

Majiang.Game#static-allow_lizhi を呼び出し、インスタンス変数 _rule にしたがってリーチ可能か判定する。 p が null のときはリーチ可能な打牌一覧を返す。 p が のときは p を打牌してリーチ可能なら true を返す。

allow_hule()

  • l - number
  • 返り値 - boolean

Majiang.Game#static-allow_hule を呼び出し、インスタンス変数 _rule にしたがって和了可能か判定する。 l が null のときは現在の手番がツモ和了可能なら true を返す。 l が指定された場合は手番 l がロン和了可能なら true を返す。

allow_pingju()

  • 返り値 - boolean

Majiang.Game#static-allow_pingju を呼び出し、インスタンス変数 _rule にしたがって現在の手番が九種九牌流局可能か判定する。

delay()

  • callback - function
  • timeout - number

timeout で指定した時間(ms)休止した後に callback を呼び出す。 ゲームに「タメ」を作るためにチー/ポンなどの発声のタイミングで呼び出される。 timeout の指定がない場合は、インスタンス変数 _speed に応じて待ち時間を決定するが、最低でも 500ms は待ち合わせる。

say()

  • name - string
  • l - number

手番 lname を発声させる。

add_paipu()

  • paipu - 牌譜 の摸打情報

インスタンス変数 _paipu の適切な位置に摸打情報を追加する。

get_reply()

手番 l からの応答を取得する。