示例#1
0
        /// <summary>
        /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// </summary>
        /// <param name="srcSky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > GetPotentialMoves(
            SkyConst srcSky,
            Fingers fingers
            )
        {
            if (fingers is null)
            {
                throw new ArgumentNullException(nameof(fingers));
            }

            Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (Finger finger in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> move = Util_Sky_SyugoQuery.KomaKidou_Potential(finger, srcSky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。

                if (!move.IsEmptySet())
                {
                    // 移動可能升があるなら
                    Util_Sky258A.AddOverwrite(kiki_fMs, finger, move);
                }
            }

            return(kiki_fMs);
        }
示例#2
0
        /// <summary>
        /// 攻め手の持駒利き
        /// </summary>
        /// <param name="fingers_seme_MOTI"></param>
        /// <param name="masus_kurau_IKUSA"></param>
        /// <param name="src_Sky"></param>
        /// <param name="hint"></param>
        /// <returns></returns>
        public static List_OneAndMulti <Finger, SySet <SyElement> > Get_Move_Moti(
            Fingers fingers_seme_MOTI,
            SySet <SyElement> masus_seme_IKUSA,
            SySet <SyElement> masus_kurau_IKUSA,
            SkyConst src_Sky,
            string hint_orNull
            )
        {
            // 「どの持ち駒を」「どこに置けるか」のコレクション。
            List_OneAndMulti <Finger, SySet <SyElement> > om;


            // 持ち駒を置けない升
            SySet <SyElement> okenaiMasus = new SySet_Default <SyElement>("持ち駒を置けない升");

            {
                // 自分の駒がある升
                okenaiMasus.AddSupersets(masus_seme_IKUSA);

                // 相手番の駒がある升
                okenaiMasus.AddSupersets(masus_kurau_IKUSA);
            }

            om = Play.Get_PotentialMove_Motikoma(src_Sky, fingers_seme_MOTI, okenaiMasus);
            return(om);
        }
示例#3
0
        /// <summary>
        /// a - b = c
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="sbGohosyu"></param>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > MinusMasus(
            SkyConst src_Sky_forLog,
            Maps_OneAndOne <Finger, SySet <SyElement> > a1,
            SySet <SyElement> b
            )
        {
            //GraphicalLogUtil.Log(enableLog, "Thought_KomaAndMove#MinusMasus",
            //    "["+
            //    GraphicalLogUtil.JsonKyokumens_MultiKomabetuMasus(enableLog, siteiSky_forLog, a1, "a1") +
            //    "]"
            //    );


            Maps_OneAndOne <Finger, SySet <SyElement> > c = new Maps_OneAndOne <Finger, SySet <SyElement> >(a1);

            List <Finger> list_koma = c.ToKeyList();//調べたい側の全駒


            foreach (Finger selfKoma in list_koma)
            {
                SySet <SyElement> srcMasus = c.ElementAt(selfKoma);

                SySet <SyElement> minusedMasus = srcMasus.Minus_Closed(b, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);

                // 差替え
                c.AddReplace(selfKoma, minusedMasus, false);//差分に差替えます。もともと無い駒なら何もしません。
            }

            return(c);
        }
示例#4
0
 public void AddSupersets(SySet <T1> superset)
 {
     foreach (T1 element in superset.Elements)
     {
         this.AddElement(element);
     }
 }
示例#5
0
        /// <summary>
        /// this -=overThere b
        ///
        /// この集合から、指定の要素を全て削除した結果を返します。
        ///
        /// この集合自身は変更しません。
        ///
        /// 順序はないが、Minus無印と同じではない☆
        /// 最初の1個(原点)は削除してはいけない☆
        /// </summary>
        /// <param name="targetMasus"></param>
        /// <returns></returns>
        public void MinusMe_Opened(SySet <T1> b, DLGT_SyElement_BynaryOperate dlgt_equals)
        {
            // このセットの中にある、スーパーセット1つ1つにも、Minus_OverThere をします。
            foreach (SySet <T1> superset2 in this.Supersets)
            {
                superset2.MinusMe_Opened(b, dlgt_equals);
            }

            if (b is SySet_Ordered <T1> )
            {
                // 方向をもつ集合で 引こうとした場合だけ有効です。

                // 要素の削除
                {
                    int index = 0;
                    foreach (T1 element in b.Elements)
                    {
                        if (index == 0)
                        {
                            // 最初の要素は、削除しません。
                            goto gt_Next;
                        }

                        this.Minus_Closed(element, dlgt_equals);

gt_Next:
                        index++;
                    }
                }
            }
            // 方向を持っていない集合では、Minus_OverThere は無効とします。
        }
示例#6
0
        /// <summary>
        /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        ///
        /// TODO: 打ち歩詰めチェック
        ///
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static List_OneAndMulti <Finger, SySet <SyElement> > Get_PotentialMove_Motikoma(
            SkyConst src_Sky,
            Fingers fingers,
            SySet <SyElement> okenaiMasus
            )
        {
            // 「どの持ち駒を」「どこに置いたとき」「どこに利きがある」のコレクション。
            List_OneAndMulti <Finger, SySet <SyElement> > resultOmm = new List_OneAndMulti <Finger, SySet <SyElement> >();

            foreach (Finger donoKoma in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。

                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(donoKoma).Now);


                PieceType syurui = Haiyaku184Array.Syurui(koma.Haiyaku);

                // 置ける升
                SySet <SyElement> okeruMasus = Util_Sky.KomaKidou_Potential(donoKoma, src_Sky);

                // 置けない升を引きます。
                okeruMasus = okeruMasus.Minus_Closed(okenaiMasus);

                if (syurui == PieceType.P)
                {
                    // 二歩チェック

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

                    Fingers sujiKomas = Util_Sky.Fingers_InSuji(src_Sky, suji);

                    Starlight fu      = src_Sky.StarlightIndexOf(donoKoma);
                    Fingers   existFu = Util_Sky.Matches(fu, src_Sky, sujiKomas);

                    if (0 < existFu.Count)
                    {
                        // 二歩だ☆!
                        goto gt_Next;
                    }

                    // TODO:打ち歩詰めチェック
                }


                if (!okeruMasus.IsEmptySet())
                {
                    // 空でないなら
                    resultOmm.AddNew(donoKoma, okeruMasus);
                }

gt_Next:
                ;
            }

            return(resultOmm);
        }
示例#7
0
 public static void SplitGroup_Ikusa(
     out SySet <SyElement> masus_seme_IKUSA,
     out SySet <SyElement> masus_kurau_IKUSA,
     SkyConst src_Sky,
     Fingers fingers_kurau_IKUSA, //戦駒(喰らう側)
     Fingers fingers_seme_IKUSA   //戦駒(利きを調べる側)
     )
 {
     masus_seme_IKUSA  = Converter04.Fingers_ToMasus(fingers_seme_IKUSA, src_Sky);  // 盤上のマス(利きを調べる側の駒)
     masus_kurau_IKUSA = Converter04.Fingers_ToMasus(fingers_kurau_IKUSA, src_Sky); // 盤上のマス(喰らう側の駒)
 }
示例#8
0
 /// <summary>
 /// 盤上の駒を、攻め側と、食らう側に グループ分けします。
 /// </summary>
 /// <param name="out_masus_seme"></param>
 /// <param name="out_masus_kurau"></param>
 /// <param name="src_Sky"></param>
 /// <param name="fs_kurau">fingers</param>
 /// <param name="fs_seme"></param>
 public static void SplitGroup_Banjo(
     out SySet <SyElement> out_masus_seme,
     out SySet <SyElement> out_masus_kurau,
     SkyConst src_Sky,
     Fingers fs_kurau, //盤上の駒(喰らう側)
     Fingers fs_seme   //盤上の駒(利きを調べる側)
     )
 {
     out_masus_seme  = Conv_Fingers.ToMasus(fs_seme, src_Sky);  // 盤上のマス(利きを調べる側の駒)
     out_masus_kurau = Conv_Fingers.ToMasus(fs_kurau, src_Sky); // 盤上のマス(喰らう側の駒)
 }
示例#9
0
        public static string Dump_Elements(SySet <SyElement> sySet)
        {
            StringBuilder sb = new StringBuilder();

            foreach (SyElement syElement in sySet.Elements)
            {
                sb.Append(Conv_Sy.Query_Word(syElement.Bitfield));
                sb.Append(",");
            }

            return(sb.ToString());
        }
示例#10
0
 /// <summary>
 /// 単語登録
 /// </summary>
 /// <param name="newWord"></param>
 /// <param name="mean"></param>
 public void AddWord(string newWord, SySet <T1> mean)
 {
     if (this.dictionary.ContainsKey(newWord.Trim()))
     {
         // キーが既存なら
         this.dictionary[newWord.Trim()] = mean;
     }
     else
     {
         this.dictionary.Add(newWord.Trim(), mean);
     }
 }
示例#11
0
        /// <summary>
        /// this - b = c
        ///
        /// この集合から、指定の要素を全て削除した結果を返します。
        ///
        /// この集合自身は変更しません。
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public SySet <T1> Minus_Closed(SySet <T1> b, DLGT_SyElement_BynaryOperate dlgt_equals)
        {
            // クローンを作成します。
            SySet <T1> c = this.Clone();

            // 要素の削除
            foreach (T1 bElement in b.Elements)
            {
                c.Minus_Closed(bElement, dlgt_equals);
            }

            return(c);
        }
示例#12
0
        /// <summary>
        /// this - b = c
        ///
        /// この集合から、指定の要素を全て削除した結果を返します。
        ///
        /// この集合自身は変更しません。
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public SySet <T1> Minus_Closed(SySet <T1> b)
        {
            // クローンを作成します。
            SySet <T1> c = this.Clone();

            // 要素の削除
            foreach (T1 bElement in b.Elements)
            {
                c.Minus_Closed(bElement);
            }

            return(c);
        }
示例#13
0
        /// <summary>
        /// this -= b
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public void MinusMe_Opened(SySet <T1> b, DLGT_SyElement_BynaryOperate dlgt_equals)
        {
            // このセットの中にある、スーパーセット1つ1つにも、Minus_OverThere をします。
            foreach (SySet <T1> superset2 in this.Supersets)
            {
                superset2.MinusMe_Opened(b, dlgt_equals);
            }

            foreach (T1 bElement in b.Elements)
            {
                // bを含まない、それより後ろの要素を丸ごと削除します。
                this.Minus_Opened(bElement, dlgt_equals);
            }
        }
示例#14
0
        /// <summary>
        /// this -= b
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public void MinusMe_Opened(SySet <T1> b)
        {
            // このセットの中にある、スーパーセット1つ1つにも、Minus_OverThere をします。
            foreach (SySet <T1> superset2 in this.Supersets)
            {
                superset2.MinusMe_Opened(b);
            }

            foreach (T1 bElement in b.Elements)
            {
                // bを含まない、それより後ろの要素を丸ごと削除します。
                this.Minus_Opened(bElement);
            }
        }
示例#15
0
        /// <summary>
        /// this - b = c
        ///
        /// この集合のメンバーから、指定の集合のメンバーを削除します。
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public SySet <T1> Minus_Closed(SySet <T1> b, DLGT_SyElement_BynaryOperate dlgt_equals)
        {
            // クローンを作成します。
            SySet <T1> c = this.Clone();

            // 指定の要素が含まれているかどうか1つ1つ調べます。
            foreach (T1 bElement in b.Elements)
            {
                // 要素を1つ1つ削除していきます。
                c.Minus_Closed(bElement, dlgt_equals);
            }

            return(c);
        }
示例#16
0
 /// <summary>
 /// 無ければ追加、あれば上書き。
 /// </summary>
 /// <param name="hKoma"></param>
 /// <param name="masus"></param>
 public static void AddOverwrite(
     Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus,
     Finger finger, SySet <SyElement> masus)
 {
     if (komabetuMasus.Items.ContainsKey(finger))
     {
         komabetuMasus.Items[finger].AddSupersets(masus);//追加します。
     }
     else
     {
         // 無かったので、新しく追加します。
         komabetuMasus.Items.Add(finger, masus);
     }
 }
示例#17
0
        /// <summary>
        /// this - b = c
        ///
        /// この集合のメンバーから、指定の集合のメンバーを削除します。
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public SySet <T1> Minus_Closed(SySet <T1> b)
        {
            // クローンを作成します。
            SySet <T1> c = this.Clone();

            // 指定の要素が含まれているかどうか1つ1つ調べます。
            foreach (T1 bElement in b.Elements)
            {
                // 要素を1つ1つ削除していきます。
                c.Minus_Closed(bElement);
            }

            return(c);
        }
示例#18
0
        /// <summary>
        /// ************************************************************************************************************************
        /// この集合は、指定した要素を全てもっているか。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="handle"></param>
        /// <returns></returns>
        public bool ContainsAll(SySet <T1> superset2)
        {
            bool matched = true;

            foreach (T1 element in superset2.Elements)
            {
                if (!this.elements_.Contains(element))
                {
                    matched = false;
                    break;
                }
            }

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

            foreach (SyElement masu in srcList.Elements)
            {
                Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(src_Sky, pside, masu);
                if (Util_Finger.ForHonshogi(finger))
                {
                    // 指定の升に駒がありました。
                    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                    out_fingers.Add(finger);
                }
            }
        }
示例#20
0
        /// <summary>
        /// 盤上の駒の利き(利きを調べる側)
        /// </summary>
        /// <param name="fs_sirabetaiKoma">fingers</param>
        /// <param name="masus_mikata_Banjo"></param>
        /// <param name="masus_aite_Banjo"></param>
        /// <param name="src_Sky"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > To_KomabetuKiki_OnBanjo(
            Fingers fs_sirabetaiKoma,
            SySet <SyElement> masus_mikata_Banjo,
            SySet <SyElement> masus_aite_Banjo,
            SkyConst src_Sky
            )
        {
            // 利きを調べる側の利き(戦駒)
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuKiki = QuerySkyFingers.GetPotentialMoves(src_Sky, fs_sirabetaiKoma);

            // 盤上の現手番の駒利きから、 現手番の駒がある枡を除外します。
            komabetuKiki = Play_KomaAndMove.MinusMasus(src_Sky, komabetuKiki, masus_mikata_Banjo);

            // そこから、相手番の駒がある枡「以降」を更に除外します。
            komabetuKiki = Play_KomaAndMove.Minus_OverThereMasus(src_Sky, komabetuKiki, masus_aite_Banjo);

            return(komabetuKiki);
        }
示例#21
0
        /// <summary>
        /// a - b = c
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="sbGohosyu"></param>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Minus_OverThereMasus(
            SkyConst src_srcSky_forLog,
            Maps_OneAndOne <Finger, SySet <SyElement> > a,
            SySet <SyElement> b
            )
        {
            Maps_OneAndOne <Finger, SySet <SyElement> > c = new Maps_OneAndOne <Finger, SySet <SyElement> >(a);

            bool enableLog = false;

            //if (null != errH_orNull)
            //{
            //    enableLog = errH_orNull.Logger.Enable;
            //}

            foreach (Finger selfKoma in c.ToKeyList())//調べたい側の全駒
            {
                SySet <SyElement> srcMasus = c.ElementAt(selfKoma);

                // a -overThere b するぜ☆
                Util_GraphicalLog.WriteHtml5(enableLog, "Thought_KomaAndMove Minus_OverThereMasus1",
                                             $@"[
[
{Util_FormatJson_LogGraphicEx.JsonElements_Masus(enableLog, srcMasus, "(1)引く前")}    ],
],
"
                                             );
                SySet <SyElement> minusedMasus = srcMasus.Clone();
                minusedMasus.MinusMe_Opened(b, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);

                // 差替え
                c.AddReplace(selfKoma, minusedMasus, false);//差分に差替えます。もともと無い駒なら何もしません。
            }

            Util_GraphicalLog.WriteHtml5(enableLog, "Thought_KomaAndMove Minus_OverThereMasus2",
                                         $@"[
    [
{Util_FormatJson_LogGraphicEx.JsonKyokumens_MultiKomabetuMasus(enableLog, src_srcSky_forLog, a, "(1)a")}{Util_FormatJson_LogGraphicEx.JsonElements_Masus(enableLog, b, "(2)-overThere_b")}{Util_FormatJson_LogGraphicEx.JsonKyokumens_MultiKomabetuMasus(enableLog, src_srcSky_forLog, c, "(3)=c")}    ],
],
"
                                         );

            return(c);
        }
示例#22
0
        /// <summary>
        /// v(^▽^)v超能力『メナス』だぜ☆ 未来の脅威を予測し、可視化するぜ☆www
        /// </summary>
        public static void Menace(MainGui_Csharp mainGui)
        {
            if (0 < mainGui.Model_Manual.GuiTemezumi)
            {
                // 処理の順序が悪く、初回はうまく判定できない。
                SkyConst src_Sky = mainGui.Model_Manual.GuiSkyConst;


                //----------
                // 将棋盤上の駒
                //----------
                mainGui.RepaintRequest.SetFlag_RefreshRequest();

                // [クリアー]
                mainGui.Shape_PnlTaikyoku.Shogiban.ClearHMasu_KikiKomaList();

                // 全駒
                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)
                        &&
                        mainGui.Model_Manual.GuiPside != koma.Pside
                        )
                    {
                        // 駒の利き
                        SySet <SyElement> kikiZukei = Util_Sky_SyugoQuery.KomaKidou_Potential(figKoma, src_Sky);

                        IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements;
                        foreach (SyElement masu in kikiMasuList)
                        {
                            // その枡に利いている駒のハンドルを追加
                            if (!Masu_Honshogi.IsErrorBasho(masu))
                            {
                                mainGui.Shape_PnlTaikyoku.Shogiban.HMasu_KikiKomaList[Conv_SyElement.ToMasuNumber(masu)].Add((int)figKoma);
                            }
                        }
                    }
                }
            }
        }
示例#23
0
        /// <summary>
        /// v(^▽^)v超能力『メナス』だぜ☆ 未来の脅威を予測し、可視化するぜ☆www
        /// </summary>
        public static void Menace(NarabeRoomViewModel shogiGui)
        {
            if (0 < shogiGui.GameViewModel.GuiTesumi)
            {
                // 処理の順序が悪く、初回はうまく判定できない。
                SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst;


                //----------
                // 将棋盤上の駒
                //----------
                shogiGui.ResponseData.ToRedraw();

                // [クリアー]
                shogiGui.Shape_PnlTaikyoku.Shogiban.ClearHMasu_KikiKomaList();

                // 全駒
                foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);


                    if (
                        Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(koma.Masu)
                        &&
                        shogiGui.GameViewModel.GuiPside != koma.Pside
                        )
                    {
                        // 駒の利き
                        SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(figKoma, src_Sky);

                        IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements;
                        foreach (SyElement masu in kikiMasuList)
                        {
                            // その枡に利いている駒のハンドルを追加
                            if (Masu_Honshogi.Error != masu)
                            {
                                shogiGui.Shape_PnlTaikyoku.Shogiban.HMasu_KikiKomaList[Util_Masu.AsMasuNumber(masu)].Add((int)figKoma);
                            }
                        }
                    }
                }
            }
        }
示例#24
0
        /// <summary>
        /// 変換『「駒→手」のコレクション』→『「駒、指し手」のペアのリスト』
        /// </summary>
        public static List <Couple <Finger, SyElement> > KomabetuMasus_ToKamList(
            Maps_OneAndOne <Finger, SySet <SyElement> > km
            )
        {
            List <Couple <Finger, SyElement> > kmList = new List <Couple <Finger, SyElement> >();

            foreach (Finger koma in km.ToKeyList())
            {
                SySet <SyElement> masus = km.ElementAt(koma);

                foreach (SyElement masu in masus.Elements)
                {
                    // セットとして作っているので、重複エレメントは無いはず……☆
                    kmList.Add(new Couple <Finger, SyElement>(koma, masu));
                }
            }

            return(kmList);
        }
示例#25
0
        /// <summary>
        /// 戦駒の利き(利きを調べる側)
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="fingers_seme_IKUSA"></param>
        /// <param name="masus_seme_IKUSA"></param>
        /// <param name="masus_kurau_IKUSA"></param>
        /// <param name="src_Sky"></param>
        /// <param name="hint"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Get_KmEffect_seme_IKUSA(
            Fingers fingers_seme_IKUSA,
            SySet <SyElement> masus_seme_IKUSA,
            SySet <SyElement> masus_kurau_IKUSA,
            SkyConst src_Sky,
            bool enableLog,
            string hint_orNull
            )
        {
            // 利きを調べる側の利き(戦駒)
            Maps_OneAndOne <Finger, SySet <SyElement> > km = Play.Get_PotentialMoves_Ikusa(src_Sky, fingers_seme_IKUSA);

            // 盤上の現手番の駒利きから、 現手番の駒がある枡を除外します。
            km = Play_KomaAndMove.MinusMasus(false, src_Sky, km, masus_seme_IKUSA);

            // そこから、相手番の駒がある枡「以降」を更に除外します。
            km = Play_KomaAndMove.Minus_OverThereMasus(enableLog, src_Sky, km, masus_kurau_IKUSA);

            return(km);
        }
示例#26
0
        /// <summary>
        /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Get_PotentialMoves_Ikusa(
            SkyConst src_Sky,
            Fingers fingers
            )
        {
            Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (Finger finger in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> move = Util_Sky.KomaKidou_Potential(finger, src_Sky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。

                if (!move.IsEmptySet())
                {
                    // 移動可能升があるなら
                    Util_KomabetuMasus.AddOverwrite(kiki_fMs, finger, move);
                }
            }

            return(kiki_fMs);
        }
示例#27
0
        /// <summary>
        /// a - b = c
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="sbGohosyu"></param>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Minus_OverThereMasus(
            bool enableLog,
            SkyConst src_srcSky_forLog,
            Maps_OneAndOne <Finger, SySet <SyElement> > a,
            SySet <SyElement> b
            )
        {
            Maps_OneAndOne <Finger, SySet <SyElement> > c = new Maps_OneAndOne <Finger, SySet <SyElement> >(a);

            foreach (Finger selfKoma in c.ToKeyList())//調べたい側の全駒
            {
                SySet <SyElement> srcMasus = c.ElementAt(selfKoma);

                // a -overThere b するぜ☆
                Util_GraphicalLog.Log(enableLog, "Thought_KomaAndMove Minus_OverThereMasus",
                                      "[\n" +
                                      "    [\n" +
                                      Util_GraphicalLog.JsonElements_Masus(enableLog, srcMasus, "(1)引く前") +
                                      "    ],\n" +
                                      "],\n"
                                      );
                SySet <SyElement> minusedMasus = srcMasus.Clone();
                minusedMasus.MinusMe_Opened(b);

                // 差替え
                c.AddReplace(selfKoma, minusedMasus, false);//差分に差替えます。もともと無い駒なら何もしません。
            }

            Util_GraphicalLog.Log(enableLog, "Thought_KomaAndMove Minus_OverThereMasus",
                                  "[\n" +
                                  "    [\n" +
                                  Util_GraphicalLog.JsonKyokumens_MultiKomabetuMasus(enableLog, src_srcSky_forLog, a, "(1)a") +
                                  Util_GraphicalLog.JsonElements_Masus(enableLog, b, "(2)-overThere_b") +
                                  Util_GraphicalLog.JsonKyokumens_MultiKomabetuMasus(enableLog, src_srcSky_forLog, c, "(3)=c") +
                                  "    ],\n" +
                                  "],\n"
                                  );

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

            bool hit = false;

            foundKoma = Fingers.Error_1;


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


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

            return(hit);
        }
示例#29
0
        public static string JsonElements_Masus(bool enableLog, SySet <SyElement> masus, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

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

            foreach (New_Basho masu in masus.Elements)
            {
                sb.AppendLine($"                {{ act:\"drawMasu\" , masu:{((int)masu.MasuNumber)} }},\n");
            }



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

gt_EndMethod:
            return(sb.ToString());
        }
示例#30
0
        /// <summary>
        /// 含まれるか判定。
        /// </summary>
        /// <param name="masus"></param>
        /// <returns></returns>
        public static bool ExistsIn(IMoveHalf sl, SySet <SyElement> masus, SkyConst srcSky)
        {
            bool matched = false;

            foreach (SyElement masu in masus.Elements)
            {
                RO_Star koma = Util_Starlightable.AsKoma(sl.Now);


                Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(srcSky, koma.Pside, masu);

                if (
                    finger != Fingers.Error_1 && //2014-07-21 先後も見るように追記。
                    koma.Masu == masu
                    )
                {
                    matched = true;
                    break;
                }
            }

            return(matched);
        }