예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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());
        }