コード例 #1
0
        public static void AAABAAAA_SplitGroup(
            out Fingers fingers_seme_IKUSA,  //戦駒(利きを調べる側)
            out Fingers fingers_kurau_IKUSA, //戦駒(喰らう側)
            out Fingers fingers_seme_MOTI,   // 持駒(利きを調べる側)
            out Fingers fingers_kurau_MOTI,  // 持駒(喰らう側)
            SkyConst src_Sky,
            Playerside tebanSeme,
            Playerside tebanKurau
            )
        {
            // 戦駒
            fingers_seme_IKUSA  = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.ShogiBan, tebanSeme);
            fingers_kurau_IKUSA = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.ShogiBan, tebanKurau);

            // 攻手の持駒
            if (tebanSeme == Playerside.P1)
            {
                // 攻手が先手番のとき。
                fingers_seme_MOTI  = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Sente_Komadai, tebanSeme);
                fingers_kurau_MOTI = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Gote_Komadai, tebanKurau);
            }
            else if (tebanSeme == Playerside.P2)
            {
                // 攻手が後手番のとき。
                fingers_seme_MOTI  = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Gote_Komadai, tebanSeme);
                fingers_kurau_MOTI = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Sente_Komadai, tebanKurau);
            }
            else
            {
                throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。");
            }

            //#if DEBUG
            //            MessageBox.Show("fingers_seme_MOTI数=[" + fingers_seme_MOTI.Count.ToString() + "]", "デバッグ SplitGroup");
            //#endif
        }
コード例 #2
0
        /// <summary>
        /// 入力欄のテキストを取得します。
        /// </summary>
        /// <returns></returns>
        public string ReadLine2()
        {
            int      lastTesumi = Util_InServer.CountCurTesumi2(this.ShogiGui);
            SkyConst src_Sky    = this.ShogiGui.GameViewModel.GuiSkyConst;

            //------------------------------------------------------------
            // 表について
            //------------------------------------------------------------

            //
            // 配列の添え字は次の通り。
            //
            //    9 8 7 6 5 4 3 2 1
            //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┐
            //  │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│一
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │ 9│10│11│12│13│14│15│16│17│二
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │18│19│20│21│22│23│24│25│26│三
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │27│28│29│30│31│32│33│34│35│四
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            // │36│37│38│39│40│41│42│43│44│五
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │45│46│47│48│49│50│51│52│53│六
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │54│55│56│57│58│59│60│61│62│七
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │63│64│65│66│67│68│69│70│71│八
            //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┤
            //  │72│73│74│75│76│77│78│79│80│九
            //  └─┴─┴─┴─┴─┴─┴─┴─┴─┘

            //------------------------------------------------------------
            // 先手駒について
            //------------------------------------------------------------

            // 先手駒の位置を表にします。
            bool[] wallSTable = new bool[Ui_PnlMain.NSQUARE];

            // 先手駒の利きを表にします。
            bool[] kikiSTable = new bool[Ui_PnlMain.NSQUARE];

            Node <ShootingStarlightable, KyokumenWrapper> siteiNode = this.ShogiGui.GameViewModel.Kifu.NodeAt(
                this.ShogiGui.GameViewModel.Kifu.CountTesumi(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui))
                );

            foreach (Finger figKoma in Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, Playerside.P1).Items)
            {
                Starlightable light = src_Sky.StarlightIndexOf(figKoma).Now;
                RO_Star_Koma  koma  = Util_Koma.AsKoma(light);


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

                int dan;
                Util_MasuNum.MasuToDan(koma.Masu, out dan);

                // 壁
                wallSTable[(dan - 1) * 9 + (9 - suji)] = true;

                // 利き
                kikiSTable[(dan - 1) * 9 + (9 - suji)] = true;//FIXME:嘘
            }

            //------------------------------------------------------------
            // 後手駒について
            //------------------------------------------------------------

            // 先手駒の位置を表にします。
            bool[] wallGTable = new bool[Ui_PnlMain.NSQUARE];

            // 先手駒の利きを表にします。
            bool[] kikiGTable = new bool[Ui_PnlMain.NSQUARE];

            foreach (Finger figKoma in Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, Playerside.P2).Items)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);


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

                int dan;
                Util_MasuNum.MasuToDan(koma.Masu, out dan);

                // 壁
                wallGTable[(dan - 1) * 9 + (9 - suji)] = true;

                // 利き
                kikiGTable[(dan - 1) * 9 + (9 - suji)] = true;//FIXME:嘘
            }


            string tuginoItte = "▲9九王嘘";


            Fingers fingers = Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, this.ShogiGui.GameViewModel.Kifu.CountPside(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui)));

            if (0 < fingers.Count)
            {
                ShootingStarlightable tuginoMoveData;

                Finger    finger = fingers[LarabeRandom.Random.Next(fingers.Count)];//ランダムに1つ。
                Starlight sl     = src_Sky.StarlightIndexOf(finger);

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


                Playerside pside_getTeban = this.ShogiGui.GameViewModel.Kifu.CountPside(lastTesumi);
                switch (pside_getTeban)
                {
                case Playerside.P2:
                {
                    // 後手番です。
                    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

                    int dan;
                    Util_MasuNum.MasuToDan(koma.Masu, out dan);

                    // 前に1つ突き出させます。
                    tuginoMoveData = new RO_ShootingStarlight(
                        //sl.Finger,
                        new RO_Star_Koma(
                            pside_getTeban,
                            Util_Masu.OkibaSujiDanToMasu(
                                Util_Masu.GetOkiba(koma.Masu),
                                suji,
                                dan
                                ),
                            koma.Haiyaku
                            ),

                        new RO_Star_Koma(
                            pside_getTeban,
                            Util_Masu.OkibaSujiDanToMasu(
                                Okiba.ShogiBan,
                                suji,
                                dan + 1
                                ),
                            koma.Haiyaku
                            ),

                        PieceType.None
                        );
                    break;
                }

                default:
                {
                    // 先手番です。
                    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

                    int dan;
                    Util_MasuNum.MasuToDan(koma.Masu, out dan);

                    // 前に1つ突き出させます。
                    tuginoMoveData = new RO_ShootingStarlight(
                        //sl.Finger,
                        new RO_Star_Koma(
                            pside_getTeban,
                            Util_Masu.OkibaSujiDanToMasu(
                                Util_Masu.GetOkiba(koma.Masu),
                                suji,
                                dan
                                ),
                            koma.Haiyaku
                            ),

                        new RO_Star_Koma(
                            pside_getTeban,
                            Util_Masu.OkibaSujiDanToMasu(
                                Okiba.ShogiBan,
                                suji,
                                dan - 1
                                ),
                            koma.Haiyaku
                            ),

                        PieceType.None
                        );
                    break;
                }
                }


                RO_Star_Koma koma2 = Util_Koma.AsKoma(tuginoMoveData.LongTimeAgo);

                FugoJ fugoJ = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)](tuginoMoveData, new KyokumenWrapper(src_Sky));//「▲2二角成」なら、馬(dst)ではなくて角(src)。
                tuginoItte = fugoJ.ToText_UseDou(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui));
            }


            return(tuginoItte);
        }
コード例 #3
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());
        }