private static bool IsRyuiso(HoraPattern hp) { var greenCount = 0; foreach (var tartsu in hp.TartsuList) { if (tartsu.TartsuType == MJUtil.TartsuType.ANSYUN || tartsu.TartsuType == MJUtil.TartsuType.MINSYUN) { if (MJUtil.IsGreenInSyuntsu(tartsu.TartsuStartPaiSyu)) { greenCount++; } } else { if (MJUtil.IsGreenPai(tartsu.TartsuStartPaiSyu)) { greenCount++; } } } return(greenCount == 5); }
private static bool IsHonnitsu(HoraPattern hp) { var hasManzu = false; var hasPinzu = false; var hasSouzu = false; var hasJi = false; foreach (var tartsu in hp.TartsuList) { if (MJUtil.IsJihaiPai(tartsu.TartsuStartPaiSyu)) { hasJi |= true; } else { var div = tartsu.TartsuStartPaiSyu / MJUtil.LENGTH_SYU_NUMBERS; hasManzu |= (div == 0); hasPinzu |= (div == 1); hasSouzu |= (div == 2); } } var isOneColor = (hasManzu && !hasPinzu && !hasSouzu) || (!hasManzu && hasPinzu && !hasSouzu) || (!hasManzu && !hasPinzu && hasSouzu); return(isOneColor && hasJi); }
private static bool IsHonnitsu(int[] horaSyu) { var hasManzu = false; var hasPinzu = false; var hasSouzu = false; var hasJi = false; foreach (var syu in horaSyu.Select((val, index) => new { val, index })) { if (syu.val == 0) { continue; } if (MJUtil.IsJihaiPai(syu.index)) { hasJi |= true; continue; } var div = syu.index / MJUtil.LENGTH_SYU_NUMBERS; hasManzu |= (div == 0); hasPinzu |= (div == 1); hasSouzu |= (div == 2); } var isOnecolor = (hasManzu && !hasPinzu && !hasSouzu) || (!hasManzu && hasPinzu && !hasSouzu) || (!hasManzu && !hasPinzu && hasSouzu); return(isOnecolor && hasJi); }
private static bool IsChinnitsu(int[] horaSyu) { var hasManzu = false; var hasPinzu = false; var hasSouzu = false; foreach (var syu in horaSyu.Select((val, index) => new { val, index })) { if (syu.val == 0) { continue; } if (MJUtil.IsJihaiPai(syu.index)) { return(false); } var div = syu.index / MJUtil.LENGTH_SYU_NUMBERS; hasManzu |= (div == 0); hasPinzu |= (div == 1); hasSouzu |= (div == 2); } return((hasManzu && !hasPinzu && !hasSouzu) || (!hasManzu && hasPinzu && !hasSouzu) || (!hasManzu && !hasPinzu && hasSouzu)); }
private static bool IsPinfu(HoraPattern hp, InfoForResult ifr) { int headSyu = hp.Head.TartsuStartPaiSyu; //頭が役牌でないか判定 if (ifr.IsBafuu(headSyu) || ifr.IsJifuu(headSyu) || MJUtil.IsDragonPai(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 bool IsHonroto(int[] horaSyu) { foreach (var syu in horaSyu.Select((val, index) => new { val, index }).Where(e => e.val > 0)) { if (MJUtil.IsYaochuPai(syu.index) == false) { return(false); } } return(true); }
private static bool IsChinroto(HoraPattern hp) { if (hp.TartsuList.Count(e => e.TartsuType == MJUtil.TartsuType.ANSYUN || e.TartsuType == MJUtil.TartsuType.MINSYUN) > 0) { return(false); } return(hp.TartsuList.Count(e => MJUtil.IsRotoPai(e.TartsuStartPaiSyu)) == 5); }
private static bool IsTsuiso(int[] horaSyu) { foreach (var syu in horaSyu.Select((val, index) => new { val, index }).Where(syu => syu.val > 0)) { if (MJUtil.IsJihaiPai(syu.index) == false) { return(false); } } return(true); }
public bool IsYaochuTartsu() { if (IsAnsyun() || IsMinsyun()) { //1か7から始まる順子の場合true return((TartsuStartPaiSyu % 9) == 0 || (TartsuStartPaiSyu % 9) == 6); } else { return(MJUtil.IsYaochuPai(TartsuStartPaiSyu)); } }
public bool IsDora(int syu) { //リーチしてたら裏ドラも考慮 var targetDoraOmote = MJUtil.GetDoraOmote(syu); if (IsReach) { return(uradoraMarkerList.Contains(targetDoraOmote) || doraMarkerList.Contains(targetDoraOmote)); } //リーチしてない場合は表ドラだけ考慮 return(doraMarkerList.Contains(targetDoraOmote)); }
private static bool IsYakuhai(HoraPattern hp, InfoForResult ifr) { foreach (var tartsu in hp.WithoutHeadTartsuList) { if (ifr.IsJifuu(tartsu.TartsuStartPaiSyu) || ifr.IsBafuu(tartsu.TartsuStartPaiSyu) || MJUtil.IsDragonPai(tartsu.TartsuStartPaiSyu) ) { return(true); } } return(false); }
private static bool IsHonroto(HoraPattern hp) { foreach (var tartsu in hp.TartsuList) { if (tartsu.TartsuType == MJUtil.TartsuType.ANSYUN || tartsu.TartsuType == MJUtil.TartsuType.MINSYUN) { return(false); } if (MJUtil.IsYaochuPai(tartsu.TartsuStartPaiSyu) == false) { return(false); } } return(true); }
private static bool IsShosangen(HoraPattern hp) { if (MJUtil.IsDragonPai(hp.Head.TartsuStartPaiSyu) == false) { return(false); } var doragonCount = 0; foreach (var tartsu in hp.WithoutHeadTartsuList) { if (MJUtil.IsDragonPai(tartsu.TartsuStartPaiSyu)) { doragonCount++; } } //頭が三元牌かつ三元牌ターツが2つ以上ある場合 return(doragonCount >= 2); }
private static bool IsJunChanta(HoraPattern hp) { foreach (var tartsu in hp.TartsuList) { if (tartsu.TartsuType == MJUtil.TartsuType.ANSYUN || tartsu.TartsuType == MJUtil.TartsuType.MINSYUN) { if ((tartsu.TartsuStartPaiSyu % 9 == 0) || (tartsu.TartsuStartPaiSyu % 9 == 6)) { continue; } } else { if (MJUtil.IsYaochuPai(tartsu.TartsuStartPaiSyu)) { continue; } } return(false); } return(true); }
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.IsBafuu(tartsu.TartsuStartPaiSyu)) { yakuhaiNum++; } if (MJUtil.IsDragonPai(tartsu.TartsuStartPaiSyu)) { yakuhaiNum++; } } return(yakuhaiNum); }
private static bool IsShosushi(HoraPattern hp) { return(MJUtil.IsWindPai(hp.Head.TartsuStartPaiSyu) && hp.WithoutHeadTartsuList.Count(e => MJUtil.IsWindPai(e.TartsuStartPaiSyu)) == 3); }
private static bool IsDaisangen(HoraPattern hp) { return(hp.WithoutHeadTartsuList.Count(e => MJUtil.IsDragonPai(e.TartsuStartPaiSyu)) == 3); }
public Tartsu(MJUtil.TartsuType tt, int tartsuStartPaiSyu, bool isRoned) { this.TartsuType = tt; this.TartsuStartPaiSyu = tartsuStartPaiSyu; this.IsRonedTartsu = isRoned; }
private static bool IsDaisushi(HoraPattern hp) { return(hp.WithoutHeadTartsuList.Count(e => MJUtil.IsWindPai(e.TartsuStartPaiSyu)) == 4); }
private static bool IsTsuiso(HoraPattern hp) { return(hp.TartsuList.Count(e => MJUtil.IsJihaiPai(e.TartsuStartPaiSyu)) == 5); }
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.IsBafuu(headSyuId)) { fuSum += 2; } if (ifpc.IsJifuu(headSyuId)) { fuSum += 2; } if (MJUtil.IsDragonPai(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) { fuSum += 2; } else { //カンチャンorペンチャンの場合 for (int i = 1; i < horaMentsu.TartsuList.Count; i++) { if ((horaMentsu.TartsuList[i].IsAnsyun() || horaMentsu.TartsuList[i].IsMinsyun()) == 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)); }
public Tartsu(MJUtil.TartsuType tt, int tartsuStartPaiSyu) { this.TartsuType = tt; this.TartsuStartPaiSyu = tartsuStartPaiSyu; }