示例#1
0
 public void AddRange_New(Maps_OneAndOne <T1, T2> oo)
 {
     oo.Foreach_Entry((T1 key, T2 value, ref bool toBreak) =>
     {
         this.AddNew(key, value);
     });
 }
示例#2
0
        public static string Kamd_ToTerm(Maps_OneAndOne <Finger, SySet <SyElement> > kamd)
        {
            StringBuilder sb = new StringBuilder();

            kamd.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                sb.AppendLine($"entry.Key={key}");
                sb.AppendLine(ShogibanTermDisplay.Masus_ToTerm(value));
                sb.AppendLine("  ");//空行
            });

            return(sb.ToString());
        }
示例#3
0
        public static string LogString_Set(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus
            )
        {
            StringBuilder sb = new StringBuilder();

            // 全要素
            komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                sb.AppendLine($"駒=[{key}]");
                sb.AppendLine(Util_Masus <New_Basho> .LogString_Concrete(value));
            });

            return(sb.ToString());
        }
示例#4
0
        public static string Dump(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus
            )
        {
            StringBuilder sb = new StringBuilder();

            komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                foreach (New_Basho masu in value.Elements)
                {
                    sb.AppendLine($"finger=[{key.ToString()}] masu=[{value.ToString()}]");
                }
            });

            return(sb.ToString());
        }
示例#5
0
        /// <summary>
        /// FIXME: 使ってない?
        ///
        /// 変換「自駒が動ける升」→「自駒が動ける手」
        /// </summary>
        /// <param name="kmDic_Self"></param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, IMove> ToKomabetuMove(
            Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self,
            Node <IMove, KyokumenWrapper> siteiNode_genzai
            )
        {
            Maps_OneAndMulti <Finger, IMove> komaTe = new Maps_OneAndMulti <Finger, IMove>();

            //
            //
            kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                foreach (SyElement masuHandle in value.Elements)
                {
                    RO_Star koma = Util_Starlightable.AsKoma(siteiNode_genzai.Value.KyokumenConst.StarlightIndexOf(key).Now);


                    IMove move = new RO_Starbeam(
                        //key,
                        // 元
                        koma,
                        // 先
                        new RO_Star(
                            koma.Pside,
                            Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(masuHandle)],
                            koma.Haiyaku    //TODO:成るとか考えたい
                            ),

                        PieceType.None    //取った駒不明
                        );
                    //sbSfen.Append(sbSfen.ToString());

                    if (komaTe.ContainsKey(key))
                    {
                        // すでに登録されている駒
                        komaTe.AddExists(key, move);
                    }
                    else
                    {
                        // まだ登録されていない駒
                        komaTe.AddNew(key, move);
                    }
                }
            });

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

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

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

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

                sb.AppendLine("            [");

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

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


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

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

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

gt_EndMethod:
            return(sb.ToString());
        }
示例#7
0
        public static Dictionary <string, SasuEntry> ToMoveBetuSky1(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus,
            SkyConst src_Sky
            )
        {
            Dictionary <string, SasuEntry> result_komabetuEntry = new Dictionary <string, SasuEntry>();

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


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

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

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

            return(result_komabetuEntry);
        }
示例#8
0
        public static string LogString_Concrete(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus
            )
        {
            StringBuilder sb = new StringBuilder();

            komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                sb.Append("[駒");
                sb.Append(key);
                sb.Append("]");

                foreach (New_Basho masu in value.Elements)
                {
                    sb.Append(Util_Masus <New_Basho> .LogString_Concrete(value));
                    //sb.Append(Masu81Array.Items[hMasu].ToString());
                }
            });


            return(sb.ToString());
        }
示例#9
0
        /// <summary>
        /// マージします。
        /// </summary>
        /// <param name="right"></param>
        public static void Merge(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus,
            Maps_OneAndOne <Finger, SySet <SyElement> > right
            )
        {
            right.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                Util_Sky258A.AddOverwrite(komabetuMasus, key, value);
                //if (komabetuMasus.entries.ContainsKey(entry.Key))
                //{
                //    // キーが重複していれば、value同士でマージします。

                //    komabetuMasus.entries[entry.Key].AddSupersets(entry.Value);

                //}
                //else
                //{
                //    // 新キーなら
                //    komabetuMasus.entries.Add(entry.Key, entry.Value);
                //}
            });
        }
示例#10
0
        public void Log4(
            SkyConst src_Sky,
            Playerside tebanSeme,//手番(利きを調べる側)
            Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA
            )
        {
            // 戦駒の移動可能場所
            KaisetuBoard boardLog_clone = new KaisetuBoard(this.BrdMove);

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

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

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

            this.BrdMove = boardLog_clone;
        }
示例#11
0
        /// <summary>
        /// 打ち歩詰め処理。
        ///
        /// TODO:打ち歩詰めチェック
        /// </summary>
        public static void Utifudume(
            SkyConst src_Sky,
            SySet <SyElement> masus_mikata_onBanjo, //打ち歩詰めチェック用
            SySet <SyElement> masus_aite_onBanjo,   //打ち歩詰めチェック用
            SySet <SyElement>[] aMasus              //駒種類別、置こうとする升
            )
        {
            // 攻め側
            Playerside pside_seme = src_Sky.KaisiPside;

            // 相手の王の位置
            RO_Star    king_aite;
            Finger     figKing_aite;
            Playerside pside_aite;

            switch (src_Sky.KaisiPside)
            {
            case Playerside.P1:
                pside_aite   = Playerside.P2;
                figKing_aite = Finger_Honshogi.GoteOh;
                king_aite    = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKing_aite).Now);
                break;

            case Playerside.P2:
                pside_aite   = Playerside.P1;
                figKing_aite = Finger_Honshogi.SenteOh;
                king_aite    = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKing_aite).Now);
                break;

            default: throw new Exception("エラー:打ち歩詰めチェック中。プレイヤー不明。");
            }

            // 相手の玉頭の升。
            SyElement masu_gyokutou = null;
            {
                SySet <SyElement> sySet = KomanoKidou.DstIppo_上(pside_aite, king_aite.Masu);
                foreach (SyElement element2 in sySet.Elements)//最初の1件を取る。
                {
                    masu_gyokutou = element2;
                    break;
                }

                if (null == masu_gyokutou)
                {
                    goto gt_EndUtifudume;
                }
            }

            // 相手の玉。
            Fingers fingers_aiteKing = new Fingers();

            fingers_aiteKing.Add(figKing_aite);

            // 相手の玉頭に、自分側の利きがあるかどうか。
            bool isKiki_mikata = false;

            {
                // 利き一覧
                Maps_OneAndOne <Finger, SySet <SyElement> > kikiMap = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo(
                    fingers_aiteKing,
                    masus_mikata_onBanjo,
                    masus_aite_onBanjo,
                    src_Sky
                    );

                int gyokutouMasuNumber = Conv_SyElement.ToMasuNumber(masu_gyokutou);
                kikiMap.Foreach_Values((SySet <SyElement> values, ref bool toBreak) =>
                {
                    foreach (SyElement element in values.Elements)
                    {
                        int masuNumber = Conv_SyElement.ToMasuNumber(element);
                        if (masuNumber == gyokutouMasuNumber)
                        {
                            isKiki_mikata = true;
                            toBreak       = true;
                            break;
                        }
                    }
                });
            }

            if (!isKiki_mikata)
            {
                goto gt_EndUtifudume;
            }

            // 相手の玉頭に、利きのある相手側の駒の種類の一覧。
            List <PieceType>  ksList = new List <PieceType>();
            SySet <SyElement> aitegyokuKiki;

            {
                // 相手側の盤上の駒一覧。
                Fingers fingers_aiteKoma_Banjo = Util_Sky_FingersQuery.InOkibaPsideNow(src_Sky, Okiba.ShogiBan, pside_aite);

                // 利き一覧
                Maps_OneAndOne <Finger, SySet <SyElement> > kikiMap = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo(
                    fingers_aiteKoma_Banjo,
                    masus_aite_onBanjo,   //相手の駒は、味方
                    masus_mikata_onBanjo, //味方の駒は、障害物。
                    src_Sky
                    );
                aitegyokuKiki = kikiMap.ElementAt(figKing_aite);

                int gyokutouMasuNumber = Conv_SyElement.ToMasuNumber(masu_gyokutou);
                kikiMap.Foreach_Entry((Finger figKoma, SySet <SyElement> values, ref bool toBreak) =>
                {
                    foreach (SyElement element in values.Elements)
                    {
                        int masuNumber = Conv_SyElement.ToMasuNumber(element);
                        if (masuNumber == gyokutouMasuNumber)
                        {
                            ksList.Add(Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now).Komasyurui);
                            break;
                        }
                    }
                });
            }

            // 「王様でしか取れない状態」ではなければ、スルー。
            if (ksList.Count != 1)
            {
                goto gt_EndUtifudume;
            }
            else if (ksList[0] != PieceType.K)
            {
                goto gt_EndUtifudume;
            }

            // 「王様に逃げ道がある」なら、スルー。
            MasubetuKikisu        masubetuKikisu_semeKoma = Util_SkyPside.ToMasubetuKikisu(src_Sky, pside_seme);
            Dictionary <int, int> nigerarenaiMap          = new Dictionary <int, int>();

            switch (src_Sky.KaisiPside)
            {
            case Playerside.P1: nigerarenaiMap = masubetuKikisu_semeKoma.Kikisu_AtMasu_2P; break;

            case Playerside.P2: nigerarenaiMap = masubetuKikisu_semeKoma.Kikisu_AtMasu_1P; break;

            default: throw new Exception("エラー:打ち歩詰めチェック中。プレイヤー不明。");
            }
            foreach (SyElement element in aitegyokuKiki.Elements)
            {
                // 攻撃側の利きが利いていない、空きマスがあるかどうか。
                int movableMasuNumber_king = Conv_SyElement.ToMasuNumber(element);

                if (nigerarenaiMap[movableMasuNumber_king] == 0)
                {
                    // 逃げ切った☆!
                    goto gt_EndUtifudume;
                }
            }

            //----------------------------------------
            // 打ち歩詰め確定
            //----------------------------------------

            // 1升(玉頭升)を、クリアーします。

            aMasus[(int)PieceType.P].Minus_Closed(
                masu_gyokutou, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);


gt_EndUtifudume:
            ;
        }
示例#12
0
        /// <summary>
        /// 指定された局面で、指定された手番の駒の、利きマスを算出します。
        /// 持ち駒は盤上にないので、利きを調べる必要はありません。
        ///
        /// 「手目」は判定できません。
        ///
        /// </summary>
        /// <param name="kouho"></param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logger"></param>
        public static List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect(
            int yomikaisiTemezumi,
            bool isHonshogi,
            SkyConst src_Sky,
            Playerside pside_genTeban3,
            bool isAiteban,
#if DEBUG
            KaisetuBoards logF_kiki,
#endif
            string logBrd_caption,
            int temezumi_yomiCur_forLog,
            IMove move_forLog
            )
        {
#if DEBUG
            KaisetuBoard logBrd_kiki = new KaisetuBoard();
            logBrd_kiki.Caption           = logBrd_caption;// "利き_"
            logBrd_kiki.Temezumi          = temezumi_yomiCur_forLog;
            logBrd_kiki.YomikaisiTemezumi = yomikaisiTemezumi;
            //logBrd_kiki.Score = 0.0d;
            logBrd_kiki.GenTeban = pside_genTeban3;// 現手番
            logF_kiki.boards.Add(logBrd_kiki);
#endif

            // 《1》
            List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き
            {
                // 《1.1》
                Playerside tebanSeme;  //手番(利きを調べる側)
                Playerside tebanKurau; //手番(喰らう側)
                {
                    if (isAiteban)
                    {
                        tebanSeme  = Conv_Playerside.Reverse(pside_genTeban3);
                        tebanKurau = pside_genTeban3;
                    }
                    else
                    {
                        tebanSeme  = pside_genTeban3;
                        tebanKurau = Conv_Playerside.Reverse(pside_genTeban3);
                    }

#if DEBUG
                    if (Playerside.P1 == tebanSeme)
                    {
                        logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente;
                    }
                    else if (Playerside.P2 == tebanSeme)
                    {
                        logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote;
                    }
#endif
                }


                // 《1.2》
                Fingers fingers_seme_BANJO;  //盤上駒(利きを調べる側)
                Fingers fingers_kurau_BANJO; //盤上駒(喰らう側)
                Fingers dust1;
                Fingers dust2;

                Util_Sky_FingersQueryFx.Split_BanjoSeme_BanjoKurau_MotiSeme_MotiKurau(
                    out fingers_seme_BANJO,
                    out fingers_kurau_BANJO,
                    out dust1,
                    out dust2,
                    src_Sky,
                    tebanSeme,
                    tebanKurau
                    );


                // 攻め手の駒の位置
#if DEBUG
                KaisetuBoard boardLog_clone = new KaisetuBoard(logBrd_kiki);
                foreach (Finger finger in fingers_seme_BANJO.Items)
                {
                    RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                    Gkl_KomaMasu km = new Gkl_KomaMasu(
                        Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""),
                        Conv_SyElement.ToMasuNumber(koma.Masu)
                        );
                    boardLog_clone.KomaMasu1.Add(km);
                }
                foreach (Finger finger in fingers_kurau_BANJO.Items)
                {
                    RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                    logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu(
                                                  Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanKurau, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""),
                                                  Conv_SyElement.ToMasuNumber(koma.Masu)
                                                  ));
                }
                logBrd_kiki = boardLog_clone;
#endif



                // 《1.3》
                SySet <SyElement> masus_seme_BANJO  = Conv_Fingers.ToMasus(fingers_seme_BANJO, src_Sky);  // 盤上のマス(利きを調べる側の駒)
                SySet <SyElement> masus_kurau_BANJO = Conv_Fingers.ToMasus(fingers_kurau_BANJO, src_Sky); // 盤上のマス(喰らう側の駒)

                // 駒のマスの位置は、特にログに取らない。

                // 《1.4》
                Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_BANJO = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo(
                    fingers_seme_BANJO,//この中身がおかしい。
                    masus_seme_BANJO,
                    masus_kurau_BANJO,
                    src_Sky
                    //Conv_Move.Move_To_KsString_ForLog(move_forLog, pside_genTeban3),
                    );// 利きを調べる側の利き(戦駒)

                // 盤上駒の利き
#if DEBUG
                logBrd_kiki = new KaisetuBoard(logBrd_kiki);
                kmEffect_seme_BANJO.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
                {
                    RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now);


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

                    foreach (New_Basho masu in value.Elements)
                    {
                        boardLog_clone.Masu_theEffect.Add(masu.MasuNumber);
                    }
                });
                logBrd_kiki = boardLog_clone;
#endif


                // 《1》 = 《1.4》の盤上駒+持駒
                sMs_effect.AddRange_New(kmEffect_seme_BANJO);
            }

            return(sMs_effect);
        }