Apricot-S/xiangting

副露を含めて 4 枚使いの牌がある手牌で置換数を誤計算する

Opened this issue · 1 comments

参考: nekobean/mahjong-cpp#26

副露牌 (露地牌) を 4 枚使いの判定に含む場合に、以下の手牌の置換数を誤計算する

  • 9m9p569s [999m] [999p] [999s] : 置換数の理論値 3
  • 東東白發中 [中中中] [發發發] [白白白] : 置換数の理論値 3
  • 13556z [111z] [333z] [666z] : 置換数の理論値 3

現在以下の関数で色ごとの部分置換数を補正しているが、これを修正する必要がある。

fn modify_number(replacement_number: u8, necessary_tiles: u16, four_tiles: u16) -> u8 {
const MAX_REPLACEMENT_NUMBER: u8 = 9;
let remaining_necesaary_tiles = necessary_tiles & !four_tiles;
if replacement_number != 0 && remaining_necesaary_tiles == 0 {
MAX_REPLACEMENT_NUMBER
} else {
replacement_number
}
}

問題の重要性について補足

  • 副露牌 (露地牌) を 4 枚使いの判定に含む場合でも、置換数 2 を 1 と誤計算することはない (1 向聴を聴牌と誤認しない)
  • 置換数の誤計算は常に小さくなる方向に誤計算される

以上により、本ライブラリが念頭においている麻雀対局シミュレーターでの利用においては
本問題は支障をきたすことはない。