public int GetAgariScore(Tehai tehai, Hai addHai, EKaze jikaze, AgariParam param = null) { if (param == null) { param = AgariParam; param.ResetDoraHais(); } param.setBakaze(getBaKaze()); param.setJikaze(jikaze); param.ResetYakuFlags(); // should reset params or create a new. if (m_activePlayer.IsReach) { if (m_activePlayer.IsDoubleReach) { param.setYakuFlag(EYakuFlagType.DOUBLE_REACH, true); } else { param.setYakuFlag(EYakuFlagType.REACH, true); } } if (m_isTsumo) { param.setYakuFlag(EYakuFlagType.TSUMO, true); if (m_isTenhou) { param.setYakuFlag(EYakuFlagType.TENHOU, true); } else if (m_isChihou) { param.setYakuFlag(EYakuFlagType.TIHOU, true); } } else if (m_isRenhou) { if (getPlayerIndex(jikaze) != OyaIndex) // only ko can Renhou. { param.setYakuFlag(EYakuFlagType.RENHOU, true); } } if (m_isTsumo && m_isRinshan) { param.setYakuFlag(EYakuFlagType.RINSYAN, true); } if (m_isChanKan) { param.setYakuFlag(EYakuFlagType.CHANKAN, true); } if (m_isLast) { if (m_isTsumo) { param.setYakuFlag(EYakuFlagType.HAITEI, true); } else { param.setYakuFlag(EYakuFlagType.HOUTEI, true); } } if (m_activePlayer.IsIppatsu) { param.setYakuFlag(EYakuFlagType.IPPATU, true); } if (GameSettings.UseKuitan) { param.setYakuFlag(EYakuFlagType.KUITAN, true); } return(AgariScoreManager.GetAgariScore(tehai, addHai, param, ref m_combis, ref m_agariInfo)); }
/* * // 流局满贯 // * public static void SetNagashiMangan(AgariInfo agariInfo) * { * agariInfo.han = 5; * agariInfo.fu = 30; * agariInfo.scoreInfo = GetScoreInfo(5, 30); * * agariInfo.hanteiYakus = new YakuHelper.YakuHandler[] * { * new YakuHelper.CheckNagashimangan(null) * }; * } */ // 符を計算します public static int CalculateHu(Tehai tehai, Hai addHai, HaiCombi combi, AgariParam param, Yaku yaku) { int countHu = 20; //頭の牌を取得 Hai atamaHai = new Hai(Hai.NumKindToID(combi.atamaNumKind)); // 3元牌なら2符追加 if (atamaHai.Kind == Hai.KIND_SANGEN) { countHu += 2; } // 場風なら2符追加 if ((atamaHai.ID - Hai.ID_TON) == (int)param.getBakaze()) { countHu += 2; } // 自風なら2符追加 if ((atamaHai.ID - Hai.ID_TON) == (int)param.getJikaze()) { countHu += 2; } //平和が成立する場合は、待ちによる2符追加よりも優先される if (yaku.checkPinfu() == false) { // 単騎待ちの場合2符追加 if (addHai.NumKind == combi.atamaNumKind) { countHu += 2; } // 嵌張待ちの場合2符追加 // 数牌の2~8かどうか判定 if (addHai.IsYaochuu == false) { for (int i = 0; i < combi.shunCount; i++) { if ((addHai.NumKind - 1) == combi.shunNumKinds[i]) { countHu += 2; } } } // 辺張待ち(3)の場合2符追加 if (addHai.IsYaochuu == false && addHai.Num == Hai.NUM_3) { for (int i = 0; i < combi.shunCount; i++) { if ((addHai.NumKind - 2) == combi.shunNumKinds[i]) { countHu += 2; } } } // 辺張待ち(7)の場合2符追加 if (addHai.IsYaochuu == false && addHai.Num == Hai.NUM_7) { for (int i = 0; i < combi.shunCount; i++) { if (addHai.NumKind == combi.shunNumKinds[i]) { countHu += 2; } } } } // 暗刻による加点 Hai checkHai = null; for (int i = 0; i < combi.kouCount; i++) { checkHai = new Hai(Hai.NumKindToID(combi.kouNumKinds[i])); // 牌が字牌もしくは1,9 if (checkHai.IsYaochuu == true) { countHu += 8; } else { countHu += 4; } } Fuuro[] fuuros = tehai.getFuuros(); for (int i = 0; i < fuuros.Length; i++) { switch (fuuros[i].Type) { case EFuuroType.MinKou: { // 牌が字牌もしくは1,9 if (fuuros[i].Hais[0].IsYaochuu == true) { countHu += 4; } else { countHu += 2; } } break; case EFuuroType.KaKan: case EFuuroType.DaiMinKan: { // 牌が字牌もしくは1,9 if (fuuros[i].Hais[0].IsYaochuu == true) { countHu += 16; } else { countHu += 8; } } break; case EFuuroType.AnKan: { // 牌が字牌もしくは1,9 if (fuuros[i].Hais[0].IsYaochuu == true) { countHu += 32; } else { countHu += 16; } } break; } } // ツモ上がりで平和が成立していなければ2譜追加 if (param.getYakuFlag(EYakuFlagType.TSUMO) == true) { if (yaku.checkPinfu() == false) { countHu += 2; } } // 面前ロン上がりの場合は10符追加 if (param.getYakuFlag(EYakuFlagType.TSUMO) == false) { if (yaku.isNaki == false) { countHu += 10; } } // 一の位がある場合は、切り上げ if (countHu % 10 != 0) // 23 -> 30. { countHu = countHu - (countHu % 10) + 10; } return(countHu); }
public static int GetAgariScore(Tehai tehai, Hai addHai, AgariParam param, ref HaiCombi[] combis, ref AgariInfo agariInfo) { formatWorker.setCounterFormat(tehai, addHai); // あがりの組み合わせを取得します int combisCount = formatWorker.calculateCombisCount(combis); //Debug.Log ("GetAgariScore() combisCount="+combisCount); combis = formatWorker.getCombis(); /* * /// 1. check Chiitoitsu(七对子) * if( formatWorker.isChiitoitsu() ) * { * Yaku yaku = Yaku.NewYaku_Chiitoitsu(tehai, addHai, param); * * agariInfo.han = yaku.getHan(); * agariInfo.fu = 25; * agariInfo.hanteiYakus = yaku.getHanteiYakus(); * * agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu); * * return agariInfo.scoreInfo.koAgari; * } */ /* * /// 2. check Kokushi(国士无双) * if( formatWorker.isKokushi() ) * { * Yaku yaku = Yaku.NewYaku_Kokushi(tehai, addHai, param); * * if( yaku.isKokushi ) * { * agariInfo.han = 13; * agariInfo.fu = 20; * agariInfo.hanteiYakus = yaku.getHanteiYakus(); * * agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu); * * return agariInfo.scoreInfo.koAgari; * } * * return 0; * } */ //return combisCount; /// 3. check common combi yaku. if (combisCount <= 0) { return(0); } int[] hanSuuArr = new int[combisCount]; // 役 計算台數 //int[] huSuuArr = new int[combisCount]; // 符 //int[] scoreArr = new int[combisCount]; // 点数(子のロン上がり) int maxAgariScore = 0; // 最大の点数 for (int i = 0; i < combisCount; i++) { Yaku yaku = Yaku.NewYaku_Common(tehai, addHai, combis[i], param); hanSuuArr[i] = yaku.calculateHanSuu();//計算台數 //maxAgariScore += hanSuuArr[i]; //huSuuArr[i] = CalculateHu(tehai, addHai, combis[i], param, yaku); //Score scoreInfo = GetScoreInfo(hanSuuArr[i], huSuuArr[i]); //scoreArr[i] = scoreInfo.koAgari; if (hanSuuArr[i] > maxAgariScore) { agariInfo.han = hanSuuArr[i]; //agariInfo.fu = huSuuArr[i]; agariInfo.hanteiYakus = yaku.getHanteiYakus(); //agariInfo.scoreInfo = scoreInfo; maxAgariScore = hanSuuArr[i]; } } //agariInfo.han = maxAgariScore; //agariInfo.fu = 0; //agariInfo.scoreInfo = GetScoreInfo(5, 30); //agariInfo.hanteiYakus = yaku.getHanteiYakus(); // 最大値を探す //maxAgariScore = 0; //for(int i = 0; i < combisCount; i++) //{ // if( scoreArr[i] > maxAgariScore ) // maxAgariScore = scoreArr[i]; //} //return maxAgariScore; return(combisCount); }
public static int GetAgariScore(Tehai tehai, Hai addHai, AgariParam param, ref HaiCombi[] combis, ref AgariInfo agariInfo) { formatWorker.setCounterFormat(tehai, addHai); // あがりの組み合わせを取得します int combisCount = formatWorker.calculateCombisCount(combis); combis = formatWorker.getCombis(); /// 1. check Chiitoitsu(七对子) if (formatWorker.isChiitoitsu()) { Yaku yaku = Yaku.NewYaku_Chiitoitsu(tehai, addHai, param); agariInfo.han = yaku.getHan(); agariInfo.fu = 25; agariInfo.hanteiYakus = yaku.getHanteiYakus(); agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu); return(agariInfo.scoreInfo.koAgari); } /// 2. check Kokushi(国士无双) if (formatWorker.isKokushi()) { Yaku yaku = Yaku.NewYaku_Kokushi(tehai, addHai, param); if (yaku.isKokushi) { agariInfo.han = 13; agariInfo.fu = 20; agariInfo.hanteiYakus = yaku.getHanteiYakus(); agariInfo.scoreInfo = GetScoreInfo(agariInfo.han, agariInfo.fu); return(agariInfo.scoreInfo.koAgari); } return(0); } /// 3. check common combi yaku. if (combisCount <= 0) { return(0); } int[] hanSuuArr = new int[combisCount]; // 役 int[] huSuuArr = new int[combisCount]; // 符 int[] scoreArr = new int[combisCount]; // 点数(子のロン上がり) int maxAgariScore = 0; // 最大の点数 for (int i = 0; i < combisCount; i++) { Yaku yaku = Yaku.NewYaku_Common(tehai, addHai, combis[i], param); hanSuuArr[i] = yaku.calculateHanSuu(); huSuuArr[i] = CalculateHu(tehai, addHai, combis[i], param, yaku); Score scoreInfo = GetScoreInfo(hanSuuArr[i], huSuuArr[i]); scoreArr[i] = scoreInfo.koAgari; if (scoreArr[i] > maxAgariScore) { agariInfo.han = hanSuuArr[i]; agariInfo.fu = huSuuArr[i]; agariInfo.hanteiYakus = yaku.getHanteiYakus(); agariInfo.scoreInfo = scoreInfo; maxAgariScore = scoreArr[i]; } } // 最大値を探す maxAgariScore = 0; for (int i = 0; i < combisCount; i++) { if (scoreArr[i] > maxAgariScore) { maxAgariScore = scoreArr[i]; } } return(maxAgariScore); }