Beispiel #1
0
        /// <summary>
        /// 駒台の空いている升を返します。
        /// </summary>
        /// <param name="okiba">先手駒台、または後手駒台</param>
        /// <param name="uc_Main">メインパネル</param>
        /// <returns>置ける場所。無ければヌル。</returns>
        public static SyElement GetKomadaiKomabukuroSpace(Okiba okiba, SkyConst src_Sky)
        {
            SyElement akiMasu = Masu_Honshogi.Error;

            // 先手駒台または後手駒台の、各マスの駒がある場所を調べます。
            bool[] exists = new bool[Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH];//駒台スペースは40マスです。


            src_Sky.Foreach_Starlights((Finger finger, Starlight komaP, ref bool toBreak) =>
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(komaP.Now);

                if (Util_Masu.GetOkiba(koma.Masu) == okiba)
                {
                    exists[
                        Util_Masu.AsMasuNumber(koma.Masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))
                    ] = true;
                }
            });


            //駒台スペースは40マスです。
            for (int i = 0; i < Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH; i++)
            {
                if (!exists[i])
                {
                    akiMasu = Masu_Honshogi.Items_All[i + Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))];
                    goto gt_EndMethod;
                }
            }

gt_EndMethod:

            //System.C onsole.WriteLine("ゲット駒台駒袋スペース=" + akiMasu);

            return(akiMasu);
        }
Beispiel #2
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);
        }