コード例 #1
0
        /// <summary>
        /// 動かす駒を移動先へ。
        /// </summary>
        /// <param name="figMovedKoma"></param>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="obsoluted_kifu_mutable"></param>
        /// <param name="isMakimodosi"></param>
        private static void Do24_UgokasuKoma_IdoSakiHe(
            out Finger figMovedKoma,
            IMove move,
            Playerside kaisi_tebanside,
            SkyConst kaisi_Sky,
            string hint
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            figMovedKoma = Fingers.Error_1;

            //------------------------------------------------------------
            // 選択  :  動かす駒
            //------------------------------------------------------------
            // 進むとき
            //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

            //Debug.Assert(null != move, "Sasu24_UgokasuKoma_IdoSakiHe: 指し手がヌルでした。");
            if (Util_Sky_BoolQuery.IsDaAction(move))// 多分、ここで move がヌルになるエラーがある☆
            {
                //----------
                // 駒台から “打”
                //----------
                RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo);
                RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now);

                // FIXME: 駒台の、どの駒を拾うか?
                figMovedKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(
                    kaisi_Sky,
                    Conv_SyElement.ToOkiba(srcKoma.Masu),
                    Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku)
                    );
                Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?14");
            }
            else
            {
                //----------
                // 将棋盤から
                //----------

                RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo);
                Debug.Assert(!Masu_Honshogi.IsErrorBasho(srcKoma.Masu), "srcKoma.Masuエラー。15");
                RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now);

                figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow(
                    kaisi_Sky,
                    dstKoma.Pside,
                    Util_Masu10.OkibaSujiDanToMasu(
                        Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(dstKoma.Masu)]),
                        Conv_SyElement.ToMasuNumber(srcKoma.Masu)
                        )
                    );
                Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?13");
            }
        }
コード例 #2
0
        /// <summary>
        /// 指したあとの、次の局面を作るだけ☆
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="finger"></param>
        /// <param name="masu"></param>
        /// <param name="pside_genTeban"></param>
        /// <param name="logTag"></param>
        /// <returns></returns>
        public static SkyConst Sasu(
            SkyConst src_Sky, //指定局面
            Finger finger,    //動かす駒
            SyElement masu,   //移動先マス
            bool toNaru       //成るなら真
            )
        {
            SkyBuffer sky_buf = new SkyBuffer(src_Sky);                         // 現局面を元に、新規局面を書き換えます。

            sky_buf.SetKaisiPside(Conv_Playerside.Reverse(src_Sky.KaisiPside)); // 開始先後を逆転させます。
            sky_buf.SetTemezumi(sky_buf.Temezumi + 1);                          // 1手進めます。
            SkyConst src_Sky2 = SkyConst.NewInstance(sky_buf,
                                                     -1                         //sky_bufでもう変えてあるので、そのまま。
                                                     );

            // 移動先に相手の駒がないか、確認します。
            Finger tottaKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky2, masu).ToFirst();

            if (tottaKoma != Fingers.Error_1)
            {
                // なにか駒を取ったら
                SyElement akiMasu;

                if (src_Sky.KaisiPside == Playerside.P1)
                {
                    akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, src_Sky2);
                }
                else
                {
                    akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, src_Sky2);
                }


                RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(tottaKoma).Now);

                // FIXME:配役あってるか?
                sky_buf.PutOverwriteOrAdd_Starlight(tottaKoma, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, akiMasu, koma.Komasyurui)));//tottaKoma,
            }

            // 駒を1個動かします。
            // FIXME: 取った駒はどうなっている?
            {
                RO_Star   koma       = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(finger).Now);
                PieceType komaSyurui = koma.Komasyurui;

                if (toNaru)
                {
                    komaSyurui = Util_Komasyurui14.ToNariCase(komaSyurui);
                }

                sky_buf.PutOverwriteOrAdd_Starlight(finger, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, masu, komaSyurui)));
            }

            return(SkyConst.NewInstance(sky_buf,
                                        -1//sky_bufでもう進めてあるので、そのまま。
                                        ));
        }
コード例 #3
0
        /// <summary>
        /// 局面に合わせて、駒ボタンのx,y位置を変更します
        /// </summary>
        /// <param name="btnKoma">駒</param>
        public static void Redraw_KomaLocation(
            Finger figKoma,
            NarabeRoomViewModel shogiGui
            )
        {
            RO_Star_Koma koma = Util_Koma.AsKoma(shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf(figKoma).Now);

            Shape_BtnKoma btnKoma = Util_InGui.FingerToKomaBtn(figKoma, shogiGui);

            int suji;
            int dan;

            Util_MasuNum.MasuToSuji(koma.Masu, out suji);
            Util_MasuNum.MasuToDan(koma.Masu, out dan);

            switch (Util_Masu.GetOkiba(koma.Masu))
            {
            case Okiba.ShogiBan:
                btnKoma.SetBounds(new Rectangle(
                                      shogiGui.Shape_PnlTaikyoku.Shogiban.SujiToX(suji),
                                      shogiGui.Shape_PnlTaikyoku.Shogiban.DanToY(dan),
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;

            case Okiba.Sente_Komadai:
                btnKoma.SetBounds(new Rectangle(
                                      shogiGui.Shape_PnlTaikyoku.KomadaiArr[0].SujiToX(suji),
                                      shogiGui.Shape_PnlTaikyoku.KomadaiArr[0].DanToY(dan),
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;

            case Okiba.Gote_Komadai:
                btnKoma.SetBounds(new Rectangle(
                                      shogiGui.Shape_PnlTaikyoku.KomadaiArr[1].SujiToX(suji),
                                      shogiGui.Shape_PnlTaikyoku.KomadaiArr[1].DanToY(dan),
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;

            case Okiba.KomaBukuro:
                btnKoma.SetBounds(new Rectangle(
                                      shogiGui.Shape_PnlTaikyoku.KomadaiArr[2].SujiToX(suji),
                                      shogiGui.Shape_PnlTaikyoku.KomadaiArr[2].DanToY(dan),
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;
            }
        }
コード例 #4
0
        public Finger ToFirst()
        {
            Finger finger = Fingers.Error_1;

            if (0 < this.Count)
            {
                finger = this[0];
            }

            return(finger);
        }
コード例 #5
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 駒のハンドル(*1)を元に、ボタンを返します。
        /// ************************************************************************************************************************
        ///
        ///     *1…将棋の駒1つ1つに付けられた番号です。
        ///
        /// </summary>
        /// <param name="hKoma"></param>
        /// <param name="shape_PnlTaikyoku"></param>
        /// <returns>なければヌル</returns>
        public static Shape_BtnKoma FingerToKomaBtn(Finger koma, MainGui_Csharp shogiGui)
        {
            Shape_BtnKoma found = null;

            int hKoma = (int)koma;

            if (0 <= hKoma && hKoma < shogiGui.Shape_PnlTaikyoku.Btn40Komas.Length)
            {
                found = shogiGui.Shape_PnlTaikyoku.Btn40Komas[hKoma];
            }

            return(found);
        }
コード例 #6
0
        /// <summary>
        /// 駒のハンドル(*1)を元に、ボタンを返します。
        ///
        ///     *1…将棋の駒1つ1つに付けられた番号です。
        ///
        /// </summary>
        /// <param name="hKoma"></param>
        /// <param name="shape_PnlTaikyoku"></param>
        /// <returns>なければヌル</returns>
        public static Shape_BtnKoma FingerToKomaBtn(Finger koma, NarabeRoomViewModel shogiGui)
        {
            Shape_BtnKoma found = null;

            int hKoma = (int)koma;

            if (0 <= hKoma && hKoma < shogiGui.Shape_PnlTaikyoku.BtnKomaDoors.Length)
            {
                found = shogiGui.Shape_PnlTaikyoku.BtnKomaDoors[hKoma];
            }

            return(found);
        }
コード例 #7
0
 public IttemodosuResultImpl(
     Finger figMovedKoma,
     Finger figFoodKoma,
     Node <IMove, KyokumenWrapper> out_newNode_OrNull,
     PieceType foodKomaSyurui,
     SkyConst susunda_Sky_orNull
     )
 {
     this.FigMovedKoma       = figMovedKoma;
     this.FigFoodKoma        = figFoodKoma;
     this.SyuryoNode_OrNull  = out_newNode_OrNull;
     this.FoodKomaSyurui     = foodKomaSyurui;
     this.Susunda_Sky_orNull = susunda_Sky_orNull;
 }
コード例 #8
0
 public SasuEntry(
     IMove newMove,
     //string moveStr,
     Finger finger,
     SyElement masu,
     bool naru
     )
 {
     this.NewMove = newMove;
     //this.MoveStr = moveStr;
     this.Finger = finger;
     this.Masu   = masu;
     this.Naru   = naru;
 }
コード例 #9
0
 /// <summary>
 /// 無ければ追加、あれば上書き。
 /// </summary>
 /// <param name="hKoma"></param>
 /// <param name="masus"></param>
 public static void AddOverwrite(
     Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus,
     Finger finger, SySet <SyElement> masus)
 {
     if (komabetuMasus.Items.ContainsKey(finger))
     {
         komabetuMasus.Items[finger].AddSupersets(masus);//追加します。
     }
     else
     {
         // 無かったので、新しく追加します。
         komabetuMasus.Items.Add(finger, masus);
     }
 }
コード例 #10
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 駒の移動可能升
        /// ************************************************************************************************************************
        ///
        /// ポテンシャルなので、貫通している。
        ///
        /// </summary>
        /// <param name="light"></param>
        /// <returns></returns>
        public static SySet <SyElement> KomaKidou_Potential(Finger finger, SkyConst src_Sky)
        {
            SySet <SyElement> result;

            RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

            //
            // ポテンシャルなので、貫通しているのは仕様通り。
            //
            // FIXME: 成香が横に進めることが分かっているか?
            //
            result = Array_Rule01_PotentialMove15.ItemMethods[(int)koma.Komasyurui](koma.Pside, koma.Masu);

            return(result);
        }
コード例 #11
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 軌道上の駒たち
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="km"></param>
        /// <returns></returns>
        public static void Fingers_EachSrcNow(out Fingers out_fingers, SySet <SyElement> srcList, SkyConst src_Sky, Playerside pside, IMoveHalf itaru)
        {
            out_fingers = new Fingers();

            foreach (SyElement masu in srcList.Elements)
            {
                Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(src_Sky, pside, masu);
                if (Util_Finger.ForHonshogi(finger))
                {
                    // 指定の升に駒がありました。
                    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    out_fingers.Add(finger);
                }
            }
        }
コード例 #12
0
 /// <summary>
 /// 無ければ追加、あれば上書き。
 /// </summary>
 /// <param name="hKoma"></param>
 /// <param name="masus"></param>
 public static void AddOverwrite(
     Maps_OneAndMulti <Finger, SyElement> komabetuMasu,
     Finger finger, SyElement masu)
 {
     if (komabetuMasu.Items.ContainsKey(finger))
     {
         komabetuMasu.Items[finger].Add(masu);//追加します。
     }
     else
     {
         // 無かったので、新しく追加します。
         List <SyElement> list = new List <SyElement>();
         list.Add(masu);
         komabetuMasu.Items.Add(finger, list);
     }
 }
コード例 #13
0
        public void Foreach_Starlights(DELEGATE_Sky_Foreach delegate_Sky_Foreach)
        {
            bool toBreak = false;

            Finger finger = 0;

            foreach (Starlight light in this.Starlights)
            {
                delegate_Sky_Foreach(finger, light, ref toBreak);

                finger = (int)finger + 1;
                if (toBreak)
                {
                    break;
                }
            }
        }
コード例 #14
0
 /// <summary>
 /// 駒台に戻すとき
 /// </summary>
 /// <param name="kifu"></param>
 /// <param name="finger"></param>
 /// <param name="light"></param>
 public void PutOverwriteOrAdd_Starlight(Finger finger, IMoveHalf light)
 {
     if (this.starlights.Count == (int)finger)
     {
         // オブジェクトを追加します。
         this.Starlights.Add(light);
     }
     else if (this.starlights.Count + 1 <= (int)finger)
     {
         // エラー
         throw new Exception($"{this.GetType().Name}#SetStarPos: リストの要素より2多いインデックスを指定されましたので、追加しません。starIndex=[{finger}] / this.stars.Count=[{this.starlights.Count}]");
     }
     else
     {
         this.Starlights[(int)finger] = light;
     }
 }
コード例 #15
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 指定のマスにある駒を返します。(本将棋用)
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="masu">マス番号</param>
        /// <returns>スプライト番号。なければエラー番号。</returns>
        public static RO_Star InMasuNow(SkyConst src_Sky, SyElement masu)
        {
            RO_Star koma = null;

            Finger fig = Util_Sky_FingersQuery.InMasuNow(src_Sky, masu).ToFirst();

            if (Fingers.Error_1 == fig)
            {
                // 指定の升には駒がない。
                goto gt_EndMethod;
            }

            koma = Util_Koma.FromFinger(src_Sky, fig);

gt_EndMethod:
            return(koma);
        }
コード例 #16
0
        public static RO_Star FromFinger(SkyConst src_Sky, Finger finger)
        {
            RO_Star koma;

            IMoveSource lightable = src_Sky.StarlightIndexOf(finger).Now;

            if (lightable is RO_Star)
            {
                koma = (RO_Star)lightable;
            }
            else
            {
                throw new Exception("未対応の星の光クラス");
            }

            return(koma);
        }
コード例 #17
0
        /// <summary>
        /// 駒台に戻すとき
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="finger"></param>
        /// <param name="light"></param>
        public void AddOverwriteStarlight(Finger finger, Starlight light)
        {
            if (this.starlights.Count == (int)finger)
            {
                this.Starlights.Add(light);
            }
            else if (this.starlights.Count + 1 <= (int)finger)
            {
                Debug.Assert((int)finger < this.Starlights.Count, "要素の個数より2大きいインデックスを指定しました。 インデックス[" + (int)finger + "] 要素の個数[" + this.Starlights.Count + "]");

                throw new Exception($"{this.GetType().Name}#SetStarPos: リストの要素より2多いインデックスを指定されましたので、追加しません。starIndex=[{finger}] / this.stars.Count=[{this.starlights.Count}]");
            }
            else
            {
                this.Starlights[(int)finger] = light;
            }
        }
コード例 #18
0
        /// <summary>
        /// 指し手一覧を、駒毎に分けます。
        /// TODO: これ、SkyConstに移動できないか☆?
        /// </summary>
        /// <param name="hubNode">指し手一覧</param>
        /// <returns>駒毎の、全指し手</returns>
        public static Maps_OneAndMulti <Finger, IMove> SplitMoveByStar(
            SkyConst src_Sky,
            Node <IMove, KyokumenWrapper> hubNode)
        {
            Maps_OneAndMulti <Finger, IMove> enable_teMap = new Maps_OneAndMulti <Finger, IMove>();


            hubNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> nextNode, ref bool toBreak) =>
            {
                IMove nextMove = nextNode.Key;

                Finger figKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky, Util_Starlightable.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst();

                enable_teMap.Put_NewOrOverwrite(figKoma, nextMove);
            });

            return(enable_teMap);
        }
コード例 #19
0
        /// <summary>
        /// 指し手一覧を、駒毎に分けます。
        /// </summary>
        /// <param name="hubNode">指し手一覧</param>
        /// <param name="logTag"></param>
        /// <returns>駒毎の、全指し手</returns>
        public Maps_OneAndMulti <Finger, ShootingStarlightable> SplitMoveByKoma(Node <ShootingStarlightable, KyokumenWrapper> hubNode)
        {
            SkyConst src_Sky = this.Value.ToKyokumenConst;


            Maps_OneAndMulti <Finger, ShootingStarlightable> enable_teMap = new Maps_OneAndMulti <Finger, ShootingStarlightable>();


            hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) =>
            {
                ShootingStarlightable nextMove = nextNode.Key;

                Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, Util_Koma.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst();

                enable_teMap.AddOverwrite(figKoma, nextMove);
            });

            return(enable_teMap);
        }
コード例 #20
0
        /// <summary>
        /// ハブ・ノードの次ノード・リストをJSON化します。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="src_Sky_base"></param>
        /// <param name="hubNode"></param>
        /// <param name="comment"></param>
        /// <param name="logTag"></param>
        /// <returns></returns>
        public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <ShootingStarlightable, KyokumenWrapper> hubNode, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

            hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> node, ref bool toBreak) =>
            {
                ShootingStarlightable move = node.Key;

                RO_Star_Koma srcKoma1 = Util_Koma.AsKoma(move.LongTimeAgo);
                RO_Star_Koma dstKoma  = Util_Koma.AsKoma(move.Now);


                Finger srcKoma2 = Util_Sky.Fingers_AtMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst();

                // 駒1つ
                PieceType ks14 = Haiyaku184Array.Syurui(dstKoma.Haiyaku);

                sb.AppendLine("            [");

                // マスの色
                sb.AppendLine("                { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },");

                // マス
                sb.AppendLine("                { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");


                string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, srcKoma2, "");
                sb.AppendLine("                { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");//FIXME:おかしい?

                // コメント
                sb.AppendLine("                { act:\"drawText\", text:\"" + comment + "\"  , x:0, y:20 },");

                sb.AppendLine("            ],");
            });

gt_EndMethod:
            return(sb.ToString());
        }
コード例 #21
0
        /// <summary>
        /// ハブ・ノードの次ノード・リストをJSON化します。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="src_Sky_base"></param>
        /// <param name="hubNode"></param>
        /// <param name="comment"></param>
        /// <param name="logTag"></param>
        /// <returns></returns>
        public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <IMove, KyokumenWrapper> hubNode, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

            hubNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> node, ref bool toBreak) =>
            {
                IMove move = node.Key;

                RO_Star srcKoma1 = Util_Starlightable.AsKoma(move.LongTimeAgo);
                RO_Star dstKoma  = Util_Starlightable.AsKoma(move.Now);


                Finger srcKoma2 = Util_Sky_FingersQuery.InMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst();

                // 駒1つ
                PieceType ks14 = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku);

                sb.AppendLine("            [");

                // マスの色
                sb.AppendLine("                { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },");

                // マス
                sb.AppendLine($"                {{ act:\"drawMasu\" , masu:{Conv_SyElement.ToMasuNumber(dstKoma.Masu)} }},");


                string komaImg = Util_Converter_LogGraphicEx.Finger_ToString(src_Sky_base, srcKoma2, "");
                sb.AppendLine($"                {{ act:\"drawImg\", img:\"{komaImg}\", masu: {Conv_SyElement.ToMasuNumber(dstKoma.Masu)} }},");//FIXME:おかしい?

                // コメント
                sb.AppendLine($"                {{ act:\"drawText\", text:\"{comment}\"  , x:0, y:20 }},");

                sb.AppendLine("            ],");
            });

gt_EndMethod:
            return(sb.ToString());
        }
コード例 #22
0
        public static SkyConst Sasu(
            SkyConst src_Sky,         //現局面
            Finger finger,            //動かす駒
            SyElement masu,           //移動先マス
            Playerside pside_genTeban //動かす駒がどちらのプレイヤーのものか
            )
        {
            SkyBuffer dst_Sky = new SkyBuffer(src_Sky.Clone()); // 現局面をコピーします。

            // 移動先に相手の駒がないか、確認します。
            Finger tottaKoma = Util_Sky.Fingers_AtMasuNow(new SkyConst(dst_Sky), masu).ToFirst();

            if (tottaKoma != Fingers.Error_1)
            {
                // なにか駒を取ったら
                SyElement akiMasu;

                if (pside_genTeban == Playerside.P1)
                {
                    akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, new SkyConst(dst_Sky));
                }
                else
                {
                    akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, new SkyConst(dst_Sky));
                }


                RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(tottaKoma).Now);

                // FIXME:配役あってるか?
                dst_Sky.AddOverwriteStarlight(tottaKoma, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, akiMasu, koma.Syurui)));//tottaKoma,
            }

            // 駒を1個動かします。
            // FIXME: 取った駒はどうなっている?
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(finger).Now);

                dst_Sky.AddOverwriteStarlight(finger, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, masu, koma.Syurui)));//finger,
            }

            return(new SkyConst(dst_Sky));
        }
コード例 #23
0
        /// <summary>
        /// ************************************************************************************************************************
        /// [巻戻し]ボタン
        /// ************************************************************************************************************************
        /// </summary>
        public static bool Makimodosi_Gui(
            NarabeRoomViewModel shogiGui,
            Finger movedKoma,
            Finger foodKoma,
            string fugoJStr,
            string backedInputText)
        {
            //------------------------------
            // チェンジターン
            //------------------------------
            shogiGui.ChangeTurn();//[巻戻し]ボタンを押したあと


            //------------------------------
            // 符号表示
            //------------------------------
            shogiGui.Shape_PnlTaikyoku.SetFugo(fugoJStr);


            Shape_BtnKoma btn_movedKoma = Util_InGui.FingerToKomaBtn(movedKoma, shogiGui);
            Shape_BtnKoma btn_foodKoma  = Util_InGui.FingerToKomaBtn(foodKoma, shogiGui);//取られた駒

            //------------------------------------------------------------
            // 駒・再描画
            //------------------------------------------------------------
            if (
                null != btn_movedKoma //動かした駒
                ||
                null != btn_foodKoma  //取ったときに下にあった駒(巻戻しのときは、これは無し)
                )
            {
                shogiGui.ResponseData.RedrawStarlights();// 駒の再描画要求
            }

            // 巻き戻したので、符号が入ります。
            {
                shogiGui.ResponseData.InputTextString = fugoJStr + " " + backedInputText;// 入力欄
                shogiGui.ResponseData.OutputTxt       = ResponseGedanTxt.Kifu;
            }
            shogiGui.ResponseData.ToRedraw();

            return(true);
        }
コード例 #24
0
        /// <summary>
        /// 駒画像のファイル名。
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="finger"></param>
        /// <param name="extentionWithDot"></param>
        /// <returns></returns>
        public static string Finger_ToString(SkyConst src_Sky, Finger finger, string extentionWithDot)
        {
            string komaImg = "";

            if ((int)finger < Finger_Honshogi.Items_KomaOnly.Length)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                Playerside pside = koma.Pside;
                PieceType  ks14  = Util_Komahaiyaku184.Syurui(koma.Haiyaku);

                komaImg = Util_Converter_LogGraphicEx.PsideKs14_ToString(pside, ks14, extentionWithDot);
            }
            else
            {
                komaImg = Util_Converter_LogGraphicEx.PsideKs14_ToString(Playerside.Empty, PieceType.None, extentionWithDot);
            }

            return(komaImg);
        }
コード例 #25
0
        /// <summary>
        /// 駒の種類(不成として扱います)を指定して、駒を検索します。
        /// </summary>
        /// <param name="okiba"></param>
        /// <param name="komasyurui"></param>
        /// <param name="uc_Main"></param>
        /// <returns>無ければ -1</returns>
        public static Finger InOkibaSyuruiNowIgnoreCase(SkyConst srcSky, Okiba okiba, PieceType komasyurui)
        {
            Finger found = Fingers.Error_1;

            PieceType syuruiNarazuCase = Util_Komasyurui14.NarazuCaseHandle(komasyurui);

            foreach (Finger finger in Finger_Honshogi.Items_KomaOnly)
            {
                RO_Star koma = Util_Starlightable.AsKoma(srcSky.StarlightIndexOf(finger).Now);

                if (Conv_SyElement.ToOkiba(koma.Masu) == okiba &&
                    Util_Komasyurui14.Matches(koma.ToNarazuCase(), syuruiNarazuCase))
                {
                    found = finger;
                    break;
                }
            }

            return(found);
        }
コード例 #26
0
        /// <summary>
        /// 次の局面の一覧をもった、入れ物ノードを返します。
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="pside_genTeban"></param>
        /// <returns></returns>
        public static KifuNode ToNextNodes_AsHubNode(
            Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove,
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode,
            Playerside pside_genTeban)
        {
            KifuNode hubNode = new KifuNodeImpl(null, null, Playerside.Empty);//蝶番

#if DEBUG
            string dump = komabetuAllMove.Dump();
#endif

            foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry1 in komabetuAllMove.Items)
            {
                Finger figKoma = entry1.Key;// 駒

                // 駒の動ける升全て
                foreach (ShootingStarlightable move in entry1.Value)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(move.Now);

                    SyElement masu = koma.Masu;

                    SkyConst nextSky = Util_Sasu.Sasu(siteiNode.Value.ToKyokumenConst, figKoma, masu, pside_genTeban);

                    Node <ShootingStarlightable, KyokumenWrapper> nextNode = new KifuNodeImpl(move, new KyokumenWrapper(nextSky), KifuNodeImpl.GetReverseTebanside(pside_genTeban));//次のノード

                    string sfenText = Util_Sky.ToSfenMoveText(move);
                    if (hubNode.ContainsKey_NextNodes(sfenText))
                    {
                        // 既存の指し手なら無視
                        System.Console.WriteLine("既存の指し手なので無視します。sfenText=[" + sfenText + "]");
                    }
                    else
                    {
                        hubNode.Add_NextNode(Util_Sky.ToSfenMoveText(move), nextNode);
                    }
                }
            }

            return(hubNode);
        }
コード例 #27
0
        /// <summary>
        /// 2駒関係[KK]用。
        /// フィーチャーベクターの調査項目インデックス。該当なければ-1。
        /// </summary>
        /// <param name="pside">プレイヤーサイド</param>
        /// <param name="komasyurui">盤上の種類</param>
        /// <param name="masu">盤上の駒の升</param>
        /// <returns></returns>
        public static int ToKIndex_From_PsideBanjoKomasyuruiMasu(SkyConst src_Sky, Playerside pside)
        {
            // 調査項目番号(K1、K2等)
            int result;

            SyElement masu;

            {
                Finger  figK1  = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(src_Sky, Okiba.ShogiBan, pside, PieceType.K).ToFirst();
                RO_Star komaK1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figK1).Now);
                masu = komaK1.Masu;
            }

            if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(masu))
            {
                // 盤上でなければ。
                result = -1;
                goto gt_EndMethod;
            }

            int kSuji;

            Util_MasuNum.TryMasuToSuji(masu, out kSuji);
            int kDan;

            Util_MasuNum.TryMasuToDan(masu, out kDan);


            int p1;

            Conv_FvKoumoku522.Converter_K1_to_P(Playerside.P1, kDan, kSuji, out p1);


            result = p1;

gt_EndMethod:
            ;
            return(result);
        }
コード例 #28
0
        /// <summary>
        /// 将棋盤上での検索
        /// </summary>
        /// <param name="srcAll">候補マス</param>
        /// <param name="komas"></param>
        /// <returns></returns>
        public static bool Query_Koma(
            Playerside pside,
            PieceType syurui,
            SySet <SyElement> srcAll,
            SkyConst src_Sky,//KifuTree kifu,
            out Finger foundKoma
            )
        {
            //SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst;

            bool hit = false;

            foundKoma = Fingers.Error_1;


            foreach (New_Basho masu1 in srcAll.Elements)//筋・段。(先後、種類は入っていません)
            {
                foreach (Finger koma1 in Finger_Honshogi.Items_KomaOnly)
                {
                    RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma1).Now);


                    if (pside == koma2.Pside &&
                        Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma2.Masu) &&
                        Util_Komasyurui14.Matches(syurui, Util_Komahaiyaku184.Syurui(koma2.Haiyaku)) &&
                        masu1 == koma2.Masu
                        )
                    {
                        // 候補マスにいた
                        //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                        hit       = true;
                        foundKoma = koma1;
                        break;
                    }
                }
            }

            return(hit);
        }
コード例 #29
0
        /// <summary>
        /// 変換:星別指し手一覧 → 次の局面の一覧をもった、入れ物ノード。
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="pside_genTeban"></param>
        /// <returns>次の局面一覧を持った、入れ物ノード(ハブ・ノード)</returns>
        public static KifuNode ToNextNodes_AsHubNode(
            Maps_OneAndMulti <Finger, IMove> komabetuAllMove,
            SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> to_parentNode,//親となる予定のノード
            )
        {
            KifuNode hubNode = new KifuNodeImpl(null, null);//蝶番

#if DEBUG
            string dump = komabetuAllMove.Dump();
#endif

            foreach (KeyValuePair <Finger, List <IMove> > entry1 in komabetuAllMove.Items)
            {
                Finger figKoma = entry1.Key;         // 動かす駒

                foreach (IMove move in entry1.Value) // 駒の動ける升
                {
                    string sfenText = ConvMoveStrSfen.ToMoveStrSfen(move);
                    if (hubNode.ContainsKey_ChildNodes(sfenText))
                    {
                        // 既存の指し手なら無視
                        Logger.Trace($"既存の指し手なので無視します1。sfenText=[{sfenText}]");
                    }
                    else
                    {
                        // 指したあとの次の局面を作るだけ☆
                        hubNode.PutAdd_ChildNode(ConvMoveStrSfen.ToMoveStrSfen(move), new KifuNodeImpl(move, new KyokumenWrapper(
                                                                                                           Util_Sasu341.Sasu(
                                                                                                               src_Sky,                                  // to_parentNode.Value.ToKyokumenConst,//指定局面
                                                                                                               figKoma,                                  //動かす駒
                                                                                                               Util_Starlightable.AsKoma(move.Now).Masu, //移動先升
                                                                                                               false                                     //成りません。
                                                                                                               ))));
                    }
                }
            }

            return(hubNode);
        }
コード例 #30
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 指定のマスにある駒を返します。(本将棋用)
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="masu">マス番号</param>
        /// <returns>スプライト番号。なければエラー番号。</returns>
        public static RO_Star InMasuPsideKomasyuruiNow(SkyConst src_Sky, SyElement masu, Playerside pside, PieceType syurui)
        {
            RO_Star koma = null;

            Finger fig = Util_Sky_FingersQuery.InMasuNow(src_Sky, masu).ToFirst();

            if (Fingers.Error_1 == fig)
            {
                // 指定の升には駒がない。
                goto gt_EndMethod;
            }

            koma = Util_Koma.FromFinger(src_Sky, fig);
            if (koma.Pside != pside || koma.Komasyurui != syurui)
            {
                // サイド または駒の種類が異なる
                koma = null;
                goto gt_EndMethod;
            }

gt_EndMethod:
            return(koma);
        }