Ejemplo n.º 1
0
        /// <summary>
        /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public override void Keisan(out KyHyokaItem kyokumenScore, KyHandanArgs args)
        {
            double   score   = 0.0d;
            SkyConst src_Sky = args.Node.Value.ToKyokumenConst;

            // まず、プレイヤー1の視点で得点計算します。
            double score_player1 = 0.0d;

            src_Sky.Foreach_Starlights((Finger finger, Starlight light, ref bool toBreak) =>
            {
                RO_MotionlessStarlight ms = (RO_MotionlessStarlight)light;

                RO_Star_Koma koma = Util_Koma.AsKoma(ms.Now);

                // 単純に駒の種類による点数。
                double komaScore = 0.0d;
                switch (koma.Syurui)
                {
                case PieceType.P: komaScore = 1.0d; break;

                case PieceType.L: komaScore = 3.0d; break;

                case PieceType.N: komaScore = 3.5d; break;

                case PieceType.S: komaScore = 9.0d; break;

                case PieceType.G: komaScore = 9.5d; break;

                case PieceType.K: komaScore = 100.0d; break;

                case PieceType.R: komaScore = 25.0d; break;

                case PieceType.B: komaScore = 20.0d; break;

                case PieceType.PR: komaScore = 25.0d; break;

                case PieceType.PB: komaScore = 20.0d; break;

                case PieceType.PP: komaScore = 9.5d; break;

                case PieceType.PL: komaScore = 10.0d; break;

                case PieceType.PN: komaScore = 10.5d; break;

                case PieceType.PS: komaScore = 11.0d; break;

                default: komaScore = 0; break;
                }

                if (koma.Pside == Playerside.P1)
                {
                    // プレイヤー1の駒はそのまま
                }
                else
                {
                    // プレイヤー1の駒以外は、ひっくり返します。
                    komaScore *= -1;
                }

                score_player1 += komaScore;
            });


            if (args.PlayerInfo.Playerside == Playerside.P1)
            {
                // プレイヤー1はそのまま
                score = score_player1;
            }
            else
            {
                // プレイヤー1以外は、ひっくり返します。
                score = 100.0d - score_player1;
            }


            string meisai = "";

#if DEBUG
            // 明細
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("駒得");
                meisai = sb.ToString();
            }
#endif

            kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// [巻戻し]時の、駒台にもどる動きを吸収。
        /// </summary>
        /// <param name="syurui2"></param>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="kifu"></param>
        /// <param name="isMakimodosi"></param>
        /// <returns></returns>
        private static Starlight Kifusasi35_NextMasu(
            PieceType syurui2,
            ShootingStarlightable move,
            KifuTree kifu,
            bool isMakimodosi)
        {
            Starlight dst;

            RO_Star_Koma srcKoma = Util_Koma.AsKoma(move.LongTimeAgo); //移動元
            RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now);         //移動先


            if (isMakimodosi)
            {
                SyElement masu;

                if (
                    Okiba.Gote_Komadai == Util_Masu.GetOkiba(srcKoma.Masu) ||
                    Okiba.Sente_Komadai == Util_Masu.GetOkiba(srcKoma.Masu)
                    )
                {
                    //>>>>> 1手前が駒台なら

                    // 駒台の空いている場所

                    Node <ShootingStarlightable, KyokumenWrapper> node6 = kifu.CurNode;

                    masu = KifuIO.GetKomadaiKomabukuroSpace(Util_Masu.GetOkiba(srcKoma.Masu), node6.Value.ToKyokumenConst);
                    // 必ず空いている場所があるものとします。
                }
                else
                {
                    //>>>>> 1手前が将棋盤上なら

                    // その位置
                    masu = srcKoma.Masu;//戻し先
                }



                dst = new RO_MotionlessStarlight(
                    //move.Finger,
                    new RO_Star_Koma(dstKoma.Pside,
                                     masu,//戻し先
                                     syurui2)
                    );
            }
            else
            {
                // 次の位置


                dst = new RO_MotionlessStarlight(
                    //move.Finger,
                    new RO_Star_Koma(dstKoma.Pside,
                                     dstKoma.Masu,
                                     syurui2)
                    );
            }

            return(dst);
        }