예제 #1
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;
        }
예제 #2
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;
        }
예제 #3
0
        /// <summary>
        /// 駒のハンドルを返します。
        /// </summary>
        /// <param name="pside"></param>
        /// <param name="hKomas"></param>
        /// <returns></returns>
        public static Fingers InPsideNow(SkyConst srcSky, Playerside pside)
        {
            Fingers fingers = new Fingers();

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

                if (pside == koma.Pside)
                {
                    fingers.Add(finger);
                }
            });

            return(fingers);
        }
예제 #4
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);
        }
예제 #5
0
        /// <summary>
        /// ログが多くなるので、1行で出力されるようにします。
        /// </summary>
        /// <returns></returns>
        public static Json_Val ToJsonVal(SkyConst src_Sky)
        {
            Json_Obj obj = new Json_Obj();

            Json_Arr arr = new Json_Arr();

            src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                if (null != light)
                {
                    arr.Add(Conv_Starlight.ToJsonVal(light));
                }
            });

            obj.Add(new Json_Prop("sprite", arr));

            return(obj);
        }
예제 #6
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);
        }
예제 #7
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);
        }
예제 #8
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;
        }
예제 #9
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);
        }
예제 #10
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());
        }
예제 #11
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)持ち駒_食らう側
        }