private static bool IsPinfu(HoraPattern hp, InfoForResult ifr) { int headSyu = hp.Head.TartsuStartPaiSyu; //頭が役牌でないか判定 if (ifr.Isbakaze(headSyu) || ifr.IsJifuu(headSyu) || MJUtil.IsDragonPaiId(headSyu)) { return false; } //門前順子またはロン和了明順メンツではない場合ピンフではない foreach (var tartsu in hp.WithoutHeadTartsuList) { if ( ( (tartsu.IsAnsyun()) || ( tartsu.IsMinsyun() && tartsu.IsRonedTartsu) ) == false) { return false; } } //リャンメン待ちか判定 int lastAddedSyu = ifr.GetLastAddedSyu(); foreach (var tartsu in hp.WithoutHeadTartsuList ) { if ( (tartsu.TartsuStartPaiSyu == lastAddedSyu) && (lastAddedSyu % 9 != 6) || (tartsu.TartsuStartPaiSyu == lastAddedSyu - 2) && (lastAddedSyu % 9 != 2)) { return true; } } return false; }
private static int CalcFu(HoraPattern horaMentsu, Field field, InfoForResult ifpc) { int fuSum = 0; int futei = 20; fuSum += futei; //門前ロンの場合 if (ifpc.IsMenzen && (!ifpc.IsTsumo)) { fuSum += 10; } //頭が役牌の場合 int headSyuId = horaMentsu.TartsuList.Where(e => e.IsHead()).First().TartsuStartPaiSyu; if (ifpc.Isbakaze(headSyuId)) { fuSum += 2; } if (ifpc.IsJifuu(headSyuId)) { fuSum += 2; } if (MJUtil.IsDragonPaiId(headSyuId)) { fuSum += 2; } //ツモの場合 if (ifpc.IsTsumo) { fuSum += 2; } int multiple; foreach (var tartsu in horaMentsu.TartsuList) { if (tartsu.IsYaochuTartsu()) { multiple = 2; } else { multiple = 1; } switch (tartsu.TartsuType) { case MJUtil.TartsuType.MINKO: fuSum += 2 * multiple; continue; case MJUtil.TartsuType.ANKO: fuSum += 4 * multiple; continue; case MJUtil.TartsuType.MINKANTSU: fuSum += 8 * multiple; continue; case MJUtil.TartsuType.ANKANTSU: fuSum += 16 * multiple; continue; } } int lastAddedSyu = ifpc.GetLastAddedSyu(); //待ちによる符加算 //単騎待ちの場合 if (horaMentsu.Head.IsRonedTartsu || horaMentsu.Head.TartsuStartPaiSyu == ifpc.GetLastAddedSyu()) { fuSum += 2; } else { //カンチャンorペンチャンの場合 for (int i = 1; i < horaMentsu.TartsuList.Count; i++) { if ((horaMentsu.TartsuList[i].IsAnsyun() || (horaMentsu.TartsuList[i].IsMinsyun() && horaMentsu.TartsuList[i].IsRonedTartsu) ) == false) { continue; } //順子前提 if (lastAddedSyu == horaMentsu.TartsuList[i].TartsuStartPaiSyu + 1) {//カンチャン fuSum += 2; break; } else if ((lastAddedSyu == horaMentsu.TartsuList[i].TartsuStartPaiSyu) && (lastAddedSyu % 9 == 6)) {//7待ちの89ペンチャン fuSum += 2; break; } else if ((lastAddedSyu == horaMentsu.TartsuList[i].TartsuStartPaiSyu + 2) && (lastAddedSyu % 9 == 2)) {//3待ちの12ペンチャン fuSum += 2; break; } } } //喰い平和系の場合そのまま計算すると20符だが、ルール的にピンフ以外は最低30符のため2符足して30符に切り上げる if ((fuSum == 20) && (ifpc.IsMenzen == false)) { fuSum += 2; } return (int)(Math.Ceiling(fuSum / 10.0) * 10); }
private static int CalcYakuhaiNum(HoraPattern hp, InfoForResult ifr) { int yakuhaiNum = 0; //TODO foreach (var tartsu in hp.WithoutHeadTartsuList) { //ダブ東、ダブ南の場合があるので自風と場風は独立に判定する if (ifr.IsJifuu(tartsu.TartsuStartPaiSyu)) { yakuhaiNum++; } if (ifr.Isbakaze(tartsu.TartsuStartPaiSyu)) { yakuhaiNum++; } if (MJUtil.IsDragonPaiId(tartsu.TartsuStartPaiSyu)) { yakuhaiNum++; } } return yakuhaiNum; }
private static bool IsYakuhai(HoraPattern hp, InfoForResult ifr) { foreach (var tartsu in hp.WithoutHeadTartsuList) { if (ifr.IsJifuu(tartsu.TartsuStartPaiSyu) || ifr.Isbakaze(tartsu.TartsuStartPaiSyu) || MJUtil.IsDragonPaiId(tartsu.TartsuStartPaiSyu) ) { return true; } } return false; }