Exemplo n.º 1
0
        /// <summary>
        /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        ///
        /// TODO: 打ち歩詰めチェック
        ///
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static List_OneAndMulti <Finger, SySet <SyElement> > Get_PotentialMove_Motikoma(
            SkyConst src_Sky,
            Fingers fingers,
            SySet <SyElement> okenaiMasus
            )
        {
            // 「どの持ち駒を」「どこに置いたとき」「どこに利きがある」のコレクション。
            List_OneAndMulti <Finger, SySet <SyElement> > resultOmm = new List_OneAndMulti <Finger, SySet <SyElement> >();

            foreach (Finger donoKoma in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。

                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(donoKoma).Now);


                PieceType syurui = Haiyaku184Array.Syurui(koma.Haiyaku);

                // 置ける升
                SySet <SyElement> okeruMasus = Util_Sky.KomaKidou_Potential(donoKoma, src_Sky);

                // 置けない升を引きます。
                okeruMasus = okeruMasus.Minus_Closed(okenaiMasus);

                if (syurui == PieceType.P)
                {
                    // 二歩チェック

                    int suji;
                    Util_MasuNum.MasuToSuji(koma.Masu, out suji);

                    Fingers sujiKomas = Util_Sky.Fingers_InSuji(src_Sky, suji);

                    Starlight fu      = src_Sky.StarlightIndexOf(donoKoma);
                    Fingers   existFu = Util_Sky.Matches(fu, src_Sky, sujiKomas);

                    if (0 < existFu.Count)
                    {
                        // 二歩だ☆!
                        goto gt_Next;
                    }

                    // TODO:打ち歩詰めチェック
                }


                if (!okeruMasus.IsEmptySet())
                {
                    // 空でないなら
                    resultOmm.AddNew(donoKoma, okeruMasus);
                }

gt_Next:
                ;
            }

            return(resultOmm);
        }
Exemplo n.º 2
0
        /// <summary>
        /// v(^▽^)v超能力『メナス』だぜ☆ 未来の脅威を予測し、可視化するぜ☆www
        /// </summary>
        public static void Menace(NarabeRoomViewModel shogiGui)
        {
            if (0 < shogiGui.GameViewModel.GuiTesumi)
            {
                // 処理の順序が悪く、初回はうまく判定できない。
                SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst;


                //----------
                // 将棋盤上の駒
                //----------
                shogiGui.ResponseData.ToRedraw();

                // [クリアー]
                shogiGui.Shape_PnlTaikyoku.Shogiban.ClearHMasu_KikiKomaList();

                // 全駒
                foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);


                    if (
                        Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(koma.Masu)
                        &&
                        shogiGui.GameViewModel.GuiPside != koma.Pside
                        )
                    {
                        // 駒の利き
                        SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(figKoma, src_Sky);

                        IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements;
                        foreach (SyElement masu in kikiMasuList)
                        {
                            // その枡に利いている駒のハンドルを追加
                            if (Masu_Honshogi.Error != masu)
                            {
                                shogiGui.Shape_PnlTaikyoku.Shogiban.HMasu_KikiKomaList[Util_Masu.AsMasuNumber(masu)].Add((int)figKoma);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Get_PotentialMoves_Ikusa(
            SkyConst src_Sky,
            Fingers fingers
            )
        {
            Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (Finger finger in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> move = Util_Sky.KomaKidou_Potential(finger, src_Sky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。

                if (!move.IsEmptySet())
                {
                    // 移動可能升があるなら
                    Util_KomabetuMasus.AddOverwrite(kiki_fMs, finger, move);
                }
            }

            return(kiki_fMs);
        }
Exemplo n.º 4
0
        public static void Check_MouseoverKomaKiki(object obj_shogiGui, Finger finger)
        {
            NarabeRoomViewModel shogiGui = (NarabeRoomViewModel)obj_shogiGui;

            Starlight light = shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf(finger);

            shogiGui.Shape_PnlTaikyoku.Shogiban.KikiBan = new SySet_Default <SyElement>("利き盤");// .Clear();

            // 駒の利き
            SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(finger, shogiGui.GameViewModel.GuiSkyConst);
            //kikiZukei.DebugWrite("駒の利きLv1");

            // 味方の駒
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode = KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu);
            SySet <SyElement> mikataZukei = Util_Sky.Masus_Now(siteiNode.Value.ToKyokumenConst, Util_InServer.CurPside(shogiGui));
            //mikataZukei.DebugWrite("味方の駒");

            // 駒の利き上に駒がないか。
            SySet <SyElement> ban2 = kikiZukei.Minus_Closed(mikataZukei);

            //kikiZukei.DebugWrite("駒の利きLv2");

            shogiGui.Shape_PnlTaikyoku.Shogiban.KikiBan = ban2;
        }
Exemplo n.º 5
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   = 50.0d;
            SkyConst src_Sky = args.Node.Value.ToKyokumenConst;



            //
            // 「紐が付いていない駒の少なさ」による加点。
            //
            // 自分の駒について、味方の駒の利きが被っていれば+1(貫通)
            //                     敵の駒の利きが被っていれば-1(貫通)
            //
            //   敵の駒について、味方の駒の利きが被っていれば+1(貫通)
            //                     敵の駒の利きが被っていれば-1(貫通)
            //



            //
            // 駒のない升は無視し、
            // 駒のあるマスに、その駒の味方のコマが効いていれば +1
            // 駒のあるマスに、その駒の相手のコマが効いていれば -1
            //
            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                if (Okiba.ShogiBan != Util_Masu.Masu_ToOkiba(koma.Masu))
                {
                    goto gt_Next1;
                }
                // 将棋盤上のみ。

                // 駒の利き
                SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(figKoma, src_Sky);

                IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements;
                // 通し
                double toosi = kikiMasuList.Count();

                // 係数
                switch (koma.Syurui)
                {
                case PieceType.P: toosi *= this.Keisu_Fu; break;

                case PieceType.L: toosi *= this.Keisu_Kyo; break;

                case PieceType.N: toosi *= this.Keisu_Kei; break;

                case PieceType.S: toosi *= this.Keisu_Gin; break;

                case PieceType.G: toosi *= this.Keisu_Kin; break;

                case PieceType.K: toosi *= this.Keisu_Oh; break;

                case PieceType.R: toosi *= this.Keisu_Hisya; break;

                case PieceType.B: toosi *= this.Keisu_Kaku; break;

                case PieceType.PR: toosi *= this.Keisu_Ryu; break;

                case PieceType.PB: toosi *= this.Keisu_Uma; break;

                case PieceType.PP: toosi *= this.Keisu_Tokin; break;

                case PieceType.PL: toosi *= this.Keisu_NariKyo; break;

                case PieceType.PN: toosi *= this.Keisu_NariKei; break;

                case PieceType.PS: toosi *= this.Keisu_NariGin; break;

                default: break;
                }

                if (args.PlayerInfo.Playerside == koma.Pside)
                {
                    // 味方の駒
                    score += toosi;
                }
                else
                {
                    // 敵の駒
                    score -= toosi;
                }

gt_Next1:
                ;
            }


            string meisai = "";

#if DEBUG
            // 明細
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("略");
                meisai = sb.ToString();
            }
#endif
            kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai);
        }