Beispiel #1
0
        public void Log3(
            SkyConst src_Sky,
            Playerside tebanKurau,       //手番(喰らう側)
            Playerside tebanSeme,        //手番(利きを調べる側)
            Fingers fingers_kurau_IKUSA, //戦駒(喰らう側)
            Fingers fingers_kurau_MOTI,  // 持駒(喰らう側)
            Fingers fingers_seme_IKUSA,  //戦駒(利きを調べる側)
            Fingers fingers_seme_MOTI    // 持駒(利きを調べる側)
            )
        {
            // 攻め手の駒の位置
            KaisetuBoard boardLog_clone = new KaisetuBoard(this.BrdMove);

            foreach (Finger finger in fingers_seme_IKUSA.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                Gkl_KomaMasu km = new Gkl_KomaMasu(
                    Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""),
                    Conv_SyElement.ToMasuNumber(koma.Masu)
                    );
                boardLog_clone.KomaMasu1.Add(km);
            }

            foreach (Finger finger in fingers_kurau_IKUSA.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                this.BrdMove.KomaMasu2.Add(new Gkl_KomaMasu(
                                               Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanKurau, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""),
                                               Conv_SyElement.ToMasuNumber(koma.Masu)
                                               ));
            }

            foreach (Finger finger in fingers_seme_MOTI.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                Gkl_KomaMasu km = new Gkl_KomaMasu(
                    Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""),
                    Conv_SyElement.ToMasuNumber(koma.Masu)
                    );
                this.BrdMove.KomaMasu3.Add(km);
            }

            foreach (Finger finger in fingers_kurau_MOTI.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                this.BrdMove.KomaMasu4.Add(new Gkl_KomaMasu(
                                               Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanKurau, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""),
                                               Conv_SyElement.ToMasuNumber(koma.Masu)
                                               ));
            }
            this.BrdMove = boardLog_clone;
        }
Beispiel #2
0
        /// <summary>
        /// 不一致判定: 先後、駒種類  が、自分と同じものが <ひとつもない>
        /// </summary>
        /// <returns></returns>
        public static bool NeverOnaji(IMoveHalf ms, SkyConst src_Sky, params Fingers[] komaGroupArgs)
        {
            bool unmatched = true;

            foreach (Fingers komaGroup in komaGroupArgs)
            {
                foreach (Finger figKoma in komaGroup.Items)
                {
                    RO_Star koma1 = Util_Starlightable.AsKoma(ms.Now);
                    RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);



                    if (
                        koma1.Pside == koma2.Pside &&  // 誰のものか
                        Util_Komahaiyaku184.Syurui(koma1.Haiyaku) == Util_Komahaiyaku184.Syurui(koma2.Haiyaku)    // 駒の種類は
                        )
                    {
                        // 1つでも一致するものがあれば、終了します。
                        unmatched = false;
                        goto gt_EndLoop;
                    }
                }
            }
gt_EndLoop:

            return(unmatched);
        }
Beispiel #3
0
        /// <summary>
        /// 指定の場所にある駒を返します。
        ///
        ///         先後は見ますが、将棋盤限定です。
        ///
        /// </summary>
        /// <param name="okiba">置き場</param>
        /// <param name="masu">筋、段</param>
        /// <param name="uc_Main">メインパネル</param>
        /// <returns>駒。無ければヌル。</returns>
        public static Finger InShogibanMasuNow(SkyConst src_Sky, Playerside pside, SyElement masu)
        {
            Finger foundKoma = Fingers.Error_1;

            foreach (Finger finger in Finger_Honshogi.Items_KomaOnly)
            {
                IMoveHalf sl = src_Sky.StarlightIndexOf(finger);

                RO_Star koma = Util_Starlightable.AsKoma(sl.Now);

                int suji1;
                int suji2;
                int dan1;
                int dan2;
                Util_MasuNum.TryMasuToSuji(koma.Masu, out suji1);
                Util_MasuNum.TryMasuToSuji(masu, out suji2);
                Util_MasuNum.TryMasuToDan(koma.Masu, out dan1);
                Util_MasuNum.TryMasuToDan(masu, out dan2);

                // 先後は見ますが、将棋盤限定です。
                if (
                    koma.Pside == pside &&
                    Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan &&
                    suji1 == suji2 &&
                    dan1 == dan2
                    )
                {
                    foundKoma = finger;
                    break;
                }
            }

            return(foundKoma);
        }
Beispiel #4
0
        /// <summary>
        /// 用途例:持ち駒を確認するために使います。
        /// </summary>
        /// <param name="hkomas_gen_MOTI"></param>
        /// <returns></returns>
        public static string JsonElements_KomaHandles(bool enableLog, SkyConst src_Sky, List <int> hKomas, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

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


            foreach (int hKoma in hKomas)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(hKoma).Now);


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



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

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

gt_EndMethod:
            return(sb.ToString());
        }
Beispiel #5
0
        //Dictionary<Starbeamable, KyokumenWrapper>
        public static Dictionary <string, SasuEntry> KomabetuMasusToMoveBetuSky(
            List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky)
        {
            Dictionary <string, SasuEntry> moveBetuEntry = new Dictionary <string, SasuEntry>();


            sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                foreach (SyElement dstMasu in value.Elements)
                {
                    IMove move = Util_Sky258A.BuildMove(
                        new RO_Star(src_Sky.KaisiPside, koma.Masu, koma.Haiyaku),
                        new RO_Star(src_Sky.KaisiPside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。
                        PieceType.None
                        );

                    string moveStr      = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー
                    SasuEntry sasuEntry = new SasuEntry(
                        move,
                        key,     //動かす駒
                        dstMasu, //移動先升
                        false    //成りません。
                        );
                    if (!moveBetuEntry.ContainsKey(moveStr))
                    {
                        moveBetuEntry.Add(moveStr, sasuEntry);
                    }
                }
            });

            return(moveBetuEntry);

            /*
             * Dictionary<Starbeamable, KyokumenWrapper> result = new Dictionary<Starbeamable, KyokumenWrapper>();
             * foreach (KeyValuePair<string, SasuEntry> entry in movebetuEntry)
             * {
             *  result.Add(
             *      entry.Value.NewMove,
             *      new KyokumenWrapper(Util_Sasu341.Sasu(
             *      src_Sky,//指定局面
             *      entry.Value.Finger,//動かす駒
             *      entry.Value.Masu,//移動先升
             *      entry.Value.Naru,//成りません。
             *      logTag
             *  )));
             * }
             *
             * return result;
             */
        }
Beispiel #6
0
        /// <summary>
        /// フィンガー番号→駒→駒のある升の集合
        /// </summary>
        /// <param name="fingers"></param>
        /// <param name="src_Sky"></param>
        /// <returns></returns>
        public static SySet <SyElement> ToMasus(Fingers fingers, SkyConst src_Sky)
        {
            SySet <SyElement> masus = new SySet_Default <SyElement>("何かの升");

            foreach (Finger finger in fingers.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                masus.AddElement(koma.Masu);
            }

            return(masus);
        }
Beispiel #7
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);
        }
Beispiel #8
0
        /// <summary>
        /// 駒のハンドル(*1)を返します。
        ///
        ///         *1…将棋の駒1つ1つに付けられた番号です。
        ///
        /// </summary>
        /// <param name="syurui"></param>
        /// <param name="hKomas"></param>
        /// <returns></returns>
        public static Fingers InKomasyuruiNow(SkyConst src_Sky, PieceType syurui)
        {
            Fingers figKomas = new Fingers();

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


                if (Util_Komasyurui14.Matches(syurui, Util_Komahaiyaku184.Syurui(koma.Haiyaku)))
                {
                    figKomas.Add(figKoma);
                }
            }

            return(figKomas);
        }
Beispiel #9
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);
        }
Beispiel #10
0
        /// <summary>
        /// 指定した置き場にある駒のハンドルを返します。
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="okiba"></param>
        /// <returns></returns>
        public static Fingers InOkibaNow(SkyConst src_Sky, Okiba okiba)
        {
            Fingers komas = new Fingers();

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


                if (okiba == Conv_SyElement.ToOkiba(koma.Masu))
                {
                    komas.Add(figKoma);
                }
            }

            return(komas);
        }
Beispiel #11
0
        private void ToBanObject201(SkyConst src_Sky)
        {
            this.kaisiPside = src_Sky.KaisiPside;// TODO:

            //Util_Sky.Assert_Honshogi(src_Sky);


            // 将棋の駒40個の場所を確認します。
            foreach (Finger finger in src_Sky.Fingers_All().Items)
            {
                IMoveSource light  = src_Sky.StarlightIndexOf(finger).Now;
                RO_Star     komaKs = Util_Starlightable.AsKoma(light);

                Debug.Assert(Conv_MasuHandle.OnAll(Conv_SyElement.ToMasuNumber(komaKs.Masu)), $"(int)koma.Masu=[{Conv_SyElement.ToMasuNumber(komaKs.Masu)}]");//升番号

                this.AddKoma(komaKs.Masu,
                             new RO_Star(komaKs)
                             );
            }
        }
Beispiel #12
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 駒のハンドルを返します。 : 置き場、種類
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="okiba"></param>
        /// <param name="syurui"></param>
        /// <param name="kifu"></param>
        /// <returns></returns>
        public static Fingers InOkibaKomasyuruiNow(SkyConst src_Sky, Okiba okiba, PieceType syurui)
        {
            Fingers komas = new Fingers();

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


                if (
                    okiba == Conv_SyElement.ToOkiba(koma.Masu) &&
                    Util_Komasyurui14.Matches(syurui, koma.Komasyurui)   // Util_Komahaiyaku184.Syurui(koma.Haiyaku)
                    )
                {
                    komas.Add(figKoma);
                }
            }

            return(komas);
        }
Beispiel #13
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);
        }
Beispiel #14
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);
        }
Beispiel #15
0
        /// <summary>
        /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」
        /// </summary>
        /// <param name="komaBETUSusumeruMasus">駒別の進める升</param>
        /// <param name="siteiNode">指定ノード</param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, IMove> ToKomaBetuAllMoves(
            List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus,
            SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> siteiNode
            )
        {
            Maps_OneAndMulti <Finger, IMove> result_komabetuAllMove = new Maps_OneAndMulti <Finger, IMove>();

            komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) =>
            {
                // 動かす星。
                RO_Star srcStar = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                foreach (SyElement susumuMasu in susumuMasuSet.Elements)// 星が進める升。
                {
                    // 移動先の星(升の変更)
                    RO_Star dstStar = new RO_Star(
                        srcStar.Pside,
                        susumuMasu,        //Masu_Honshogi.Items_All[Util_Masu10.AsMasuNumber(susumuMasu)],
                        srcStar.Komasyurui // srcStar.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい
                        );

                    IMove move = new RO_Starbeam(
                        srcStar,                                              // 移動元
                        dstStar,                                              // 移動先
                        PieceType.None                                        //取った駒不明
                        );
                    result_komabetuAllMove.Put_NewOrOverwrite(figKoma, move); //FIXME: 1つの駒に指し手は1つ??

                    // これが通称【水際のいんちきプログラム】なんだぜ☆
                    // 必要により、【成り】の指し手を追加します。
                    Util_Sasu269.Add_KomaBETUAllNariMoves(
                        result_komabetuAllMove,
                        figKoma, //動かす駒
                        srcStar, //動かす星
                        dstStar  //移動先の星
                        );
                }
            });

            return(result_komabetuAllMove);
        }
Beispiel #16
0
        public static Dictionary <string, SasuEntry> ToMoveBetuSky1(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus,
            SkyConst src_Sky
            )
        {
            Dictionary <string, SasuEntry> result_komabetuEntry = new Dictionary <string, SasuEntry>();

            komabetuSusumuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                foreach (SyElement dstMasu in value.Elements)
                {
                    IMove move = Util_Sky258A.BuildMove(
                        //key,
                        new RO_Star(src_Sky.KaisiPside, koma.Masu, koma.Haiyaku),
                        new RO_Star(src_Sky.KaisiPside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。
                        PieceType.None
                        );

                    string moveStr = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー

                    if (!result_komabetuEntry.ContainsKey(moveStr))
                    {
                        result_komabetuEntry.Add(
                            moveStr,
                            new SasuEntry(
                                move,
                                key,     //動かす駒
                                dstMasu, //移動先升
                                false    //成りません
                                )
                            );
                    }
                }
            });

            return(result_komabetuEntry);
        }
Beispiel #17
0
        /// <summary>
        /// 駒別マスをJSON化します。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="src_Sky_base"></param>
        /// <param name="km_move"></param>
        /// <param name="comment"></param>
        /// <returns></returns>
        public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

            km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                // 駒1つ
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky_base.StarlightIndexOf(key).Now);

                PieceType ks14 = Util_Komahaiyaku184.Syurui(koma.Haiyaku);

                sb.AppendLine("            [");

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

                // 全マス
                foreach (New_Basho masu in value.Elements)
                {
                    sb.AppendLine($"                {{ act:\"drawMasu\" , masu:{masu.MasuNumber} }},");
                }


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

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

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

gt_EndMethod:
            return(sb.ToString());
        }
Beispiel #18
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);
        }
Beispiel #19
0
        ///// <summary>
        ///// 駒sを渡すと、駒の種類のカウントを返します。
        ///// </summary>
        //public static void Translate_Fingers_ToKomasyuruiCount(
        //    SkyConst src_Sky,
        //    Fingers figKomas,
        //    out int[] out_komasyuruisCount
        //    )
        //{
        //    out_komasyuruisCount = new int[Array_Komasyurui.Items_All.Length];

        //    foreach (Finger figMotiKoma in figKomas.Items)
        //    {
        //        // 持ち駒の種類
        //        Komasyurui14 motikomaSyurui = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figMotiKoma).Now).Komasyurui;
        //        out_komasyuruisCount[(int)motikomaSyurui]++;
        //    }
        //}

        /// <summary>
        /// 駒sを渡すと、駒を1つずつ返します。
        /// </summary>
        public static void Translate_Fingers_ToKomasyuruiBETUFirst(
            SkyConst src_Sky,
            Fingers figKomas,
            out Finger[] out_figKomasFirst
            )
        {
            out_figKomasFirst = new Finger[Array_Komasyurui.Items_AllElements.Length];

            foreach (PieceType komasyurui in Array_Komasyurui.Items_AllElements)
            {
                out_figKomasFirst[(int)komasyurui] = Fingers.Error_1; //ヌル値は無い。指定が必要。
            }

            foreach (Finger figMotiKoma in figKomas.Items)
            {
                // 持ち駒の種類
                PieceType motikomaSyurui = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figMotiKoma).Now).Komasyurui;
                if (out_figKomasFirst[(int)motikomaSyurui] == Fingers.Error_1)
                {
                    out_figKomasFirst[(int)motikomaSyurui] = figMotiKoma;
                }
            }
        }
Beispiel #20
0
        public void Log4(
            SkyConst src_Sky,
            Playerside tebanSeme,//手番(利きを調べる側)
            Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA
            )
        {
            // 戦駒の移動可能場所
            KaisetuBoard boardLog_clone = new KaisetuBoard(this.BrdMove);

            kmMove_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now);

                string komaImg = Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), "");

                foreach (New_Basho masu in value.Elements)
                {
                    boardLog_clone.Masu_theMove.Add((int)masu.MasuNumber);
                }
            });

            this.BrdMove = boardLog_clone;
        }
Beispiel #21
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 指定の筋にあるスプライトを返します。(本将棋用)二歩チェックに利用。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="okiba">置き場</param>
        /// <param name="pside">先後</param>
        /// <param name="pside">駒種類</param>
        /// <param name="suji">筋番号1~9</param>
        /// <returns></returns>
        public static Fingers InOkibaPsideKomasyuruiSujiNow(SkyConst src_Sky, Okiba okiba, Playerside pside, PieceType ks, int suji)
        {
            Fingers found = new Fingers();

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

                int suji2;
                Util_MasuNum.TryMasuToSuji(koma2.Masu, out suji2);

                if (
                    Conv_SyElement.ToOkiba(koma2.Masu) == okiba &&
                    koma2.Pside == pside &&
                    koma2.Komasyurui == ks &&
                    suji2 == suji
                    )
                {
                    found.Add(finger);
                }
            }

            return(found);
        }
Beispiel #22
0
        public static void Assert_Honshogi(SkyConst src_Sky)
        {
            Debug.Assert(src_Sky.Count == 40, $"siteiSky.Starlights.Count=[{src_Sky.Count}]");//将棋の駒の数

            ////デバッグ
            //{
            //    StringBuilder sb = new StringBuilder();

            //    for (int i = 0; i < 40; i++)
            //    {
            //        sb.Append("駒{i}.種類=[{((RO_Star_KomaKs)siteiSky.StarlightIndexOf(i).Now).Syurui}]\n");
            //    }

            //    MessageBox.Show(sb.ToString());
            //}


            // 王
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(0).Now).Komasyurui == PieceType.K, $"駒0.種類=[{((RO_Star)src_Sky.StarlightIndexOf(0).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(1).Now).Komasyurui == PieceType.K, $"駒1.種類=[{((RO_Star)src_Sky.StarlightIndexOf(1).Now).Komasyurui}]");

            // 飛車
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(2).Now).Komasyurui == PieceType.R || ((RO_Star)src_Sky.StarlightIndexOf(2).Now).Komasyurui == PieceType.PR, $"駒2.種類=[{((RO_Star)src_Sky.StarlightIndexOf(2).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(3).Now).Komasyurui == PieceType.R || ((RO_Star)src_Sky.StarlightIndexOf(3).Now).Komasyurui == PieceType.PR, $"駒3.種類=[{((RO_Star)src_Sky.StarlightIndexOf(3).Now).Komasyurui}]");

            // 角
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(4).Now).Komasyurui == PieceType.B || ((RO_Star)src_Sky.StarlightIndexOf(4).Now).Komasyurui == PieceType.PB, $"駒4.種類=[{((RO_Star)src_Sky.StarlightIndexOf(4).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(5).Now).Komasyurui == PieceType.B || ((RO_Star)src_Sky.StarlightIndexOf(5).Now).Komasyurui == PieceType.PB, $"駒5.種類=[{((RO_Star)src_Sky.StarlightIndexOf(5).Now).Komasyurui}]");

            // 金
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(6).Now).Komasyurui == PieceType.G, $"駒6.種類=[{((RO_Star)src_Sky.StarlightIndexOf(6).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(7).Now).Komasyurui == PieceType.G, $"駒7.種類=[{((RO_Star)src_Sky.StarlightIndexOf(7).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(8).Now).Komasyurui == PieceType.G, $"駒8.種類=[{((RO_Star)src_Sky.StarlightIndexOf(8).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(9).Now).Komasyurui == PieceType.G, $"駒9.種類=[{((RO_Star)src_Sky.StarlightIndexOf(9).Now).Komasyurui}]");

            // 銀
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(10).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(10).Now).Komasyurui == PieceType.PS, $"駒10.種類=[{((RO_Star)src_Sky.StarlightIndexOf(10).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(11).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(11).Now).Komasyurui == PieceType.PS, $"駒11.種類=[{((RO_Star)src_Sky.StarlightIndexOf(11).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(12).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(12).Now).Komasyurui == PieceType.PS, $"駒12.種類=[{((RO_Star)src_Sky.StarlightIndexOf(12).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(13).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(13).Now).Komasyurui == PieceType.PS, $"駒13.種類=[{((RO_Star)src_Sky.StarlightIndexOf(13).Now).Komasyurui}]");

            // 桂
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(14).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(14).Now).Komasyurui == PieceType.PN, $"駒14.種類=[{((RO_Star)src_Sky.StarlightIndexOf(14).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(15).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(15).Now).Komasyurui == PieceType.PN, $"駒15.種類=[{((RO_Star)src_Sky.StarlightIndexOf(15).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(16).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(16).Now).Komasyurui == PieceType.PN, $"駒16.種類=[{((RO_Star)src_Sky.StarlightIndexOf(16).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(17).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(17).Now).Komasyurui == PieceType.PN, $"駒17.種類=[{((RO_Star)src_Sky.StarlightIndexOf(17).Now).Komasyurui}]");

            // 香
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(18).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(18).Now).Komasyurui == PieceType.PL, $"駒18.種類=[{((RO_Star)src_Sky.StarlightIndexOf(18).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(19).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(19).Now).Komasyurui == PieceType.PL, $"駒19.種類=[{((RO_Star)src_Sky.StarlightIndexOf(19).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(20).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(20).Now).Komasyurui == PieceType.PL, $"駒20.種類=[{((RO_Star)src_Sky.StarlightIndexOf(20).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(21).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(21).Now).Komasyurui == PieceType.PL, $"駒21.種類=[{((RO_Star)src_Sky.StarlightIndexOf(21).Now).Komasyurui}]");

            // 歩
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(22).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(22).Now).Komasyurui == PieceType.PP, "駒22.種類=[{((RO_Star)src_Sky.StarlightIndexOf(22).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(23).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(23).Now).Komasyurui == PieceType.PP, "駒23.種類=[{((RO_Star)src_Sky.StarlightIndexOf(23).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(24).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(24).Now).Komasyurui == PieceType.PP, "駒24.種類=[{((RO_Star)src_Sky.StarlightIndexOf(24).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(25).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(25).Now).Komasyurui == PieceType.PP, "駒25.種類=[{((RO_Star)src_Sky.StarlightIndexOf(25).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(26).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(26).Now).Komasyurui == PieceType.PP, "駒26.種類=[{((RO_Star)src_Sky.StarlightIndexOf(26).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(27).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(27).Now).Komasyurui == PieceType.PP, "駒27.種類=[{((RO_Star)src_Sky.StarlightIndexOf(27).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(28).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(28).Now).Komasyurui == PieceType.PP, "駒28.種類=[{((RO_Star)src_Sky.StarlightIndexOf(28).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(29).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(29).Now).Komasyurui == PieceType.PP, "駒29.種類=[{((RO_Star)src_Sky.StarlightIndexOf(29).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(30).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(30).Now).Komasyurui == PieceType.PP, "駒30.種類=[{((RO_Star)src_Sky.StarlightIndexOf(30).Now).Komasyurui}]");

            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(31).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(31).Now).Komasyurui == PieceType.PP, "駒31.種類=[{((RO_Star)src_Sky.StarlightIndexOf(31).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(32).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(32).Now).Komasyurui == PieceType.PP, "駒32.種類=[{((RO_Star)src_Sky.StarlightIndexOf(32).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(33).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(33).Now).Komasyurui == PieceType.PP, "駒33.種類=[{((RO_Star)src_Sky.StarlightIndexOf(33).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(34).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(34).Now).Komasyurui == PieceType.PP, "駒34.種類=[{((RO_Star)src_Sky.StarlightIndexOf(34).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(35).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(35).Now).Komasyurui == PieceType.PP, "駒35.種類=[{((RO_Star)src_Sky.StarlightIndexOf(35).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(36).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(36).Now).Komasyurui == PieceType.PP, "駒36.種類=[{((RO_Star)src_Sky.StarlightIndexOf(36).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(37).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(37).Now).Komasyurui == PieceType.PP, "駒37.種類=[{((RO_Star)src_Sky.StarlightIndexOf(37).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(38).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(38).Now).Komasyurui == PieceType.PP, "駒38.種類=[{((RO_Star)src_Sky.StarlightIndexOf(38).Now).Komasyurui}]");
            Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(39).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(39).Now).Komasyurui == PieceType.PP, "駒39.種類=[{((RO_Star)src_Sky.StarlightIndexOf(39).Now).Komasyurui}]");



            for (int i = 0; i < 40; i++)
            {
                RO_Star        koma    = (RO_Star)src_Sky.StarlightIndexOf(0).Now;
                Komahaiyaku185 haiyaku = koma.Haiyaku;

                if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu))
                {
                    Debug.Assert(!Util_KomahaiyakuEx184.IsKomabukuro(haiyaku), "将棋盤の上に、配役:駒袋 があるのはおかしい。");
                }


                //if(
                //    haiyaku==Kh185.n164_歩打
                //    )
                //{
                //}
                //koma.Syurui
                //Debug.Assert((.Syurui == Ks14.H06_Oh, $"駒0.種類=[{((RO_Star_Koma)siteiSky.StarlightIndexOf(0).Now).Syurui}]");
                //sb.Append($"駒{i}.種類=[{((RO_Star_KomaKs)siteiSky.StarlightIndexOf(i).Now).Syurui}]\n");
            }
        }
Beispiel #23
0
        /// <summary>
        /// 持ち駒を数えます。
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="mK"></param>
        /// <param name="mR"></param>
        /// <param name="mB"></param>
        /// <param name="mG"></param>
        /// <param name="mS"></param>
        /// <param name="mN"></param>
        /// <param name="mL"></param>
        /// <param name="mP"></param>
        /// <param name="mk"></param>
        /// <param name="mr"></param>
        /// <param name="mb"></param>
        /// <param name="mg"></param>
        /// <param name="ms"></param>
        /// <param name="mn"></param>
        /// <param name="ml"></param>
        /// <param name="mp"></param>
        /// <param name="logTag"></param>
        public static void CountMoti(
            SkyConst src_Sky,
            out int mK,
            out int mR,
            out int mB,
            out int mG,
            out int mS,
            out int mN,
            out int mL,
            out int mP,

            out int mk,
            out int mr,
            out int mb,
            out int mg,
            out int ms,
            out int mn,
            out int ml,
            out int mp
            )
        {
            mK = 0;
            mR = 0;
            mB = 0;
            mG = 0;
            mS = 0;
            mN = 0;
            mL = 0;
            mP = 0;

            mk = 0;
            mr = 0;
            mb = 0;
            mg = 0;
            ms = 0;
            mn = 0;
            ml = 0;
            mp = 0;

            Fingers komas_moti1p; // 先手の持駒
            Fingers komas_moti2p; // 後手の持駒

            Util_Sky_FingersQueryFx.Split_Moti1p_Moti2p(out komas_moti1p, out komas_moti2p, src_Sky);

            foreach (Finger figKoma in komas_moti1p.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                PieceType syurui = Util_Komasyurui14.NarazuCaseHandle(Util_Komahaiyaku184.Syurui(koma.Haiyaku));
                if (PieceType.K == syurui)
                {
                    mK++;
                }
                else if (PieceType.R == syurui)
                {
                    mR++;
                }
                else if (PieceType.B == syurui)
                {
                    mB++;
                }
                else if (PieceType.G == syurui)
                {
                    mG++;
                }
                else if (PieceType.S == syurui)
                {
                    mS++;
                }
                else if (PieceType.N == syurui)
                {
                    mN++;
                }
                else if (PieceType.L == syurui)
                {
                    mL++;
                }
                else if (PieceType.P == syurui)
                {
                    mP++;
                }
                else
                {
                }
            }

            // 後手の持駒
            foreach (Finger figKoma in komas_moti2p.Items)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf((int)figKoma).Now);

                PieceType syurui = Util_Komasyurui14.NarazuCaseHandle(Util_Komahaiyaku184.Syurui(koma.Haiyaku));

                if (PieceType.K == syurui)
                {
                    mk++;
                }
                else if (PieceType.R == syurui)
                {
                    mr++;
                }
                else if (PieceType.B == syurui)
                {
                    mb++;
                }
                else if (PieceType.G == syurui)
                {
                    mg++;
                }
                else if (PieceType.S == syurui)
                {
                    ms++;
                }
                else if (PieceType.N == syurui)
                {
                    mn++;
                }
                else if (PieceType.L == syurui)
                {
                    ml++;
                }
                else if (PieceType.P == syurui)
                {
                    mp++;
                }
                else
                {
                }
            }
        }
Beispiel #24
0
        /// <summary>
        /// 表形式の局面データを出力します。SFENとの親和性高め。
        /// </summary>
        /// <returns></returns>
        public static ISfenPosition1 ToRO_Kyokumen1(KifuNode kifuNode)
        {
            ISfenPosition1 ro_Kyokumen1 = new SfenPosition1Impl();

            SkyConst src_Sky = kifuNode.Value.KyokumenConst;

            // 将棋盤
            for (int suji = 1; suji < 10; suji++)
            {
                for (int dan = 1; dan < 10; dan++)
                {
                    Finger koma0 = Util_Sky_FingersQuery.InMasuNow(
                        src_Sky, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan)
                        ).ToFirst();

                    if (Fingers.Error_1 != koma0)
                    {
                        RO_Star koma1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma0).Now);

                        ro_Kyokumen1.Ban[suji, dan] = Util_Komasyurui14.SfenText(
                            Util_Komahaiyaku184.Syurui(koma1.Haiyaku),
                            koma1.Pside
                            );
                    }
                }
            }

            // 持ち駒
            int mK = 0;
            int mR = 0;
            int mB = 0;
            int mG = 0;
            int mS = 0;
            int mN = 0;
            int mL = 0;
            int mP = 0;

            int mk = 0;
            int mr = 0;
            int mb = 0;
            int mg = 0;
            int ms = 0;
            int mn = 0;
            int ml = 0;
            int mp = 0;

            Util_Sky_CountQuery.CountMoti(
                src_Sky,
                out mK,
                out mR,
                out mB,
                out mG,
                out mS,
                out mN,
                out mL,
                out mP,

                out mk,
                out mr,
                out mb,
                out mg,
                out ms,
                out mn,
                out ml,
                out mp
                );

            int player;

            player = 1;
            ro_Kyokumen1.Moti[player, 0] = mR;
            ro_Kyokumen1.Moti[player, 1] = mB;
            ro_Kyokumen1.Moti[player, 2] = mG;
            ro_Kyokumen1.Moti[player, 3] = mS;
            ro_Kyokumen1.Moti[player, 4] = mN;
            ro_Kyokumen1.Moti[player, 5] = mL;
            ro_Kyokumen1.Moti[player, 6] = mP;

            player = 2;
            ro_Kyokumen1.Moti[player, 0] = mr;
            ro_Kyokumen1.Moti[player, 1] = mb;
            ro_Kyokumen1.Moti[player, 2] = mg;
            ro_Kyokumen1.Moti[player, 3] = ms;
            ro_Kyokumen1.Moti[player, 4] = mn;
            ro_Kyokumen1.Moti[player, 5] = ml;
            ro_Kyokumen1.Moti[player, 6] = mp;

            // 手目済み
            ro_Kyokumen1.Temezumi = src_Sky.Temezumi;

            return(ro_Kyokumen1);
        }
Beispiel #25
0
        /// <summary>
        /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// (ポテンシャル・ムーブ=障害物がなかったときの動き)
        ///
        /// 1局面につき、1回実行される。
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers_sirabetaiMOTIkoma"></param>
        /// <param name="motiOkenaiMasus">持ち駒を置けないマス(味方駒、敵駒が置いてあるマス)</param>
        /// <returns></returns>
        public static List_OneAndMulti <Finger, SySet <SyElement> > Translate_Motikoma_ToMove(
            SkyConst src_Sky,
            Fingers fingers_sirabetaiMOTIkoma,
            SySet <SyElement> masus_mikata_onBanjo, //打ち歩詰めチェック用
            SySet <SyElement> masus_aite_onBanjo,   //打ち歩詰めチェック用
            SySet <SyElement> motiOkenaiMasus
            )
        {
            // 駒種類別、置こうとする升
            SySet <SyElement>[] aMasus = new SySet <SyElement> [Array_Komasyurui.Items_AllElements.Length];
            // 駒種類別、置こうとする駒(持駒の代表)
            RO_Star[] aDaihyo = new RO_Star[Array_Komasyurui.Items_AllElements.Length];
            // 駒種類別、置こうとする駒番号
            Finger[] aFigKoma = new Finger[Array_Komasyurui.Items_AllElements.Length];


            Finger[] daihyoArray;// 持駒。駒の種類代表1個
            Util_Fingers_KomasyuruiQuery.Translate_Fingers_ToKomasyuruiBETUFirst(
                src_Sky,
                fingers_sirabetaiMOTIkoma,
                out daihyoArray
                );
            foreach (Finger figDaihyo in daihyoArray)
            {
                if (Fingers.Error_1 != figDaihyo)
                {
                    RO_Star daihyo = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figDaihyo).Now);
#if DEBUG
                    Debug.Assert(daihyo != null, "持ち駒の代表がヌル");
#endif
                    // 駒種類別、置こうとする駒
                    aDaihyo[(int)daihyo.Komasyurui] = daihyo;
                    // 駒種類別、置こうとする升
                    aMasus[(int)daihyo.Komasyurui] = Util_Sky_SyugoQuery.KomaKidou_Potential(figDaihyo, src_Sky);
                    // 駒種類別、置こうとする駒番号
                    aFigKoma[(int)daihyo.Komasyurui] = figDaihyo;
                }
            }


            if (aDaihyo[(int)PieceType.P] != null)// 攻め手が、歩を持っているなら
            {
                //----------------------------------------
                // 二歩チェック
                //----------------------------------------
                //
                // 打てない筋の升を除外します。
                //
#if DEBUG
                //if (null != errH_orNull)
                //{
                //    Logger.Trace("----------------------------------------");
                //    Logger.Trace($"歩を置きたかった升={Util_SySet.Dump_Elements(aMasus[(int)Komasyurui14.H01_Fu_____])}");
                //    Logger.Trace("----------------------------------------");
                //    Logger.Trace("歩の置けない筋チェック(二歩チェック)開始");
                //}
#endif
                // 将棋盤上の自歩一覧。
                Fingers banjoJiFus = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(
                    src_Sky,                         //指定局面
                    Okiba.ShogiBan,                  //将棋盤上の
                    aDaihyo[(int)PieceType.P].Pside, //持駒を持っているプレイヤー側の
                    PieceType.P                      //歩
                    );

#if DEBUG
                //if (null != errH_orNull)
                //{
                //    Logger.Trace($"banjoJiFus.Count=[{banjoJiFus.Count}]");
                //    foreach (Finger figKoma in banjoJiFus.Items)
                //    {
                //        Logger.Trace($"figKoma=[{(int)figKoma}]");
                //    }
                //    Logger.Trace("----------------------------------------");
                //}
#endif

                // 筋別、歩のあるなしチェック
                bool[] existsFu_sujibetu = new bool[10];
                foreach (Finger figBanjoJiFu in banjoJiFus.Items)
                {
                    RO_Star banjoJiFu = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figBanjoJiFu).Now);
                    int     suji;//1~9
                    Util_MasuNum.TryMasuToSuji(banjoJiFu.Masu, out suji);
                    existsFu_sujibetu[suji] = true;
                }

                // 9筋 確認します。
                for (int suji = 1; suji < 10; suji++)
                {
                    if (existsFu_sujibetu[suji])
                    {
                        // 二歩になる筋番号の発見☆
#if DEBUG
                        //Logger.Trace($"二歩チェック: {suji}筋は二歩。");
#endif

                        // 筋一列を、クリアーします。

                        // 駒種類別、置こうとする升
                        aMasus[(int)PieceType.P] = aMasus[(int)PieceType.P].Minus_Closed(
                            Masu_Honshogi.BAN_SUJIS[suji], Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);
                    }
                }
#if DEBUG
                //if (null != errH_orNull)
                //{
                //    Logger.Trace("歩の置けない筋チェック(二歩チェック)終了");
                //    Logger.Trace("----------------------------------------");
                //    Logger.Trace($"歩の置ける升={Util_SySet.Dump_Elements(aMasus[(int)Komasyurui14.H01_Fu_____])}");
                //    Logger.Trace("----------------------------------------");
                //}
#endif

                //----------------------------------------
                // 打ち歩詰めチェック
                //----------------------------------------
                if (false)
                {
                    Util_Utifudume.Utifudume(
                        src_Sky,
                        masus_mikata_onBanjo, //打ち歩詰めチェック用
                        masus_aite_onBanjo,   //打ち歩詰めチェック用
                        aMasus                //駒種類別、置こうとする升
                        );
                }
            }



            //----------------------------------------
            // 集計
            //----------------------------------------
            // 「どの持ち駒を」「どこに置ける」のコレクション。
            List_OneAndMulti <Finger, SySet <SyElement> > result = new List_OneAndMulti <Finger, SySet <SyElement> >();
            foreach (PieceType ks in Array_Komasyurui.MotiKoma7Syurui)
            {
                // 置こうとする駒があれば
                if (null != aDaihyo[(int)ks])
                {
                    // 置けない升を引きます。
                    aMasus[(int)ks] = aMasus[(int)ks].Minus_Closed(
                        motiOkenaiMasus, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);

                    if (!aMasus[(int)ks].IsEmptySet())
                    {
                        // 置ける升があれば登録
                        result.AddNew(
                            aFigKoma[(int)ks], //置こうとする持駒番号
                            aMasus[(int)ks]    //置ける升
                            );
                    }
                }
            }
            return(result);
        }
Beispiel #26
0
        /// <summary>
        /// 局面データから、SFEN文字列を作ります。
        /// </summary>
        /// <param name="pside"></param>
        /// <returns></returns>
        public static string ToSfenstring(KifuNode kifuNode, Playerside pside)
        {
            SkyConst src_Sky = kifuNode.Value.KyokumenConst;

            StringBuilder sb = new StringBuilder();

            sb.Append("sfen ");

            for (int dan = 1; dan <= 9; dan++)
            {
                int spaceCount = 0;

                for (int suji = 9; suji >= 1; suji--)
                {
                    // 将棋盤上のどこかにある駒?
                    Finger koma0 = Util_Sky_FingersQuery.InMasuNow(
                        src_Sky, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan)
                        ).ToFirst();

                    if (Fingers.Error_1 != koma0)
                    {
                        if (0 < spaceCount)
                        {
                            sb.Append(spaceCount);
                            spaceCount = 0;
                        }


                        RO_Star koma1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma0).Now);



                        sb.Append(Util_Komasyurui14.SfenText(
                                      Util_Komahaiyaku184.Syurui(koma1.Haiyaku),
                                      koma1.Pside
                                      ));
                    }
                    else
                    {
                        spaceCount++;
                    }
                }

                if (0 < spaceCount)
                {
                    sb.Append(spaceCount);
                    spaceCount = 0;
                }

                if (dan != 9)
                {
                    sb.Append("/");
                }
            }

            sb.Append(" ");

            //------------------------------------------------------------
            // 先後
            //------------------------------------------------------------
            switch (pside)
            {
            case Playerside.P2:
                sb.Append("w");
                break;

            default:
                sb.Append("b");
                break;
            }

            sb.Append(" ");

            //------------------------------------------------------------
            // 持ち駒
            //------------------------------------------------------------
            {
                int mK = 0;
                int mR = 0;
                int mB = 0;
                int mG = 0;
                int mS = 0;
                int mN = 0;
                int mL = 0;
                int mP = 0;

                int mk = 0;
                int mr = 0;
                int mb = 0;
                int mg = 0;
                int ms = 0;
                int mn = 0;
                int ml = 0;
                int mp = 0;
                Util_Sky_CountQuery.CountMoti(
                    src_Sky,
                    out mK,
                    out mR,
                    out mB,
                    out mG,
                    out mS,
                    out mN,
                    out mL,
                    out mP,

                    out mk,
                    out mr,
                    out mb,
                    out mg,
                    out ms,
                    out mn,
                    out ml,
                    out mp
                    );



                if (0 == mK + mR + mB + mG + mS + mN + mL + mP + mk + mr + mb + mg + ms + mn + ml + mp)
                {
                    sb.Append("-");
                }
                else
                {
                    if (0 < mK)
                    {
                        if (1 < mK)
                        {
                            sb.Append(mK);
                        }
                        sb.Append("K");
                    }

                    if (0 < mR)
                    {
                        if (1 < mR)
                        {
                            sb.Append(mR);
                        }
                        sb.Append("R");
                    }

                    if (0 < mB)
                    {
                        if (1 < mB)
                        {
                            sb.Append(mB);
                        }
                        sb.Append("B");
                    }

                    if (0 < mG)
                    {
                        if (1 < mG)
                        {
                            sb.Append(mG);
                        }
                        sb.Append("G");
                    }

                    if (0 < mS)
                    {
                        if (1 < mS)
                        {
                            sb.Append(mS);
                        }
                        sb.Append("S");
                    }

                    if (0 < mN)
                    {
                        if (1 < mN)
                        {
                            sb.Append(mN);
                        }
                        sb.Append("N");
                    }

                    if (0 < mL)
                    {
                        if (1 < mL)
                        {
                            sb.Append(mL);
                        }
                        sb.Append("L");
                    }

                    if (0 < mP)
                    {
                        if (1 < mP)
                        {
                            sb.Append(mP);
                        }
                        sb.Append("P");
                    }

                    if (0 < mk)
                    {
                        if (1 < mk)
                        {
                            sb.Append(mk);
                        }
                        sb.Append("k");
                    }

                    if (0 < mr)
                    {
                        if (1 < mr)
                        {
                            sb.Append(mr);
                        }
                        sb.Append("r");
                    }

                    if (0 < mb)
                    {
                        if (1 < mb)
                        {
                            sb.Append(mb);
                        }
                        sb.Append("b");
                    }

                    if (0 < mg)
                    {
                        if (1 < mg)
                        {
                            sb.Append(mg);
                        }
                        sb.Append("g");
                    }

                    if (0 < ms)
                    {
                        if (1 < ms)
                        {
                            sb.Append(ms);
                        }
                        sb.Append("s");
                    }

                    if (0 < mn)
                    {
                        if (1 < mn)
                        {
                            sb.Append(mn);
                        }
                        sb.Append("n");
                    }

                    if (0 < ml)
                    {
                        if (1 < ml)
                        {
                            sb.Append(ml);
                        }
                        sb.Append("l");
                    }

                    if (0 < mp)
                    {
                        if (1 < mp)
                        {
                            sb.Append(mp);
                        }
                        sb.Append("p");
                    }
                }
            }

            // 手目
            sb.Append(" 1");

            return(sb.ToString());
        }
Beispiel #27
0
        /// <summary>
        /// 特殊な用途。
        /// </summary>
        /// <param name="collection"></param>
        /// <returns></returns>
        public static string Dump(List_OneAndMulti <T1, T2> collection, SkyConst skyConst)
        {
            int count = 0;

            StringBuilder sb = new StringBuilder();

            {
                foreach (Couple <T1, T2> item in collection.Items)
                {
                    if (item.A is Finger && item.B is SySet <SyElement> )
                    {
                        foreach (SyElement syElement in ((SySet <SyElement>)item.B).Elements)
                        {
                            sb.AppendLine($"({count}) a=[{Util_Komasyurui14.Ichimoji[(int)Util_Starlightable.AsKoma(skyConst.StarlightIndexOf(item.A as Finger).Now).Komasyurui]}] b=[{Util_Masu10.ToSujiKanji(syElement)}]");
                            count++;
                        }
                    }
                    else
                    {
                        sb.AppendLine($"({count}) a=[{item.A.ToString()}] b=[{item.B.ToString()}]");
                        count++;
                    }
                }
            }

            return(sb.ToString());
        }
Beispiel #28
0
        /// <summary>
        /// 符号1「7g7f」を元に、move を作ります。
        ///
        /// <[再生]、[コマ送り]で呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void ToMove(
            bool isHonshogi,
            string str1,    //123456789 か、 PLNSGKRB
            string str2,    //abcdefghi か、 *
            string str3,    //123456789
            string str4,    //abcdefghi
            string strNari, //+
            out IMove move,
            KifuTree kifu,
            string hint
            )
        {
            move = Util_Sky258A.NullObjectMove;

            Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode;
            SkyConst src_Sky = siteiNode.Value.KyokumenConst;
            //kifu.AssertPside(kifu.CurNode, $"str1={str1}");
            Playerside pside1 = src_Sky.KaisiPside;

#if DEBUG
            Debug.Assert(!Conv_MasuHandle.OnKomabukuro(Conv_SyElement.ToMasuNumber(((RO_Star)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), $"[{src_Sky.Temezumi}]手目、駒が駒袋にあった。");
#endif

            PieceType uttaSyurui; // 打った駒の種類

            int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI;
            int srcDan  = Util_Koma.CTRL_NOTHING_PROPERTY_DAN;

            if ("*" == str2)
            {
                //>>>>>>>>>> 「打」でした。

                Conv_String268.SfenUttaSyurui(str1, out uttaSyurui);
            }
            else
            {
                //>>>>>>>>>> 指しました。
                uttaSyurui = PieceType.None;//打った駒はない☆

                //------------------------------
                // 1
                //------------------------------
                if (!int.TryParse(str1, out srcSuji))
                {
                }

                //------------------------------
                // 2
                //------------------------------
                srcDan = Conv_Alphabet.ToInt(str2);
            }

            //------------------------------
            // 3
            //------------------------------
            int suji;
            if (!int.TryParse(str3, out suji))
            {
            }

            //------------------------------
            // 4
            //------------------------------
            int dan;
            dan = Conv_Alphabet.ToInt(str4);



            Finger koma;

            if ("*" == str2)
            {
                //>>>>> 「打」でした。

                // 駒台から、打った種類の駒を取得
                koma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(
                    siteiNode.Value.KyokumenConst,
                    Conv_Playerside.ToKomadai(pside1),//FIXME:
                    uttaSyurui);
                if (Fingers.Error_1 == koma)
                {
                    throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。");
                }


                //// FIXME: 打のとき、srcSuji、srcDan が Int.Min
            }
            else
            {
                //>>>>> 打ではないとき
                SyElement masu1  = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan);
                Fingers   komas1 = Util_Sky_FingersQuery.InMasuNow(//これが空っぽになるときがある。
                    src_Sky, masu1
                    );
                koma = komas1.ToFirst();

                if (Fingers.Error_1 == koma)
                {
                    //
                    // エラーの理由:
                    // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど
                    //

                    var sky2 = Util_Sky307.Json_1Sky(src_Sky, "エラー駒になったとき",
                                                     $"{hint}_SF解3",
                                                     src_Sky.Temezumi);

                    string text2;
                    if (masu1 is New_Basho)
                    {
                        text2 = $@"masu1.masuNumber=[{((New_Basho)masu1).MasuNumber}]
komas1.Count=[{komas1.Count}]";
                    }
                    else
                    {
                        text2 = "masu1.masuNumber=New_Basho型じゃない。";
                    }

                    StringBuilder sb = new StringBuilder();
                    throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗:SFENでは [{srcSuji}]筋、[{srcDan}]段 にある駒を掴めと指示がありましたが、
将棋盤データの[{Conv_Sy.Query_Word(masu1.Bitfield)}]マスには、(駒が全て駒袋に入っているのか)駒がありませんでした。
hint=[{hint}]
{text2}
isHonshogi=[{isHonshogi}]
str1=[{str1}]
str2=[{str2}]
str3=[{str3}]
str4=[{str4}]
strNari=[{strNari}]
src_Sky.Temezumi=[{src_Sky.Temezumi}]
局面 = sfen {Util_StartposExporter.ToSfenstring(new StartposExporterImpl(src_Sky), true)}
{sky2}
");
                }
            }


            PieceType dstSyurui;
            PieceType srcSyurui;
            Okiba     srcOkiba;
            SyElement srcMasu;


            if ("*" == str2)
            {
                //>>>>> 打った駒の場合

                dstSyurui = uttaSyurui;
                srcSyurui = uttaSyurui;
                switch (pside1)
                {
                case Playerside.P2:
                    srcOkiba = Okiba.Gote_Komadai;
                    break;

                case Playerside.P1:
                    srcOkiba = Okiba.Sente_Komadai;
                    break;

                default:
                    srcOkiba = Okiba.Empty;
                    break;
                }


                Finger srcKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(siteiNode.Value.KyokumenConst, srcOkiba, srcSyurui);

                RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now);

                srcMasu = dstKoma.Masu;
            }
            else
            {
                //>>>>> 盤上の駒を指した場合

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


                dstSyurui = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku);
                srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。
                srcOkiba  = Okiba.ShogiBan;
                srcMasu   = Util_Masu10.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan);
            }


            //------------------------------
            // 5
            //------------------------------
            if ("+" == strNari)
            {
                // 成りました
                dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)dstSyurui];
            }


            //------------------------------
            // 結果
            //------------------------------
            // 棋譜
            move = new RO_Starbeam(
                //koma,//TODO:

                new RO_Star(
                    pside1,
                    srcMasu,//FIXME:升ハンドルにしたい
                    srcSyurui
                    ),

                new RO_Star(
                    pside1,
                    Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい
                    dstSyurui
                    ),

                PieceType.None//符号からは、取った駒は分からない
                );
        }
Beispiel #29
0
        /// <summary>
        /// 次の1手データを作ります(*1)
        ///
        ///         *1…符号1「▲68銀上」を元に、「7968」を作ります。
        ///
        /// <[再生]、[コマ送り]で呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void ToMove(
            string strPside,      //▲△
            string strSuji,       //123…9、123…9、一二三…九
            string strDan,        //123…9、123…9、一二三…九
            string strDou,        // “同”
            string strSrcSyurui,  //(歩|香|桂|…
            string strMigiHidari, // 右|左…
            string strAgaruHiku,  // 上|引
            string strNariNarazu, //成|不成
            string strDaHyoji,    //打
            out IMove move,
            KifuTree kifu
            )
        {
            Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode;
            SkyConst src_Sky = siteiNode.Value.KyokumenConst;

            //------------------------------
            // 符号確定
            //------------------------------
            MigiHidari migiHidari = Conv_String268.Str_ToMigiHidari(strMigiHidari);
            AgaruHiku  agaruHiku  = Conv_String268.Str_ToAgaruHiku(strAgaruHiku); // 上|引
            NariNarazu nariNarazu = Conv_String268.Nari_ToBool(strNariNarazu);    //成
            DaHyoji    daHyoji    = Conv_String268.Str_ToDaHyoji(strDaHyoji);     //打

            PieceType srcSyurui = Conv_String268.Str_ToSyurui(strSrcSyurui);


            //------------------------------
            //
            //------------------------------
            Playerside pside = Conv_String268.Pside_ToEnum(strPside);


            SyElement dstMasu;

            if ("同" == strDou)
            {
                // 1手前の筋、段を求めるのに使います。

                RO_Star koma = Util_Starlightable.AsKoma(siteiNode.Key.Now);

                dstMasu = koma.Masu;
            }
            else
            {
                dstMasu = Util_Masu10.OkibaSujiDanToMasu(
                    Okiba.ShogiBan,
                    Conv_Suji.ToInt(strSuji),
                    Conv_Suji.ToInt(strDan)
                    );
            }

            // TODO: 駒台にあるかもしれない。
            Okiba srcOkiba1 = Okiba.ShogiBan; //Okiba.FUMEI_FUGO_YOMI_CHOKUGO;// Okiba.SHOGIBAN;

            if (DaHyoji.Visible == daHyoji)
            {
                if (Playerside.P2 == pside)
                {
                    srcOkiba1 = Okiba.Gote_Komadai;
                }
                else
                {
                    srcOkiba1 = Okiba.Sente_Komadai;
                }
            }

            //
            SyElement dst1 = dstMasu;

            Finger foundKoma = Fingers.Error_1;

            //----------
            // 駒台の駒を(明示的に)打つなら
            //----------
            bool utsu = false;//駒台の駒を打つなら真

            if (DaHyoji.Visible == daHyoji)
            {
                utsu = true;
                goto gt_EndShogiban;
            }

            if (PieceType.P == srcSyurui)
            {
                #region 歩
                //************************************************************
                // 歩
                //************************************************************

                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│  │  │  │
                //├─┼─┼─┤
                //│  │至│  │
                //├─┼─┼─┤
                //│  │E│  │
                //└─┴─┴─┘
                bool isE = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.R == srcSyurui)
            {
                #region 飛
                //************************************************************
                // 飛
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │  │  │  │  │  │  │  │  │A7│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │A3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A0│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E0│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │E4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E7│  │  │  │  │  │  │  │  │
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isA = true;
                bool isC = true;
                bool isE = true;
                bool isG = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isE = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isC = false;
                    isG = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isE = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isG = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isC = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isC = false;
                    isG = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.B == srcSyurui)
            {
                #region 角
                //************************************************************
                // 角
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │H7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │B7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │H6│  │  │  │  │  │  │  │  │  │  │  │  │  │B6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │H5│  │  │  │  │  │  │  │  │  │  │  │B5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │H4│  │  │  │  │  │  │  │  │  │B4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │H3│  │  │  │  │  │  │  │B3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │H2│  │  │  │  │  │B2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │H1│  │  │  │B1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │H0│  │B0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │至│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │F0│  │D0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │F1│  │  │  │D1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │F2│  │  │  │  │  │D2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │F3│  │  │  │  │  │  │  │D3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │F4│  │  │  │  │  │  │  │  │  │D4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │F5│  │  │  │  │  │  │  │  │  │  │  │D5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │F6│  │  │  │  │  │  │  │  │  │  │  │  │  │D6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │F7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │D7│
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isB = true;
                bool isD = true;
                bool isF = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isB = false;
                    isD = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isB = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isB = false;
                    isH = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isF = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isB = false;
                    isD = false;
                    break;

                case MigiHidari.Sugu:
                    isD = false;
                    isF = false;
                    break;
                }

                SySet_Default <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1));
                }

                //----------
                // 候補マスB
                //----------
                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.L == srcSyurui)
            {
                #region 香
                //************************************************************
                // 香
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┐
                //  │  │至│  │
                //  ├─┼─┼─┤
                //  │  │E0│  │
                //  ├─┼─┼─┤
                //  │  │E1│  │
                //  ├─┼─┼─┤
                //  │  │E2│  │
                //  ├─┼─┼─┤
                //  │  │E3│  │
                //  ├─┼─┼─┤
                //  │  │E4│  │
                //  ├─┼─┼─┤
                //  │  │E5│  │
                //  ├─┼─┼─┤
                //  │  │E6│  │
                //  ├─┼─┼─┤
                //  │  │E7│  │
                //  └─┴─┴─┘
                bool isE = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.N == srcSyurui)
            {
                #region 桂
                //************************************************************
                // 桂
                //************************************************************
                //----------
                // 候補マス
                //----------
                //┌─┐ ┌─┐
                //│  │ │  │
                //├─┼─┼─┤
                //│ │  │  │
                //├─┼─┼─┤
                //│ │至│  │先手から見た図
                //├─┼─┼─┤
                //│ │  │  │
                //├─┼─┼─┤
                //│J│ │I│
                //└─┘ └─┘
                bool isI = true;
                bool isJ = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isI = false;
                    isJ = false;
                    break;

                case AgaruHiku.Agaru:
                    break;

                case AgaruHiku.Hiku:
                    isI = false;
                    isJ = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isJ = false;
                    break;

                case MigiHidari.Hidari:
                    isI = false;
                    break;

                case MigiHidari.Sugu:
                    isI = false;
                    isJ = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isI)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻跳(pside, dst1));
                }
                if (isJ)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻駆(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.S == srcSyurui)
            {
                #region 銀
                //************************************************************
                // 銀
                //************************************************************
                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│H│  │B│
                //├─┼─┼─┤
                //│ │至│  │先手から見た図
                //├─┼─┼─┤
                //│F│E│D│
                //└─┴─┴─┘
                bool isB = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isB = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isB = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isD = false;
                    isE = false;
                    isF = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isB = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isB = false;
                    isD = false;
                    isF = false;
                    isH = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (
                PieceType.G == srcSyurui ||
                PieceType.PP == srcSyurui ||
                PieceType.PL == srcSyurui ||
                PieceType.PN == srcSyurui ||
                PieceType.PS == srcSyurui
                )
            {
                #region △金、△と金、△成香、△成桂、△成銀
                //************************************************************
                // △金、△と金、△成香、△成桂、△成銀
                //************************************************************
                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│  │A│  │
                //├─┼─┼─┤
                //│G│至│C│先手から見た図
                //├─┼─┼─┤
                //│F│E│D│
                //└─┴─┴─┘
                bool isA = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isC = false;
                    isG = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isC = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isC = false;
                    isD = false;
                    isF = false;
                    isG = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.K == srcSyurui)
            {
                #region 王
                //************************************************************
                // 王
                //************************************************************

                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│H│A│B│
                //├─┼─┼─┤
                //│G│至│C│先手から見た図
                //├─┼─┼─┤
                //│F│E│D│
                //└─┴─┴─┘
                bool isA = true;
                bool isB = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;
                bool isH = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1));
                }
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1));
                }

                // 王は1つです。
                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.PR == srcSyurui)
            {
                #region 竜
                //************************************************************
                // 竜
                //************************************************************

                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │  │  │  │  │  │  │  │  │A7│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │A3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │H│A0│B│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │F│E0│D│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │E4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E7│  │  │  │  │  │  │  │  │
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isA = true;
                bool isB = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isB = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isB = false;
                    isC = false;
                    isG = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1));
                }
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.PB == srcSyurui)
            {
                #region 馬
                //************************************************************
                // 馬
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │H7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │B7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │H6│  │  │  │  │  │  │  │  │  │  │  │  │  │B6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │H5│  │  │  │  │  │  │  │  │  │  │  │B5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │H4│  │  │  │  │  │  │  │  │  │B4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │H3│  │  │  │  │  │  │  │B3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │H2│  │  │  │  │  │B2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │H1│  │  │  │B1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │H0│A│B0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │G│至│C│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │F0│E│D0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │F1│  │  │  │D1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │F2│  │  │  │  │  │D2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │F3│  │  │  │  │  │  │  │D3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │F4│  │  │  │  │  │  │  │  │  │D4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │F5│  │  │  │  │  │  │  │  │  │  │  │D5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │F6│  │  │  │  │  │  │  │  │  │  │  │  │  │D6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │F7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │D7│
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isA = true;
                bool isB = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isB = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isB = false;
                    isC = false;
                    isG = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1));
                }
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else
            {
                #region エラー
                //************************************************************
                // エラー
                //************************************************************

                #endregion
            }

gt_EndShogiban:

            if (Fingers.Error_1 == foundKoma && utsu)
            {
                // 駒台の駒を(明示的に)打ちます。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


                Fingers komas = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(
                    siteiNode.Value.KyokumenConst, srcOkiba1, pside, srcSyurui);//(2015-08-05 01:04)変更
                //Fingers komas = Util_Sky051Fingers.Fingers_ByOkibaPsideSyuruiNow_OldSpec(
                //    siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui);

                if (0 < komas.Count)
                {
                    switch (pside)
                    {
                    case Playerside.P2:
                        srcOkiba1 = Okiba.Gote_Komadai;
                        break;

                    case Playerside.P1:
                        srcOkiba1 = Okiba.Sente_Komadai;
                        break;

                    default:
                        srcOkiba1 = Okiba.Empty;
                        break;
                    }

                    foundKoma = komas[0];
                    goto gt_EndSyurui;
                }
            }

gt_EndSyurui:


            int srcMasuHandle1;

            if (Fingers.Error_1 != foundKoma)
            {
                // 将棋盤の上に駒がありました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

                srcMasuHandle1 = Conv_SyElement.ToMasuNumber(koma.Masu);
            }
            else
            {
                // (符号に書かれていませんが)「打」のとき。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                switch (pside)
                {
                case Playerside.P2:
                    srcOkiba1 = Okiba.Gote_Komadai;
                    break;

                case Playerside.P1:
                    srcOkiba1 = Okiba.Sente_Komadai;
                    break;

                default:
                    srcOkiba1 = Okiba.Empty;
                    break;
                }


                Debug.Assert(0 < siteiNode.Value.KyokumenConst.Count, "星の光が 1個未満。");

                // 駒台から、該当する駒を探します。
                Fingers daiKomaFgs = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(
                    siteiNode.Value.KyokumenConst, srcOkiba1, pside, srcSyurui);//(2015-08-05 01:04)変更
                //Fingers daiKomaFgs = Util_Sky051Fingers.Fingers_ByOkibaPsideSyuruiNow_OldSpec(
                //    siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui);//(2014-10-04 12:46)変更


                Debug.Assert(0 < daiKomaFgs.Count, $"フィンガーズが 1個未満。 srcOkiba1=[{srcOkiba1}] pside=[{pside}] srcSyurui=[{srcSyurui}]");

                // 1個はヒットするはず
                Finger hitKoma = daiKomaFgs[0];//▲![コマ送り]ボタンを連打すると、エラーになります。



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

                srcMasuHandle1 = Conv_SyElement.ToMasuNumber(koma.Masu);
            }


            PieceType dstSyurui;
            if (NariNarazu.Nari == nariNarazu)
            {
                // 成ります
                dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)srcSyurui];
            }
            else
            {
                // そのままです。
                dstSyurui = srcSyurui;
            }


            // 1手を、データにします。
            move = new RO_Starbeam(
                //foundKoma,//TODO:

                new RO_Star(
                    pside,
                    Conv_MasuHandle.ToMasu(srcMasuHandle1),
                    srcSyurui
                    ),

                new RO_Star(
                    pside,
                    dstMasu,//符号は将棋盤の升目です。
                    dstSyurui
                    ),

                PieceType.None // 符号からは、取った駒の種類は分からないんだぜ☆ だがバグではない☆ あとで調べる☆
                );
        }
Beispiel #30
0
        /// <summary>
        /// 駒を取る動き。
        /// </summary>
        private static void Do61_KomaToru(
            IMoveHalf dst,
            SkyConst susunda_Sky_orNull_before,//駒を取られたとき、局面を変更します。
            out Finger out_figFoodKoma,
            out RO_Star out_food_koma,
            out Playerside pside,
            out SyElement akiMasu
            )
        {
            RO_Star dstKoma = Util_Starlightable.AsKoma(dst.Now);

            //----------
            // 将棋盤上のその場所に駒はあるか
            //----------
            out_figFoodKoma = Util_Sky_FingersQuery.InMasuNow(susunda_Sky_orNull_before, dstKoma.Masu).ToFirst();//盤上


            if (Fingers.Error_1 != out_figFoodKoma)
            {
                //>>>>> 指した先に駒があったなら

                //
                // 取られる駒
                //
                out_food_koma = Util_Starlightable.AsKoma(susunda_Sky_orNull_before.StarlightIndexOf(out_figFoodKoma).Now);
#if DEBUG
                Logger.Trace($"駒取った={out_food_koma.Komasyurui}{Environment.NewLine}");
#endif
                //
                // 取られる駒は、駒置き場の空きマスに移動させます。
                //
                Okiba okiba;
                switch (dstKoma.Pside)
                {
                case Playerside.P1:
                {
                    okiba = Okiba.Sente_Komadai;
                    pside = Playerside.P1;
                }
                break;

                case Playerside.P2:
                {
                    okiba = Okiba.Gote_Komadai;
                    pside = Playerside.P2;
                }
                break;

                default:
                {
                    //>>>>> エラー: 先後がおかしいです。
                    throw new Exception($@"エラー: 先後がおかしいです。
dst.Pside={dstKoma.Pside}");
                }
                }

                //
                // 駒台に駒を置く動き
                //
                {
                    // 駒台の空きスペース
                    akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(okiba, susunda_Sky_orNull_before);


                    if (Masu_Honshogi.IsErrorBasho(akiMasu))
                    {
                        //>>>>> エラー: 駒台に空きスペースがありませんでした。
                        throw new Exception($@"エラー: 駒台に空きスペースがありませんでした。
駒台={Okiba.Gote_Komadai}");
                    }
                    //>>>>> 駒台に空きスペースがありました。
                }
            }
            else
            {
                out_food_koma = null;
                pside         = Playerside.Empty;
                akiMasu       = Masu_Honshogi.Query_Basho(Masu_Honshogi.nError);
            }
        }