/// <summary> /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。 /// </summary> /// <param name="input_node"></param> /// <param name="playerInfo"></param> /// <returns></returns> public override void Keisan(out KyHyokaItem kyHyoka, KyHandanArgs args) { double score = 0.0d; SkyConst src_Sky = args.Node.Value.ToKyokumenConst; bool b1 = false; bool b2 = false; SyElement masuKtou;//角頭 if (args.PlayerInfo.Playerside == Playerside.P1) { masuKtou = Masu_Honshogi.ban87_8七; } else { masuKtou = Masu_Honshogi.ban23_2三; } // // 角頭に味方の駒があるか? // Finger masuKtou_KomaFig; RO_Star_Koma komaKtou = null; { masuKtou_KomaFig = Util_Sky.Fingers_AtMasuNow(src_Sky, masuKtou).ToFirst(); if (Fingers.Error_1 == masuKtou_KomaFig) { // 角頭に駒がない。 goto gt_Next1; } komaKtou = Util_Koma.FromFinger(src_Sky, masuKtou_KomaFig); if (args.PlayerInfo.Playerside != komaKtou.Pside) { // 味方の駒ではない。 goto gt_Next1; } score = 0.01d; b1 = true; } gt_Next1: // // 角頭の駒に、味方の駒が1つ以上利いているか? // int kikisu; { KomanoKiki komaNoKiki = KomanoKikiImpl.MasuBETUKikisu(src_Sky, args.Node.Tebanside); kikisu = komaNoKiki.Kikisu_AtMasu_Mikata[Util_Masu.AsMasuNumber(masuKtou)]; if (kikisu < 1) { // 1つも利いていない。 goto gt_Next2; } score = 1.0d; b2 = true; } gt_Next2: // // 項1と項2を同時に満たしている。 (計 100点) // if (b1 && b2) { score = 100.0d; } string meisai = ""; #if DEBUG // 明細 { StringBuilder sb = new StringBuilder(); if (args.PlayerInfo.Playerside == Playerside.P1) { sb.Append("(角頭 8七)"); } else { sb.Append("(角頭 2三)"); } if (Fingers.Error_1 == masuKtou_KomaFig) { // 角頭に駒がない。 sb.Append("(角頭 味方駒無)"); } else if (args.PlayerInfo.Playerside != komaKtou.Pside) { // 味方の駒ではない。 sb.Append("(角頭 非味方駒)"); } else if (b1) { sb.Append("(角頭 味方駒有 0.01)"); } if (kikisu < 1) { // 1つも利いていない。 sb.Append("(角頭に味方駒利き無 " + kikisu + ")"); } else if (b2) { sb.Append("(角頭に味方駒利き有 1.0)"); } // 項1と項2を同時に満たしている。 (計 100点) if (b1 && b2) { sb.Append("(項1、項2を同時に満たす 100.0)"); } meisai = sb.ToString(); } #endif kyHyoka = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai); }
/// <summary> /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。 /// </summary> /// <param name="input_node"></param> /// <param name="playerInfo"></param> /// <returns></returns> public override void Keisan(out KyHyokaItem kyokumenScore, KyHandanArgs args) { double score = 100.0d; StringBuilder sbMeisai = new StringBuilder(); SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // // 各、味方の駒 // Fingers jiFigs = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.ShogiBan, args.PlayerInfo.Playerside); foreach (Finger figKoma in jiFigs.Items) { // 自駒 RO_Star_Koma jiKoma = Util_Koma.FromFinger(src_Sky, figKoma); SyElement aiteMasu; if (args.PlayerInfo.Playerside == Playerside.P1) { aiteMasu = Util_Masu.Offset(Okiba.ShogiBan, jiKoma.Masu, 0, -1); } else { aiteMasu = Util_Masu.Offset(Okiba.ShogiBan, jiKoma.Masu, 0, +1); } Finger aiteKomaFig = Util_Sky.Fingers_AtMasuNow(src_Sky, aiteMasu).ToFirst(); if (Fingers.Error_1 == aiteKomaFig) { goto gt_Next1; } // 相手駒 RO_Star_Koma aiteKoma = Util_Koma.FromFinger(src_Sky, aiteKomaFig); if (aiteKoma.Syurui != PieceType.P) { // 歩じゃなければ無視。「と金」も無視。 goto gt_Next1; } score -= 20.0d; #if DEBUG // 明細 { sbMeisai.Append("-(20.0d)"); } #endif if (score <= 0.0d) { break; } gt_Next1: ; } kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, sbMeisai.ToString()); }