コード例 #1
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);
        }
コード例 #2
0
        public static SyElement OkibaSujiDanToMasu(Okiba okiba, int masuHandle)
        {
            switch (Conv_SyElement.ToOkiba(masuHandle))
            {
            case Okiba.Sente_Komadai:
                masuHandle -= Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(Okiba.Sente_Komadai));
                break;

            case Okiba.Gote_Komadai:
                masuHandle -= Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(Okiba.Gote_Komadai));
                break;

            case Okiba.KomaBukuro:
                masuHandle -= Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(Okiba.KomaBukuro));
                break;

            case Okiba.ShogiBan:
                // そのんまま
                break;

            default:
                // エラー
                break;
            }

            masuHandle = masuHandle + Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba));

            return(Conv_MasuHandle.ToMasu(masuHandle));
        }
コード例 #3
0
        /// <summary>
        /// 1P玉と、2P玉を取得します。
        /// </summary>
        /// <param name="koma_1PGyoku_orNull"></param>
        /// <param name="koma_2PGyoku_orNull"></param>
        /// <param name="src_Sky"></param>
        public static void Split_1PGyoku_2PGyoku(
            out RO_Star koma_1PGyoku_orNull,
            out RO_Star koma_2PGyoku_orNull,
            SkyConst src_Sky
            )
        {
            RO_Star koma_1PGyoku_temp = null;
            RO_Star koma_2PGyoku_temp = null;

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf ds, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(ds.Now);

                if (
                    Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu) &&
                    PieceType.K == koma.Komasyurui
                    )
                {
                    if (Playerside.P1 == koma.Pside)
                    {
                        koma_1PGyoku_temp = koma;// 1P玉の位置
                    }
                    else if (Playerside.P2 == koma.Pside)
                    {
                        koma_2PGyoku_temp = koma;// 2P玉の位置
                    }
                }
            });
            koma_1PGyoku_orNull = koma_1PGyoku_temp;
            koma_2PGyoku_orNull = koma_2PGyoku_temp;
        }
コード例 #4
0
        /// <summary>
        /// 持駒を取得。
        /// </summary>
        /// <param name="fingers_banjoSeme"></param>
        /// <param name="fingers_banjoKurau"></param>
        /// <param name="fingers_motiSeme"></param>
        /// <param name="fingers_motiKurau"></param>
        /// <param name="src_Sky"></param>
        /// <param name="tebanSeme"></param>
        /// <param name="tebanKurau"></param>
        public static void Split_Moti1p_Moti2p(
            out Fingers fingers_moti1p, // 持駒 1P
            out Fingers fingers_moti2p, // 持駒 2=
            SkyConst src_Sky
            )
        {
            Fingers fingers_moti1p_temp = new Fingers(); // (3)持ち駒_攻め手
            Fingers fingers_moti2p_temp = new Fingers(); // (4)持ち駒_食らう側

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf dd, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(dd.Now);

                if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai)
                {
                    //
                    // 1P 駒台
                    //
                    fingers_moti1p_temp.Add(finger);
                }
                else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai)
                {
                    //
                    // 2P 駒台
                    //
                    fingers_moti2p_temp.Add(finger);
                }
            });
            fingers_moti1p = fingers_moti1p_temp;
            fingers_moti2p = fingers_moti2p_temp;
        }
コード例 #5
0
        /// <summary>
        /// 動かす駒を移動先へ。
        /// </summary>
        /// <param name="figMovedKoma"></param>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="obsoluted_kifu_mutable"></param>
        /// <param name="isMakimodosi"></param>
        private static void Do24_UgokasuKoma_IdoSakiHe(
            out Finger figMovedKoma,
            IMove move,
            Playerside kaisi_tebanside,
            SkyConst kaisi_Sky,
            string hint
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            figMovedKoma = Fingers.Error_1;

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

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

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

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

                figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow(
                    kaisi_Sky,
                    dstKoma.Pside,
                    Util_Masu10.OkibaSujiDanToMasu(
                        Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(dstKoma.Masu)]),
                        Conv_SyElement.ToMasuNumber(srcKoma.Masu)
                        )
                    );
                Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?13");
            }
        }
コード例 #6
0
        /// <summary>
        /// 駒台の上にあれば真。
        /// </summary>
        /// <returns></returns>
        public static bool OnKomadai(RO_Starlight ms)
        {
            bool result;

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

            result = (Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(
                Conv_SyElement.ToOkiba(koma.Masu));

            return(result);
        }
コード例 #7
0
        /// <summary>
        /// “打” <アクション時>
        /// </summary>
        /// <returns></returns>
        public static bool IsDaAction(IMove move)
        {
            Debug.Assert(null != move, "指し手がヌルでした。");
            bool result;

            RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo);

            result = Okiba.ShogiBan != Conv_SyElement.ToOkiba(srcKoma.Masu) &&//駒台(駒袋)から打ったとき。
                     Okiba.Empty != Conv_SyElement.ToOkiba(srcKoma.Masu);//初期配置から移動しても、打にはしません。

            return(result);
        }
コード例 #8
0
        /// <summary>
        /// 後手からも、先手のような座標で指示できるように変換します。
        /// </summary>
        /// <param name="masu"></param>
        /// <param name="pside"></param>
        /// <returns></returns>
        public static SyElement BothSenteView(SyElement masu, Playerside pside)
        {
            SyElement result = masu;

            // 将棋盤上で後手なら、180°回転します。
            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu) && pside == Playerside.P2)
            {
                result = Masu_Honshogi.Masus_All[80 - Conv_SyElement.ToMasuNumber(masu)];
            }

            // 将棋盤で先手、または 駒台か 駒袋なら、指定されたマスにそのまま入れます。

            return(result);
        }
コード例 #9
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);
        }
コード例 #10
0
        /// <summary>
        /// 升コレクション。
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="pside"></param>
        /// <returns></returns>
        public static SySet <SyElement> Masus_Now(SkyConst src_Sky, Playerside pside)
        {
            SySet_Default <SyElement> masus = new SySet_Default <SyElement>("今の升");

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf mlLight, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(mlLight.Now);


                if (koma.Pside == pside && Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan)
                {
                    masus.AddElement(koma.Masu);
                }
            });

            return(masus);
        }
コード例 #11
0
        /// <summary>
        /// **********************************************************************************************************************
        /// 駒のハンドルを返します。
        /// **********************************************************************************************************************
        /// </summary>
        /// <param name="okiba"></param>
        /// <param name="kifuD"></param>
        /// <returns></returns>
        public static Fingers InOkibaPsideNow(SkyConst src_Sky, Okiba okiba, Playerside pside)
        {
            Fingers fingers = new Fingers();

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf dd, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(dd.Now);

                if (Conv_SyElement.ToOkiba(koma.Masu) == okiba &&
                    pside == koma.Pside
                    )
                {
                    fingers.Add(finger);
                }
            });

            return(fingers);
        }
コード例 #12
0
        /// <summary>
        /// [巻戻し]時の、駒台にもどる動きを吸収。
        /// </summary>
        /// <param name="syurui2"></param>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="kifu"></param>
        /// <param name="isMakimodosi"></param>
        /// <returns></returns>
        private static IMoveHalf Do37_KomaOnDestinationMasu(
            PieceType syurui2,
            IMove move,
            SkyConst src_Sky
            )
        {
            IMoveHalf dst;

            RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); //移動元
            RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now);         //移動先


            SyElement masu;

            if (
                Okiba.Gote_Komadai == Conv_SyElement.ToOkiba(srcKoma.Masu) ||
                Okiba.Sente_Komadai == Conv_SyElement.ToOkiba(srcKoma.Masu)
                )
            {
                //>>>>> 1手前が駒台なら

                // 駒台の空いている場所
                masu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Conv_SyElement.ToOkiba(srcKoma.Masu), src_Sky);
                // 必ず空いている場所があるものとします。
            }
            else
            {
                //>>>>> 1手前が将棋盤上なら

                // その位置
                masu = srcKoma.Masu;//戻し先
            }



            dst = new RO_Starlight(
                //move.Finger,
                new RO_Star(dstKoma.Pside,
                            masu,//戻し先
                            syurui2)
                );

            return(dst);
        }
コード例 #13
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 局面上のオブジェクトを返します。置き場、先後サイド、駒の種類で絞りこみます。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="src_Sky">局面データ。</param>
        /// <param name="okiba">置き場。</param>
        /// <param name="pside">先後サイド。</param>
        /// <param name="komaSyurui">駒の種類。</param>
        /// <returns></returns>
        public static Fingers InOkibaPsideKomasyuruiNow(SkyConst src_Sky, Okiba okiba, Playerside pside, PieceType komaSyurui)
        {
            Fingers fingers = new Fingers();

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(light.Now);

                if (
                    okiba == Conv_SyElement.ToOkiba(koma.Masu) &&
                    pside == koma.Pside &&
                    komaSyurui == koma.Komasyurui
                    )
                {
                    fingers.Add(finger);
                }
            });

            return(fingers);
        }
コード例 #14
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);
        }
コード例 #15
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);
        }
コード例 #16
0
        public static void Split_Jigyoku_Aitegyoku(
            out RO_Star koma_Jigyoku_orNull,
            out RO_Star koma_Aitegyoku_orNull,
            SkyConst src_Sky,
            Playerside jiPside,
            Playerside aitePside
            )
        {
            RO_Star koma_Jigyoku_temp   = null;
            RO_Star koma_Aitegyoku_temp = null;

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf ds, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(ds.Now);

                if (
                    Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu) &&
                    jiPside == koma.Pside &&
                    PieceType.K == koma.Komasyurui
                    )
                {
                    //
                    // 自玉の位置
                    //
                    koma_Jigyoku_temp = koma;
                }
                else if (
                    Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu) &&
                    aitePside == koma.Pside &&
                    PieceType.K == koma.Komasyurui
                    )
                {
                    //
                    // 相手玉の位置
                    //
                    koma_Aitegyoku_temp = koma;
                }
            });
            koma_Jigyoku_orNull   = koma_Jigyoku_temp;
            koma_Aitegyoku_orNull = koma_Aitegyoku_temp;
        }
コード例 #17
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);
        }
コード例 #18
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 駒台の空いている升を返します。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="okiba">先手駒台、または後手駒台</param>
        /// <param name="uc_Main">メインパネル</param>
        /// <returns>置ける場所。無ければヌル。</returns>
        public static SyElement GetKomadaiKomabukuroSpace(Okiba okiba, SkyConst src_Sky)
        {
            SyElement akiMasu = Masu_Honshogi.Query_Basho(Masu_Honshogi.nError);

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


            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf komaP, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(komaP.Now);

                if (Conv_SyElement.ToOkiba(koma.Masu) == okiba)
                {
                    exists[
                        Conv_SyElement.ToMasuNumber(koma.Masu) - Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba))
                    ] = true;
                }
            });


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

gt_EndMethod:

            //Logger.Trace($"ゲット駒台駒袋スペース={akiMasu}");

            return(akiMasu);
        }
コード例 #19
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);
        }
コード例 #20
0
        /// <summary>
        /// デバッグ用文字列を作ります。
        /// </summary>
        /// <param name="masus"></param>
        /// <param name="memo"></param>
        /// <returns></returns>
        public static string Log_Masus(SySet <SyElement> masus, string memo)
        {
            StringBuilder sb = new StringBuilder();

            int errorCount = 0;

            // フォルスクリア
            bool[] ban81 = new bool[81];

            // フラグ立て
            foreach (New_Basho basho in masus.Elements)
            {
                if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[basho.MasuNumber]))
                {
                    ban81[basho.MasuNumber] = true;
                }
            }



            sb.AppendLine("...(^▽^)さて、局面は☆?");

            if (null != memo && "" != memo.Trim())
            {
                sb.AppendLine(memo);
            }

            sb.AppendLine(" 9 8 7 6 5 4 3 2 1");
            sb.AppendLine("┏━┯━┯━┯━┯━┯━┯━┯━┯━┓");
            for (int dan = 1; dan <= 9; dan++)
            {
                sb.Append("┃");
                for (int suji = 9; suji >= 1; suji--)// 筋は左右逆☆
                {
                    SyElement masu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan);
                    if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu))
                    {
                        if (ban81[Conv_SyElement.ToMasuNumber(masu)])
                        {
                            sb.Append("●");
                        }
                        else
                        {
                            sb.Append("  ");
                        }
                    }
                    else
                    {
                        errorCount++;
                        sb.Append("  ");
                    }


                    if (suji == 1)//1筋が最後だぜ☆
                    {
                        sb.Append("┃");
                        sb.AppendLine(Conv_Int.ToKanSuji(dan));
                    }
                    else
                    {
                        sb.Append("│");
                    }
                }

                if (dan == 9)
                {
                    sb.AppendLine("┗━┷━┷━┷━┷━┷━┷━┷━┷━┛");
                }
                else
                {
                    sb.AppendLine("┠─┼─┼─┼─┼─┼─┼─┼─┼─┨");
                }
            }


            // 後手駒台
            sb.Append("エラー数:");
            sb.AppendLine(errorCount.ToString());
            sb.AppendLine("...(^▽^)ドウダッタカナ~☆");


            return(sb.ToString());
        }
コード例 #21
0
        /// <summary>
        /// 4分割します。
        /// </summary>
        /// <param name="fs_banjoSeme">fingers</param>
        /// <param name="fs_banjoKurau"></param>
        /// <param name="fs_motiSeme"></param>
        /// <param name="fs_motiKurau"></param>
        /// <param name="src_Sky"></param>
        /// <param name="tebanSeme"></param>
        /// <param name="tebanKurau"></param>
        public static void Split_BanjoSeme_BanjoKurau_MotiSeme_MotiKurau(
            out Fingers fs_banjoSeme,  //戦駒(利きを調べる側)
            out Fingers fs_banjoKurau, //戦駒(喰らう側)
            out Fingers fs_motiSeme,   // 持駒(利きを調べる側)
            out Fingers fs_motiKurau,  // 持駒(喰らう側)
            SkyConst src_Sky,
            Playerside tebanSeme,
            Playerside tebanKurau
            )
        {
            Fingers fs_banjoSeme_temp  = new Fingers(); // (1)盤上駒_攻め手
            Fingers fs_banjoKurau_temp = new Fingers(); // (2)盤上駒_食らう側
            Fingers fs_motiSeme_temp   = new Fingers(); // (3)持ち駒_攻め手
            Fingers fs_motiKurau_temp  = new Fingers(); // (4)持ち駒_食らう側

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                RO_Star star = Util_Starlightable.AsKoma(light.Now);//駒

                if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.ShogiBan)
                {
                    //
                    // 盤上
                    //
                    if (tebanSeme == star.Pside)
                    {
                        fs_banjoSeme_temp.Add(finger);// (1)盤上駒_攻め手
                    }
                    else if (tebanKurau == star.Pside)
                    {
                        fs_banjoKurau_temp.Add(finger);// (2)盤上駒_食らう側
                    }
                }
                else if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.Sente_Komadai)
                {
                    //
                    // P1駒台
                    //
                    if (tebanSeme == Playerside.P1)
                    {
                        // 攻手がP1のとき、P1駒台は。
                        fs_motiSeme_temp.Add(finger);// (3)持ち駒_攻め手
                    }
                    else if (tebanSeme == Playerside.P2)
                    {
                        // 攻手がP2のとき、P1駒台は。
                        fs_motiKurau_temp.Add(finger);// (4)持ち駒_食らう側
                    }
                    else
                    {
                        throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。");
                    }
                }
                else if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.Gote_Komadai)
                {
                    //
                    // P2駒台
                    //
                    if (tebanSeme == Playerside.P1)
                    {
                        // 攻手がP1のとき、P2駒台は。
                        fs_motiKurau_temp.Add(finger);// (3)持ち駒_攻め手
                    }
                    else if (tebanSeme == Playerside.P2)
                    {
                        // 攻手がP2のとき、P2駒台は。
                        fs_motiSeme_temp.Add(finger);// (4)持ち駒_食らう側
                    }
                    else
                    {
                        throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。");
                    }
                }
                else
                {
                    throw new Exception("駒台の持ち駒を調べようとしましたが、盤上でも、駒台でもない指定でした。");
                }
            });
            fs_banjoSeme  = fs_banjoSeme_temp;  // (1)盤上駒_攻め手
            fs_banjoKurau = fs_banjoKurau_temp; // (2)盤上駒_食らう側
            fs_motiSeme   = fs_motiSeme_temp;   // (3)持ち駒_攻め手
            fs_motiKurau  = fs_motiKurau_temp;  // (4)持ち駒_食らう側
        }
コード例 #22
0
        /// <summary>
        /// 「グラフィカル局面ログ」出力用だぜ☆
        /// </summary>
        public static string Json_1Sky(
            SkyConst src_Sky,
            string memo,
            string hint,
            int temezumi_yomiGenTeban_forLog//読み進めている現在の手目済

            //[CallerMemberName] string memberName = "",
            //[CallerFilePath] string sourceFilePath = "",
            //[CallerLineNumber] int sourceLineNumber = 0
            )
        {
            //...(^▽^)さて、局面は☆?
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("[");

            // コメント
            string comment;

            {
                StringBuilder cmt = new StringBuilder();

                // メモ
                cmt.Append(memo);

                comment = cmt.ToString();
            }

            sb.AppendLine($"    {{ act:\"drawText\", text:\"{comment}\", x: 20, y:20 }},");//FIXME: \記号が入ってなければいいが☆

            int hKoma       = 0;
            int hMasu_sente = 81;
            int hMasu_gote  = 121;

            // 全駒
            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(light.Now);

                if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai)
                {
                    // 後手持ち駒
                    sb.AppendLine($"    {{ act:\"drawImg\", img:\"{Util_Converter_LogGraphicEx.PsideKs14_ToString(koma.Pside, koma.Komasyurui, "")}\", masu: {hMasu_gote} }},");//FIXME: \記号が入ってなければいいが☆
                    hMasu_gote++;
                }
                else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai)
                {
                    // 先手持ち駒
                    sb.AppendLine($"    {{ act:\"drawImg\", img:\"{Util_Converter_LogGraphicEx.PsideKs14_ToString(koma.Pside, koma.Komasyurui, "")}\", masu: {hMasu_sente} }},");//FIXME: \記号が入ってなければいいが☆
                    hMasu_sente++;
                }
                else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan)
                {
                    // 盤上
                    sb.AppendLine($"    {{ act:\"drawImg\", img:\"{Util_Converter_LogGraphicEx.PsideKs14_ToString(koma.Pside, koma.Komasyurui, "")}\", masu: {Conv_SyElement.ToMasuNumber(koma.Masu)} }},");//FIXME: \記号が入ってなければいいが☆
                }

                hKoma++;
            });

            sb.AppendLine("],");

            // ...(^▽^)ドウダッタカナ~☆
            return(sb.ToString());
        }
コード例 #23
0
        ///// <summary>
        ///// ************************************************************************************************************************
        ///// 先後の交代
        ///// ************************************************************************************************************************
        ///// </summary>
        ///// <param name="pside">先後</param>
        ///// <returns>ひっくりかえった先後</returns>
        //public static Playerside AlternatePside(Playerside pside)
        //{
        //    Playerside result;

        //    switch (pside)
        //    {
        //        case Playerside.P1:
        //            result = Playerside.P2;
        //            break;

        //        case Playerside.P2:
        //            result = Playerside.P1;
        //            break;

        //        default:
        //            result = pside;
        //            break;
        //    }

        //    return result;
        //}



        ///// <summary>
        ///// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』
        ///// </summary>
        //public static List<Couple<Finger,Masu>> MovebetuSky_ToKamList(
        //    SkyConst src_Sky_genzai,
        //    Dictionary<ShootingStarlightable, SkyBuffer> ss
        //    )
        //{
        //    List<Couple<Finger, Masu>> kmList = new List<Couple<Finger, Masu>>();

        //    // TODO:
        //    foreach(KeyValuePair<ShootingStarlightable,SkyBuffer> entry in ss)
        //    {
        //        RO_Star_Koma srcKoma = Util_Starlightable.AsKoma(entry.Key.LongTimeAgo);
        //        RO_Star_Koma dstKoma = Util_Starlightable.AsKoma(entry.Key.Now);


        //            Masu srcMasu = srcKoma.Masu;
        //            Masu dstMasu = dstKoma.Masu;

        //            Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai,srcMasu).ToFirst();

        //            kmList.Add(new Couple<Finger, Masu>(figKoma, dstMasu));
        //    }

        //    return kmList;
        //}



        /// <summary>
        /// 「成り」ができる動きなら真。
        /// </summary>
        /// <returns></returns>
        public static bool IsPromotionable(
            out bool isPromotionable,
            RO_Star srcKoma,
            RO_Star dstKoma
            )
        {
            bool successful = true;

            isPromotionable = false;

            if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(srcKoma.Masu))
            {
                successful = false;
                goto gt_EndMethod;
            }

            if (Util_Komasyurui14.IsNari(srcKoma.Komasyurui))
            {
                // 既に成っている駒は、「成り」の指し手を追加すると重複エラーになります。
                // 成りになれない、で正常終了します。
                goto gt_EndMethod;
            }

            int srcDan;

            if (!Util_MasuNum.TryMasuToDan(srcKoma.Masu, out srcDan))
            {
                throw new Exception("段に変換失敗");
            }

            int dstDan;

            if (!Util_MasuNum.TryMasuToDan(dstKoma.Masu, out dstDan))
            {
                throw new Exception("段に変換失敗");
            }

            // 先手か、後手かで大きく処理を分けます。
            switch (dstKoma.Pside)
            {
            case Playerside.P1:
            {
                if (srcDan <= 3)
                {
                    // 3段目から上にあった駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }

                if (dstDan <= 3)
                {
                    // 3段目から上に駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }
            }
            break;

            case Playerside.P2:
            {
                if (7 <= srcDan)
                {
                    // 7段目から下にあった駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }

                if (7 <= dstDan)
                {
                    // 7段目から下に駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }
            }
            break;

            default: throw new Exception("未定義のプレイヤーサイドです。");
            }
gt_EndMethod:
            ;
            return(successful);
        }
コード例 #24
0
        /// <summary>
        /// 駒の利きを調べます。
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <returns></returns>
        public static MasubetuKikisuImpl ToMasubetuKikisu(
            SkyConst src_Sky,
            Playerside tebanside
            )
        {
            // ①現手番の駒の移動可能場所_被王手含む
            List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus;

            Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus(
                3,
                //node_forLog,
                out komaBETUSusumeruMasus, //進めるマス
                true,                      //本将棋か
                src_Sky,                   //現在の局面
                tebanside,                 //手番
                false                      //相手番か
#if DEBUG
                ,
                null
#endif
                );

            MasubetuKikisuImpl result = new MasubetuKikisuImpl();

            //
            // 「升ごとの敵味方」を調べます。
            //
            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                result.HMasu_PlayersideList[Conv_SyElement.ToMasuNumber(koma.Masu)] = koma.Pside;
            }

            //
            // 駒のない升は無視します。
            //

            //
            // 駒のあるマスに、その駒の味方のコマが効いていれば 味方+1
            //
            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒
            {
                //
                // 駒
                //
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                // 将棋盤上の戦駒のみ判定
                if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(koma.Masu))
                {
                    goto gt_Next1;
                }


                //
                // 駒の利きカウント FIXME:貫通してないか?
                //
                komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma2, SySet <SyElement> kikiZukei, ref bool toBreak) =>
                {
                    IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements;
                    foreach (SyElement masu in kikiMasuList)
                    {
                        // その枡に利いている駒のハンドルを追加
                        if (result.HMasu_PlayersideList[Conv_SyElement.ToMasuNumber(masu)] == Playerside.Empty)
                        {
                            // 駒のないマスは無視。
                        }
                        else if (Playerside.P1 == koma.Pside)
                        {
                            // 利きのあるマスにある駒と、この駒のプレイヤーサイドが同じ。
                            result.Kikisu_AtMasu_1P[Conv_SyElement.ToMasuNumber(masu)] += 1;
                        }
                        else
                        {
                            // 反対の場合。
                            result.Kikisu_AtMasu_2P[Conv_SyElement.ToMasuNumber(masu)] += 1;
                        }
                    }
                });

gt_Next1:
                ;
            }

            return(result);
        }
コード例 #25
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");
            }
        }