示例#1
0
        /// <summary>
        /// 将棋盤、駒台に筋があります。
        /// </summary>
        /// <param name="masu"></param>
        /// <returns>該当なければ-1</returns>
        public static bool TryMasuToDan(int masuNumber, out int result)
        {
            bool successful = true;

            Okiba okiba = Conv_SyElement.ToOkiba(masuNumber);

            switch (okiba)
            {
            case Okiba.ShogiBan:
                result = (masuNumber - Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba))) % 9 + 1;
                break;

            case Okiba.Sente_Komadai:
            case Okiba.Gote_Komadai:
                result = (masuNumber - Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba))) % 10 + 1;
                break;

            case Okiba.KomaBukuro:
                result = (masuNumber - Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba))) % 10 + 1;
                break;

            default:
                // エラー
                result     = -1;
                successful = false;
                goto gt_EndMethod;
            }

gt_EndMethod:
            return(successful);
        }
示例#2
0
        /// <summary>
        /// 合法手レベル1
        /// </summary>
        /// <returns></returns>
        public static SySet <SyElement> Create_01Fu(Playerside pside, SyElement masu_ji)
        {
            //----------------------------------------
            // 歩
            //----------------------------------------
            SySet_Default <SyElement> dst = new SySet_Default <SyElement>("歩の移動先");

            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji))
            {
                //----------------------------------------
                // 将棋盤上の歩の移動先
                //----------------------------------------
                dst.AddSupersets(KomanoKidou.DstIppo_上(pside, masu_ji));
            }
            else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(
                         Conv_SyElement.ToOkiba(masu_ji)))
            {
                //----------------------------------------
                // 駒台上の歩の移動先
                //----------------------------------------
                dst.AddSupersets(KomanoKidou.Dst_歩打面(pside));
            }

            return(dst);
        }
示例#3
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 局面に合わせて、駒ボタンのx,y位置を変更します
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="btnKoma">駒</param>
        public static void Redraw_KomaLocation(
            Finger figKoma,
            MainGui_Csharp mainGui
            )
        {
            RO_Star koma = Util_Starlightable.AsKoma(mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(figKoma).Now);

            Shape_BtnKoma btnKoma = Conv_Koma_InGui.FingerToKomaBtn(figKoma, mainGui);

            // マスと駒の隙間(パディング)
            int padX = 2;
            int padY = 2;

            int suji;
            int dan;

            Util_MasuNum.TryMasuToSuji(koma.Masu, out suji);
            Util_MasuNum.TryMasuToDan(koma.Masu, out dan);

            switch (Conv_SyElement.ToOkiba(koma.Masu))
            {
            case Okiba.ShogiBan:
                btnKoma.SetBounds(new Rectangle(
                                      mainGui.Shape_PnlTaikyoku.Shogiban.SujiToX(suji) + padX,
                                      mainGui.Shape_PnlTaikyoku.Shogiban.DanToY(dan) + padY,
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;

            case Okiba.Sente_Komadai:
                btnKoma.SetBounds(new Rectangle(
                                      mainGui.Shape_PnlTaikyoku.KomadaiArr[0].SujiToX(suji) + padX,
                                      mainGui.Shape_PnlTaikyoku.KomadaiArr[0].DanToY(dan) + padY,
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;

            case Okiba.Gote_Komadai:
                btnKoma.SetBounds(new Rectangle(
                                      mainGui.Shape_PnlTaikyoku.KomadaiArr[1].SujiToX(suji) + padX,
                                      mainGui.Shape_PnlTaikyoku.KomadaiArr[1].DanToY(dan) + padY,
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;

            case Okiba.KomaBukuro:
                btnKoma.SetBounds(new Rectangle(
                                      mainGui.Shape_PnlTaikyoku.KomadaiArr[2].SujiToX(suji) + padX,
                                      mainGui.Shape_PnlTaikyoku.KomadaiArr[2].DanToY(dan) + padY,
                                      btnKoma.Bounds.Width,
                                      btnKoma.Bounds.Height
                                      ));
                break;
            }
        }
示例#4
0
        /// <summary>
        /// 局面PNG画像書き出し。
        /// </summary>
        public void WritePng()
        {
            var profilePath = System.Configuration.ConfigurationManager.AppSettings["Profile"];
            var toml        = Toml.ReadFile(Path.Combine(profilePath, "Engine.toml"));

            int srcMasu_orMinusOne = -1;
            int dstMasu_orMinusOne = -1;

            if (null != this.Kifu.CurNode.Key)
            {
                srcMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)this.Kifu.CurNode.Key.LongTimeAgo).Masu);
                dstMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)this.Kifu.CurNode.Key.Now).Masu);
            }

            KyokumenPngArgs_FoodOrDropKoma foodKoma;

            if (null != this.Kifu.CurNode.Key.FoodKomaSyurui)
            {
                switch (Util_Komasyurui14.NarazuCaseHandle((PieceType)this.Kifu.CurNode.Key.FoodKomaSyurui))
                {
                case PieceType.None: foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; break;

                case PieceType.P: foodKoma = KyokumenPngArgs_FoodOrDropKoma.FU__; break;

                case PieceType.L: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KYO_; break;

                case PieceType.N: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KEI_; break;

                case PieceType.S: foodKoma = KyokumenPngArgs_FoodOrDropKoma.GIN_; break;

                case PieceType.G: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KIN_; break;

                case PieceType.R: foodKoma = KyokumenPngArgs_FoodOrDropKoma.HI__; break;

                case PieceType.B: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KAKU; break;

                default: foodKoma = KyokumenPngArgs_FoodOrDropKoma.UNKNOWN; break;
                }
            }
            else
            {
                foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE;
            }

            // 学習フォーム
            Util_KyokumenPng_Writer.Write1(
                Conv_KifuNode.ToRO_Kyokumen1(((KifuNode)this.Kifu.CurNode)),
                srcMasu_orMinusOne,
                dstMasu_orMinusOne,
                foodKoma,
                ConvMoveStrSfen.ToMoveStrSfen(this.Kifu.CurNode.Key),
                "",
                toml.Get <TomlTable>("Resources").Get <string>("LearningPositionLogPngBasename"),
                LearningDataImpl.REPORT_ENVIRONMENT
                );
        }
示例#5
0
        private static void Panic1(RO_Star koma)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("Util_54List#Error1:2駒関係FVの配列添え字がわからないぜ☆!処理は続けられない。");
            sb.AppendLine($"koma1.Pside=[{koma.Pside}]");
            sb.AppendLine($"koma1.Komasyurui=[{koma.Komasyurui}]");
            sb.AppendLine($"koma1.Masu=[{koma.Masu}]");
            sb.AppendLine($"Conv_SyElement.ToOkiba(koma1.Masu)=[{Conv_SyElement.ToOkiba(koma.Masu)}]");
            throw new Exception(sb.ToString());
        }
示例#6
0
        /// <summary>
        /// 2駒関係[PP]用。
        /// フィーチャーベクターの調査項目インデックス。該当なければ-1。
        /// </summary>
        /// <param name="pside">プレイヤーサイド</param>
        /// <param name="komasyurui">盤上の種類</param>
        /// <param name="masu">盤上の駒の升</param>
        /// <returns></returns>
        public static int ToPIndex_FromBanjo_PsideKomasyuruiMasu(Playerside pside, PieceType komasyurui, SyElement masu, out int p_index)
        {
            p_index = 0;//ここに累計していく。

            if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(masu))
            {
                // 盤上でなければ。
                p_index = -1;
                goto gt_EndMethod;
            }

            switch (pside)
            {
            case Playerside.P1: break;

            case Playerside.P2: p_index += FeatureVectorImpl.CHOSA_KOMOKU_2P; break;

            default: break;
            }

            switch (komasyurui)
            {
            case PieceType.PP:     //thru
            case PieceType.P: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____FU_____; break;

            case PieceType.PL:     //thru
            case PieceType.L: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____KYO____; break;

            case PieceType.PN:     //thru
            case PieceType.N: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____KEI____; break;

            case PieceType.PS:     //thru
            case PieceType.S: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____GIN____; break;

            case PieceType.G: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____KIN____; break;

            case PieceType.K: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____OH_____; break;

            case PieceType.PR:     //thru
            case PieceType.R: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____HISYA__; break;

            case PieceType.PB:     //thru
            case PieceType.B: p_index += FeatureVectorImpl.CHOSA_KOMOKU_____KAKU___; break;

            default: p_index = -1; goto gt_EndMethod;
            }

            p_index += Conv_SyElement.ToMasuNumber(masu);

gt_EndMethod:
            ;
            return(p_index);
        }
示例#7
0
        public static SySet <SyElement> CreateKin_static(Playerside pside, SyElement masu_ji)
        {
            SySet_Default <SyElement> dst = new SySet_Default <SyElement>("カナゴマの移動先");

            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji))
            {
                dst.AddSupersets(KomanoKidou.DstIppo_上(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_昇(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_射(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_引(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_滑(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_浮(pside, masu_ji));
            }

            return(dst);
        }
示例#8
0
        /// <summary>
        /// 合法手レベル1
        /// </summary>
        /// <returns></returns>
        public static SySet <SyElement> Create_02Kyo(Playerside pside, SyElement masu_ji)
        {
            SySet_Default <SyElement> dst = new SySet_Default <SyElement>("香の移動先");

            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji))
            {
                dst.AddSupersets(KomanoKidou.DstKantu_上(pside, masu_ji));
            }
            else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(
                         Conv_SyElement.ToOkiba(masu_ji)))
            {
                dst.AddSupersets(KomanoKidou.Dst_歩打面(pside));//香も同じ
            }

            return(dst);
        }
示例#9
0
        /// <summary>
        /// 合法手レベル1
        /// </summary>
        /// <returns></returns>
        public static SySet <SyElement> Create_05Kin(Playerside pside, SyElement masu_ji)
        {
            SySet <SyElement> dst = new SySet_Default <SyElement>("金の移動先");

            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji))
            {
                dst = Array_Rule01_PotentialMove15.CreateKin_static(pside, masu_ji);
            }
            else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(
                         Conv_SyElement.ToOkiba(masu_ji)))
            {
                dst.AddSupersets(KomanoKidou.Dst_全打面(pside));
            }

            return(dst);
        }
示例#10
0
        private static void Log2(
            Tansaku_Genjo genjo,
            KifuNode node_yomi,
            KaisetuBoard logBrd_move1
            )
        {
            logBrd_move1.moveOrNull = node_yomi.Key;


            RO_Star srcKoma = Util_Starlightable.AsKoma(logBrd_move1.moveOrNull.LongTimeAgo);
            RO_Star dstKoma = Util_Starlightable.AsKoma(logBrd_move1.moveOrNull.Now);


            // ログ試し
            logBrd_move1.Arrow.Add(new Gkl_Arrow(Conv_SyElement.ToMasuNumber(srcKoma.Masu), Conv_SyElement.ToMasuNumber(dstKoma.Masu)));
            genjo.Args.LogF_moveKiki.boards.Add(logBrd_move1);
        }
示例#11
0
        /// <summary>
        /// 合法手レベル1
        /// </summary>
        /// <returns></returns>
        public static SySet <SyElement> Create_03Kei(Playerside pside, SyElement masu_ji)
        {
            SySet_Default <SyElement> dst = new SySet_Default <SyElement>("桂の移動先");

            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji))
            {
                dst.AddSupersets(KomanoKidou.DstKeimatobi_駆(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstKeimatobi_跳(pside, masu_ji));
            }
            else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(
                         Conv_SyElement.ToOkiba(masu_ji)))
            {
                dst.AddSupersets(KomanoKidou.Dst_桂打面(pside));
            }

            return(dst);
        }
示例#12
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);
                            }
                        }
                    }
                }
            }
        }
示例#13
0
        public static Json_Val ToJsonVal(IMoveHalf light)
        {
            Json_Obj obj = new Json_Obj();


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


            // プレイヤーサイド
            obj.Add(new Json_Prop("pside", Conv_Playerside.ToSankaku(koma.Pside)));// ▲△

            // マス
            obj.Add(new Json_Prop("masu", Conv_SyElement.ToMasuNumber(koma.Masu)));// ▲△

            // 駒の種類。歩、香、桂…。
            obj.Add(new Json_Prop("syurui", Conv_Komasyurui.ToStr_Ichimoji(Util_Komahaiyaku184.Syurui(koma.Haiyaku))));// ▲△

            return(obj);
        }
示例#14
0
        /// <summary>
        /// 合法手レベル1
        /// </summary>
        /// <returns></returns>
        public static SySet <SyElement> Create_04Gin(Playerside pside, SyElement masu_ji)
        {
            SySet_Default <SyElement> dst = new SySet_Default <SyElement>("銀の移動先");

            if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji))
            {
                dst.AddSupersets(KomanoKidou.DstIppo_上(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_昇(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_沈(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_降(pside, masu_ji));
                dst.AddSupersets(KomanoKidou.DstIppo_浮(pside, masu_ji));
            }
            else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(
                         Conv_SyElement.ToOkiba(masu_ji)))
            {
                dst.AddSupersets(KomanoKidou.Dst_全打面(pside));
            }

            return(dst);
        }
示例#15
0
        /// <summary>
        /// 棋譜ツリーを、平手初期局面 で準備します。
        /// </summary>
        public static void CreateKifuTree(out KifuTree kifu)
        {
            // 初期局面では、Player 1 の手番とします。
            Playerside firstPside = Playerside.P1;

            // 棋譜
            kifu = new KifuTreeImpl(
                new KifuNodeImpl(
                    Util_Sky258A.RootMove,
                    new KyokumenWrapper(SkyConst.NewInstance(
                                            Util_SkyWriter.New_Hirate(firstPside),
                                            0//初期局面なので、0手目済み。
                                            ))
                    )
                );
            kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos");// 平手

            Debug.Assert(!Conv_MasuHandle.OnKomabukuro(
                             Conv_SyElement.ToMasuNumber(((RO_Star)kifu.CurNode.Value.KyokumenConst.StarlightIndexOf((Finger)0).Now).Masu)
                             ), "駒が駒袋にあった。");
        }
示例#16
0
        /// <summary>
        /// 2駒関係[KK]用。
        /// フィーチャーベクターの調査項目インデックス。該当なければ-1。
        /// </summary>
        /// <param name="pside">プレイヤーサイド</param>
        /// <param name="komasyurui">盤上の種類</param>
        /// <param name="masu">盤上の駒の升</param>
        /// <returns></returns>
        public static int ToKIndex_From_PsideBanjoKomasyuruiMasu(SkyConst src_Sky, Playerside pside)
        {
            // 調査項目番号(K1、K2等)
            int result;

            SyElement masu;

            {
                Finger  figK1  = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(src_Sky, Okiba.ShogiBan, pside, PieceType.K).ToFirst();
                RO_Star komaK1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figK1).Now);
                masu = komaK1.Masu;
            }

            if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(masu))
            {
                // 盤上でなければ。
                result = -1;
                goto gt_EndMethod;
            }

            int kSuji;

            Util_MasuNum.TryMasuToSuji(masu, out kSuji);
            int kDan;

            Util_MasuNum.TryMasuToDan(masu, out kDan);


            int p1;

            Conv_FvKoumoku522.Converter_K1_to_P(Playerside.P1, kDan, kSuji, out p1);


            result = p1;

gt_EndMethod:
            ;
            return(result);
        }
示例#17
0
        /// <summary>
        /// Pの将棋盤上の駒の位置の、配列の添え字番号。
        /// </summary>
        /// <param name="p_koma"></param>
        /// <returns></returns>
        public static int ParamIndex_Banjo(RO_Star p_koma)
        {
            int koumokuP;

            // 駒Pのマス番号
            int p_masuHandle = Conv_SyElement.ToMasuNumber(p_koma.Masu);

            int index_playerside = Util_FvParamIndex.paramIndex_Playerside[(int)p_koma.Pside];
            int index_komasyurui = Util_FvParamIndex.paramIndex_KomaSyrui_Banjo[(int)p_koma.Komasyurui];

            if (index_playerside == -1)
            {
                throw new Exception("二駒関係の先後不明の駒");
            }
            else if (index_komasyurui == -1)
            {
                throw new Exception("二駒関係の駒種類が対象外の駒");
            }

            koumokuP = index_playerside + index_komasyurui + p_masuHandle;
            Debug.Assert(0 <= koumokuP && koumokuP < FeatureVectorImpl.CHOSA_KOMOKU_P, $"koumokuP=[{koumokuP}]");
            return(koumokuP);
        }
示例#18
0
        /// <summary>
        /// 距離の近さ
        /// </summary>
        /// <returns></returns>
        public static int GetKyori(SyElement mokuhyo, SyElement genzai)
        {
            int masuNumber = Conv_SyElement.ToMasuNumber(mokuhyo);

            return(Util_KomanoKyori.GetKyori(masuNumber, genzai));
        }
示例#19
0
        /// <summary>
        /// 評価値を返します。先手が有利ならプラス、後手が有利ならマイナス、互角は 0.0 です。
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public override void Evaluate(
            out float out_score,
#if DEBUG || LEARN
            out KyHyokaMeisai_Koumoku out_meisaiKoumoku_orNull,
#endif
            SkyConst srcSky,
            FeatureVector fv
            )
        {
            float score_p1 = 0.0f;
            float score_p2 = 0.0f;//2Pは、負の数なほどグッドということに注意。



            srcSky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                RO_Starlight ms = (RO_Starlight)light;

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

                // 駒の種類による点数
                float komaScore_temp = fv.Komawari[(int)koma.Komasyurui];

                // 持ち駒は、価値を高めます。(ボーナス)序盤に駒をぽんぽん打つのを防ぐため。
                if (
                    (Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(Conv_SyElement.ToOkiba(koma.Masu))
                    )
                {
                    //komaScore_temp *= 1.05f;// 1.05倍だと、相手の桂馬の利きに、桂馬をタダ捨てした。足りてないか。
                    komaScore_temp *= 1.13f;
                    //komaScore_temp *= 1.25f;// 1.25倍だと、金、金、角を打たずに王手されて終わってしまった。ボーナスを付けすぎたか☆
                }


                if (koma.Pside == Playerside.P1)
                {
                    score_p1 += komaScore_temp;
                }
                else
                {
                    // 駒割は、他の評価値と違って、
                    // 1プレイヤーも、2プレイヤーも正の数になっている。
                    // 2プレイヤーは 符号を反転させること。
                    score_p2 += -komaScore_temp;
                }
            });

            //
            // 2プレイヤーは 負の数になっている(負の数が多いほど有利)ので、
            // 足すだけでいい。
            //
            out_score = score_p1 + score_p2;

            //----------------------------------------
            // 明細項目
            //----------------------------------------
#if DEBUG || LEARN
            string utiwake = "";
            // 明細
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("駒割");
                utiwake = sb.ToString();
            }

            // 明細項目
            out_meisaiKoumoku_orNull = new KyHyokaMeisai_KoumokuImpl(utiwake, out_score);
#endif
        }
示例#20
0
        /// <summary>
        /// ************************************************************************************************************************
        /// HTML出力。(これは作者のホームページ用に書かれています)
        /// ************************************************************************************************************************
        /// </summary>
        public static string CreateHtml(MainGui_Csharp mainGui)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("<div style=\"position:relative; left:0px; top:0px; border:solid 1px black; width:250px; height:180px;\">");

            // 後手の持ち駒
            sb.AppendLine("    <div style=\"position:absolute; left:0px; top:2px; width:30px;\">");
            sb.AppendLine("        △後手");
            sb.AppendLine("        <div style=\"margin-top:10px; width:30px;\">");
            sb.Append("            ");

            SkyConst siteiSky = mainGui.Model_Manual.GuiSkyConst;

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


                if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai)
                {
                    sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]);
                }
            });

            sb.AppendLine("        </div>");
            sb.AppendLine("    </div>");

            // 将棋盤
            sb.AppendLine("    <div style=\"position:absolute; left:30px; top:2px; width:182px;\">");
            sb.AppendLine("        <table>");
            for (int dan = 1; dan <= 9; dan++)
            {
                sb.Append("        <tr>");
                for (int suji = 9; 1 <= suji; suji--)
                {
                    bool isSpace = true;

                    siteiSky.Foreach_Starlights((Finger finger, IMoveHalf ml, ref bool toBreak) =>
                    {
                        RO_Star koma2 = Util_Starlightable.AsKoma(ml.Now);


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

                        int dan2;
                        Util_MasuNum.TryMasuToDan(koma2.Masu, out dan2);

                        if (
                            Conv_SyElement.ToOkiba(koma2.Masu) == Okiba.ShogiBan && //盤上
                            suji2 == suji &&
                            dan2 == dan
                            )
                        {
                            if (Playerside.P2 == koma2.Pside)
                            {
                                sb.Append("<td><span class=\"koma2x\">");
                                sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma2.Haiyaku)]);
                                sb.Append("</span></td>");
                                isSpace = false;
                            }
                            else
                            {
                                sb.Append("<td><span class=\"koma1x\">");
                                sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma2.Haiyaku)]);
                                sb.Append("</span></td>");
                                isSpace = false;
                            }
                        }
                    });

                    if (isSpace)
                    {
                        sb.Append("<td> </td>");
                    }
                }

                sb.AppendLine("</tr>");
            }
            sb.AppendLine("        </table>");
            sb.AppendLine("    </div>");

            // 先手の持ち駒
            sb.AppendLine("    <div style=\"position:absolute; left:215px; top:2px; width:30px;\">");
            sb.AppendLine("        ▲先手");
            sb.AppendLine("        <div style=\"margin-top:10px; width:30px;\">");
            sb.Append("            ");

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

                if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai)
                {
                    sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]);
                }
            });

            sb.AppendLine("        </div>");
            sb.AppendLine("    </div>");

            //
            sb.AppendLine("</div>");

            return(sb.ToString());
        }
示例#21
0
        /// <summary>
        /// 評価値を返します。先手が有利ならプラス、後手が有利ならマイナス、互角は 0.0 です。
        /// </summary>
        /// <param name="input_node"></param>
        /// <returns></returns>
        public override void Evaluate(
            out float out_score,
#if DEBUG || LEARN
            out KyHyokaMeisai_Koumoku out_meisaiKoumoku_orNull,
#endif
            SkyConst src_Sky,
            FeatureVector fv
            )
        {
            out_score = 0.0f;            // -999~999(*bairitu) が 40×40個ほど足し合わせた数になるはず。


#if DEBUG
            float[] komabetuMeisai = new float[Finger_Honshogi.Items_KomaOnly.Length];
#endif
            //
            // 盤上にある駒だけ、項目番号を調べます。
            //

            //----------------------------------------
            // 項目番号リスト
            //----------------------------------------
            //
            // 40個の駒と、14種類の持ち駒があるだけなので、
            // 54個サイズの長さがあれば足りるんだぜ☆ 固定長にしておこう☆
            //
            int   nextIndex            = 0;
            int[] komokuArray_unsorted = new int[54];                       //昇順でなくても構わないアルゴリズムにすること。

            for (int i = 0; i < Finger_Honshogi.Items_KomaOnly.Length; i++) // 全駒
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.Items_KomaOnly[i]).Now);

                if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu))
                {
                    // 盤上
                    komokuArray_unsorted[nextIndex] = Util_FvParamIndex.ParamIndex_Banjo(koma);
                    nextIndex++;
                }
                else
                {
                    // 持ち駒は、ここでは無視します。
                }
            }
            // 持ち駒:先後×7種類
            for (int iPside = 0; iPside < Array_Playerside.Items_PlayerOnly.Length; iPside++)
            {
                for (int iKomasyurui = 0; iKomasyurui < Array_Komasyurui.MotiKoma7Syurui.Length; iKomasyurui++)
                {
                    komokuArray_unsorted[nextIndex] = Util_FvParamIndex.ParamIndex_Moti(src_Sky, Array_Playerside.Items_PlayerOnly[iPside], Array_Komasyurui.MotiKoma7Syurui[iKomasyurui]);
                    nextIndex++;
                }
            }
            //Array.Sort(komokuArray_unsorted);

            //
            //
            // 例えば、[1P1三歩、2P2一桂]という組み合わせと、[2P2一桂、1P1三歩]という組み合わせは、同じだが欄が2つある。
            // そこで、表の半分を省きたい。
            // しかし、表を三角形にするためには、要素は昇順にソートされている必要がある。
            // 合法手1つごとにソートしていては、本末転倒。
            // そこで、表は正方形に読み、内容は三角形の部分にだけ入っているということにする。
            //
            //
            // 例えば、[1P1三歩、1P1三歩]という組み合わせもある。これは、自分自身の絶対位置の評価として試しに、残しておいてみる☆
            //
            //
            for (int iA = 0; iA < nextIndex; iA++)
            {
                int p1 = komokuArray_unsorted[iA];

                for (int iB = 0; iB < nextIndex; iB++)
                {
                    int p2 = komokuArray_unsorted[iB];

                    if (p1 <= p2) // 「p2 < p1」という組み合わせは同じ意味なので省く。「p1==p2」は省かない。
                    {
                        //----------------------------------------
                        // よし、組み合わせだぜ☆!
                        //----------------------------------------
                        out_score += fv.NikomaKankeiPp_ForMemory[p1, p2];
                    }
                    else
                    {
                        //----------------------------------------
                        // 使っていない方の三角形だぜ☆!
                        //----------------------------------------

                        // スルー。
                    }
                }
            }

            //----------------------------------------
            // 明細項目
            //----------------------------------------
#if DEBUG || LEARN
            string utiwake = "";
            // 内訳
            {
                StringBuilder sb = new StringBuilder();

                sb.Append(" PP ");
                sb.Append(out_score);
                sb.Append("点");

                utiwake = sb.ToString();
            }
            out_meisaiKoumoku_orNull = new KyHyokaMeisai_KoumokuImpl(utiwake, out_score);
#endif
        }
示例#22
0
        /// <summary>
        /// 54駒のリスト。
        ///
        /// 盤上の40駒リスト。
        /// 駒台の14駒リスト。
        /// </summary>
        public static N54List Calc_54List(SkyConst src_Sky)
        {
            N54List result_n54List = new N54ListImpl();


            //----------------------------------------
            // インナー・メソッド用 集計変数
            //----------------------------------------
            int p54Next = 0;

            int[] p54List = new int[54];

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

                //----------------------------------------
                // まず、p を調べます。
                //----------------------------------------
                if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan)
                {
                    int pIndex = FeatureVectorImpl.CHOSA_KOMOKU_ERROR;// 調査項目P1
                    //----------------------------------------
                    // 盤上の駒
                    //----------------------------------------
                    Conv_FvKoumoku525.ToPIndex_FromBanjo_PsideKomasyuruiMasu(koma.Pside, koma.Komasyurui, koma.Masu, out pIndex);

                    if (FeatureVectorImpl.CHOSA_KOMOKU_ERROR == pIndex)
                    {
                        // p1 がエラーでは、処理は続けられない。
                        Util_54List.Panic1(koma);
                        goto gt_NextLoop_player1;
                    }

                    //----------------------------------------
                    // 盤上の駒だぜ☆!
                    //----------------------------------------
                    p54List[p54Next] = pIndex;
                    p54Next++;
                }
                else if (
                    Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai ||
                    Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai)
                {
                    int pIndex = FeatureVectorImpl.CHOSA_KOMOKU_ERROR;// 調査項目P1
                    //----------------------------------------
                    // 持ち駒
                    //----------------------------------------
                    PieceType motiKomasyurui = koma.ToNarazuCase();//例:駒台に馬はない。角の数を数える。
                    // 駒の枚数
                    int maisu = Util_Sky_FingersQuery.InOkibaKomasyuruiNow(src_Sky, Conv_Playerside.ToKomadai(koma.Pside), motiKomasyurui).Items.Count;
                    Conv_FvKoumoku525.ToPIndex_FromMoti_PsideKomasyuruiMaisu(koma.Pside, motiKomasyurui, maisu, out pIndex);

                    if (FeatureVectorImpl.CHOSA_KOMOKU_ERROR == pIndex)
                    {
                        // p1 がエラーでは、処理は続けられない。
                        Util_54List.Panic1(koma);
                        goto gt_NextLoop_player1;
                    }

                    //----------------------------------------
                    // 駒台の駒だぜ☆!
                    //----------------------------------------
                    p54List[p54Next] = pIndex;
                    p54Next++;
                }

                gt_NextLoop_player1:
                ;
            });


            result_n54List.SetP54List_Unsorted(p54List);
            result_n54List.SetP54Next(p54Next);

            return(result_n54List);
        }
示例#23
0
        /// <summary>
        /// C#のプログラムは、
        /// この Main 関数から始まり、 Main 関数を抜けて終わります。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var engineConf = new EngineConf();

            EntitiesLayer.Implement(engineConf);

            // 将棋エンジン きふわらべ
            var playing = new Playing();

            //-------------------+----------------------------------------------------------------------------------------------------
            // ログファイル削除  |
            //-------------------+----------------------------------------------------------------------------------------------------
            {
                //
                // 図.
                //
                //      フォルダー
                //          ├─ Engine.KifuWarabe.exe
                //          └─ log.txt               ←これを削除
                //
                Logger.RemoveAllLogFiles();
            }

            //------------------------------------------------------------------------------------------------------------------------
            // 思考エンジンの、記憶を読み取ります。
            //------------------------------------------------------------------------------------------------------------------------
            Util_FvLoad.OpenFv(engineConf, playing.FeatureVector, engineConf.GetResourceFullPath("Fv00Komawari"));

            //------------------------------------------------------------------------------------------------------------------------
            // ファイル読込み
            //------------------------------------------------------------------------------------------------------------------------
            {
                // データの読取「道」
                if (Michi187Array.Load(engineConf.GetResourceFullPath("Michi187")))
                {
                }

                // データの読取「配役」
                Util_Array_KomahaiyakuEx184.Load(engineConf.GetResourceFullPath("Haiyaku185"), Encoding.UTF8);

                // データの読取「強制転成表」 ※駒配役を生成した後で。
                Array_ForcePromotion.Load(engineConf.GetResourceFullPath("InputForcePromotion"), Encoding.UTF8);

#if DEBUG
                {
                    File.WriteAllText(engineConf.GetResourceFullPath("OutputForcePromotion"), Array_ForcePromotion.LogHtml());
                }
#endif

                // データの読取「配役転換表」
                Data_KomahaiyakuTransition.Load(engineConf.GetResourceFullPath("InputSyuruiToHaiyaku"), Encoding.UTF8);

#if DEBUG
                {
                    File.WriteAllText(engineConf.GetResourceFullPath("OutputSyuruiToHaiyaku"), Data_KomahaiyakuTransition.Format_LogHtml());
                }
#endif
            }

            //-------------+----------------------------------------------------------------------------------------------------------
            // ログ書込み  |  <この将棋エンジン>  製品名、バージョン番号
            //-------------+----------------------------------------------------------------------------------------------------------
            //
            // 図.
            //
            //      log.txt
            //      ┌────────────────────────────────────────
            //      │2014/08/02 1:04:59> v(^▽^)v イェーイ☆ ... fugafuga 1.00.0
            //      │
            //      │
            //
            //
            // 製品名とバージョン番号は、次のファイルに書かれているものを使っています。
            // 場所:  [ソリューション エクスプローラー]-[ソリューション名]-[プロジェクト名]-[Properties]-[AssemblyInfo.cs] の中の、[AssemblyProduct]と[AssemblyVersion] を参照。
            //
            // バージョン番号を「1.00.0」形式(メジャー番号.マイナー番号.ビルド番号)で書くのは作者の趣味です。
            //
            {
                string versionStr;

                // バージョン番号
                Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                versionStr = String.Format("{0}.{1}.{2}", version.Major, version.Minor.ToString("00"), version.Build);

                //seihinName += $" {versionStr}";
#if DEBUG
                var engineName = engineConf.GetEngine("Name");
                Logger.Trace($"v(^▽^)v イェーイ☆ ... {engineName} {versionStr}");
#endif
            }

            bool isTimeoutShutdown = false;

            try
            {
                //
                // 図.
                //
                //     プログラムの開始:  ここの先頭行から始まります。
                //     プログラムの実行:  この中で、ずっと無限ループし続けています。
                //     プログラムの終了:  この中の最終行を終えたとき、
                //                         または途中で Environment.Exit(0); が呼ばれたときに終わります。
                //                         また、コンソールウィンドウの[×]ボタンを押して強制終了されたときも  ぶつ切り  で突然終わります。


                // ループ(全体)
                //
                // 図.
                //
                //      無限ループ(全体)
                //          │
                //          ├─無限ループ(1)
                //          │                      将棋エンジンであることが認知されるまで、目で訴え続けます(^▽^)
                //          │                      認知されると、無限ループ(2)に進みます。
                //          │
                //          └─無限ループ(2)
                //                                  対局中、ずっとです。
                //                                  対局が終わると、無限ループ(1)に戻ります。
                //
                // 無限ループの中に、2つの無限ループが入っています。
                //

                while (true)
                {
#if DEBUG_STOPPABLE
                    MessageBox.Show("きふわらべのMainの無限ループでブレイク☆!", "デバッグ");
                    System.Diagnostics.Debugger.Break();
#endif
                    isTimeoutShutdown = false;

                    //
                    // サーバーに noop を送ってもよいかどうかは setoption コマンドがくるまで分からないので、
                    // 作ってしまっておきます。
                    // 1回も役に立たずに Loop2 に行くようなら、正常です。
#if NOOPABLE
                    NoopTimerImpl noopTimer = new NoopTimerImpl();
                    noopTimer._01_BeforeLoop();
#endif

                    // USIループ(1つ目)
                    while (true)
                    {
                        // 将棋サーバーから何かメッセージが届いていないか、見てみます。
                        string line = Util_Message.Download_Nonstop();

                        // (2020-12-13 sun) ノン・ブロッキングなら このコードが意味あったんだが☆(^~^)
                        if (null == line)//次の行が無ければヌル。
                        {
                            // メッセージは届いていませんでした。
                            //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#if NOOPABLE
                            bool isTimeoutShutdown_temp;
                            noopTimer._03_AtEmptyMessage(this.Owner, out isTimeoutShutdown_temp);
                            if (isTimeoutShutdown_temp)
                            {
                                //MessageBox.Show("ループ1でタイムアウトだぜ☆!");
                                out_isTimeoutShutdown = isTimeoutShutdown_temp;
                                result_UsiLoop1       = PhaseResult_UsiLoop1.TimeoutShutdown;
                                goto end_loop1;
                            }
#endif

                            goto gt_NextTime1;
                        }

                        // 通信ログは必ず取ります。
                        Logger.WriteLineC(line);

#if NOOPABLE
                        noopTimer._04_AtResponsed(this.Owner, line);
#endif



                        if ("usi" == line)
                        {
                            var     engineName   = engineConf.GetEngine("Name");
                            Version version      = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                            var     engineAuthor = engineConf.GetEngine("Author");
                            playing.UsiOk($"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor);
                        }
                        else if (line.StartsWith("setoption"))
                        {
                            Match m = regexOfSetoption.Match(line);

                            if (m.Success)
                            {
                                string name  = (string)m.Groups[1].Value;
                                string value = "";

                                if (3 <= m.Groups.Count)
                                {
                                    // 「value ★」も省略されずにありました。
                                    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                                    value = (string)m.Groups[2].Value;
                                }

                                playing.SetOption(name, value);
                            }
                        }
                        else if ("isready" == line)
                        {
                            playing.ReadyOk();
                        }
                        else if ("usinewgame" == line)
                        {
                            playing.UsiNewGame();

                            // 無限ループ(1つ目)を抜けます。無限ループ(2つ目)に進みます。
                            goto end_loop1;
                        }
                        else if ("quit" == line)
                        {
                            playing.Quit();

                            // このプログラムを終了します。
                            goto gt_EndMethod;//全体ループを抜けます。
                        }
                        else
                        {
                            //------------------------------------------------------------
                            // ○△□×!?
                            //------------------------------------------------------------
                            //
                            // /(^×^)\
                            //

                            // 通信が届いていますが、このプログラムでは  聞かなかったことにします。
                            // USIプロトコルの独習を進め、対応/未対応を選んでください。
                            //
                            // ログだけ取って、スルーします。
                        }

gt_NextTime1:
                        ;
                    }
end_loop1:

                    if (isTimeoutShutdown)
                    {
                        //MessageBox.Show("ループ1で矯正終了するんだぜ☆!");
                        goto gt_EndMethod;
                    }

                    //
                    // USIループ(2つ目)
                    //

                    //
                    // 図.
                    //
                    //      この将棋エンジンが後手とします。
                    //
                    //      ┌──┬─────────────┬──────┬──────┬────────────────────────────────────┐
                    //      │順番│                          │計算        │temezumiCount │解説                                                                    │
                    //      ┝━━┿━━━━━━━━━━━━━┿━━━━━━┿━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
                    //      │   1│初回                      │            │            │相手が先手、この将棋エンジンが後手とします。                            │
                    //      │    │                          │            │0           │もし、この将棋エンジンが先手なら、初回は temezumiCount = -1 とします。    │
                    //      ├──┼─────────────┼──────┼──────┼────────────────────────────────────┤
                    //      │   2│position                  │+-0         │            │                                                                        │
                    //      │    │    (相手が指しても、     │            │            │                                                                        │
                    //      │    │     指していないときでも │            │            │                                                                        │
                    //      │    │     送られてきます)      │            │0           │                                                                        │
                    //      ├──┼─────────────┼──────┼──────┼────────────────────────────────────┤
                    //      │   3│go                        │+2          │            │+2 します                                                               │
                    //      │    │    (相手が指した)        │            │2           │    ※「go」は、「go ponder」「go mate」「go infinite」とは区別します。 │
                    //      ├──┼─────────────┼──────┼──────┼────────────────────────────────────┤
                    //      │   4│go ponder                 │+-0         │            │                                                                        │
                    //      │    │    (相手はまだ指してない)│            │2           │                                                                        │
                    //      ├──┼─────────────┼──────┼──────┼────────────────────────────────────┤
                    //      │   5│自分が指した              │+-0         │            │相手が指してから +2 すると決めたので、                                  │
                    //      │    │                          │            │2           │自分が指したときにはカウントを変えません。                              │
                    //      └──┴─────────────┴──────┴──────┴────────────────────────────────────┘
                    //

                    // 棋譜
                    {
                        Debug.Assert(!Conv_MasuHandle.OnKomabukuro(
                                         Conv_SyElement.ToMasuNumber(((RO_Star)playing.Game.Kifu.CurNode.Value.KyokumenConst.StarlightIndexOf((Finger)0).Now).Masu)
                                         ), "駒が駒袋にあった。");
                    }

                    // go ponderの属性一覧
                    {
                        playing.Game.GoPonderNow = false;   // go ponderを将棋所に伝えたなら真
                    }

                    isTimeoutShutdown = false;
                    //PerformanceMetrics performanceMetrics = new PerformanceMetrics();//使ってない?

#if NOOPABLE
                    // サーバーに noop を送ってもよい場合だけ有効にします。
                    NoopTimerImpl noopTimer = null;
                    if (this.owner.Option_enable_serverNoopable)
                    {
                        noopTimer = new NoopTimerImpl();
                        noopTimer._01_BeforeLoop();
                    }
#endif

                    while (true)
                    {
                        PhaseResult_UsiLoop2 result_UsiLoop2 = PhaseResult_UsiLoop2.None;

                        //ノンストップ版
                        //string line = TimeoutReader.ReadLine(1000);//指定ミリ秒だけブロック。  (2020-12-13 sun) そのあと抜ける。頼んで作ってもらった関数、入力を取りこぼす不具合がある☆(^~^)?

                        // ブロッキングIO。
                        string line = Console.In.ReadLine();

                        // 通信ログは必ず取ります。
                        Logger.WriteLineC(line);

#if NOOPABLE
                        if (this.owner.Option_enable_serverNoopable)
                        {
                            noopTimer._03_AtResponsed(this.owner, line);
                        }
#endif


                        if (line.StartsWith("position"))
                        {
#if DEBUG
                            Logger.Trace("(^△^)positionきたコレ!");
#endif
                            // 入力行を解析します。
                            KifuParserA_Result result         = new KifuParserA_ResultImpl();
                            KifuParserA_Impl   kifuParserA    = new KifuParserA_Impl();
                            Model_Taikyoku     model_Taikyoku = new Model_TaikyokuImpl(playing.Game.Kifu);//FIXME:  この棋譜を委譲メソッドで修正するはず。 ShogiGui_Warabeは?
                            KifuParserA_Genjo  genjo          = new KifuParserA_GenjoImpl(line);
                            kifuParserA.Execute_All(
                                ref result,
                                model_Taikyoku,
                                genjo
                                );
                            if (null != genjo.StartposImporter_OrNull)
                            {
                                // SFENの解析結果を渡すので、
                                // その解析結果をどう使うかは、委譲します。
                                Util_InClient.OnChangeSky_Im_Client(
                                    model_Taikyoku,
                                    genjo
                                    );
                            }


#if DEBUG
                            Playing.Log2_Png_Tyokkin(line, (KifuNode)result.Out_newNode_OrNull);
#endif

                            //------------------------------------------------------------
                            // じっとがまん
                            //------------------------------------------------------------
                            //
                            // 応答は無用です。
                            // 多分、将棋所もまだ準備ができていないのではないでしょうか(?)
                            //
                            playing.Position();
                        }
                        else if (line.StartsWith("go ponder"))
                        {
                            playing.GoPonder();
                        }
                        // 「go ponder」「go mate」「go infinite」とは区別します。
                        else if (line.StartsWith("go"))
                        {
                            Match m = regexOfGo.Match(line);
                            if (m.Success)
                            {
                                playing.Go((string)m.Groups[1].Value, (string)m.Groups[2].Value, (string)m.Groups[3].Value, "", "");
                            }
                            else
                            {
                                // (2020-12-16 wed) フィッシャー・クロック・ルールに対応☆(^~^)
                                m = regexOfGoFisherClock.Match(line);

                                playing.Go((string)m.Groups[1].Value, (string)m.Groups[2].Value, "", (string)m.Groups[3].Value, (string)m.Groups[4].Value);
                            }
                        }
                        else if (line.StartsWith("stop"))
                        {
                            playing.Stop();
                        }
                        else if (line.StartsWith("gameover"))
                        {
                            Match m = regexOfGameover.Match(line);
                            if (m.Success)
                            {
                                playing.GameOver((string)m.Groups[1].Value);
                            }

                            // 無限ループ(2つ目)を抜けます。無限ループ(1つ目)に戻ります。
                            result_UsiLoop2 = PhaseResult_UsiLoop2.Break;
                        }
                        else if ("logdase" == line)
                        {
                            StringBuilder sb = new StringBuilder();
                            sb.Append("ログだせ~(^▽^)");

                            playing.Game.Kifu.ForeachZenpuku(
                                playing.Game.Kifu.GetRoot(), (int temezumi, KyokumenWrapper sky, Node <IMove, KyokumenWrapper> node, ref bool toBreak) =>
                            {
                                //sb.AppendLine("(^-^)");

                                if (null != node)
                                {
                                    if (null != node.Key)
                                    {
                                        string sfenText = ConvMoveStrSfen.ToMoveStrSfen(node.Key);
                                        sb.Append(sfenText);
                                        sb.AppendLine();
                                    }
                                }
                            });

                            File.WriteAllText(engineConf.GetResourceFullPath("LogDaseMeirei"), sb.ToString());
                        }
                        else
                        {
                            //------------------------------------------------------------
                            // ○△□×!?
                            //------------------------------------------------------------
                            //
                            // /(^×^)\
                            //

                            // 通信が届いていますが、このプログラムでは  聞かなかったことにします。
                            // USIプロトコルの独習を進め、対応/未対応を選んでください。
                            //
                            // ログだけ取って、スルーします。
                        }

                        switch (result_UsiLoop2)
                        {
                        case PhaseResult_UsiLoop2.Break:
                            goto end_loop2;

                        default:
                            break;
                        }

#pragma warning disable CS0164 // このラベルは参照されていません
gt_NextLine_loop2:
#pragma warning restore CS0164 // このラベルは参照されていません
                        ;
                    }

end_loop2:
                    ;

                    //-------------------+----------------------------------------------------------------------------------------------------
                    // スナップショット  |
                    //-------------------+----------------------------------------------------------------------------------------------------
                    // 対局後のタイミングで、データの中身を確認しておきます。
                    // Key と Value の表の形をしています。(順不同)
                    //
                    // 図.
                    //      ※内容はサンプルです。実際と異なる場合があります。
                    //
                    //      setoptionDictionary
                    //      ┌──────┬──────┐
                    //      │Key         │Value       │
                    //      ┝━━━━━━┿━━━━━━┥
                    //      │USI_Ponder  │true        │
                    //      ├──────┼──────┤
                    //      │USI_Hash    │256         │
                    //      └──────┴──────┘
                    //
                    //      goDictionary
                    //      ┌──────┬──────┐
                    //      │Key         │Value       │
                    //      ┝━━━━━━┿━━━━━━┥
                    //      │btime       │599000      │
                    //      ├──────┼──────┤
                    //      │wtime       │600000      │
                    //      ├──────┼──────┤
                    //      │byoyomi     │60000       │
                    //      └──────┴──────┘
                    //
                    //      goMateDictionary
                    //      ┌──────┬──────┐
                    //      │Key         │Value       │
                    //      ┝━━━━━━┿━━━━━━┥
                    //      │mate        │599000      │
                    //      └──────┴──────┘
                    //
                    //      gameoverDictionary
                    //      ┌──────┬──────┐
                    //      │Key         │Value       │
                    //      ┝━━━━━━┿━━━━━━┥
                    //      │gameover    │lose        │
                    //      └──────┴──────┘
                    //
#if DEBUG
                    Logger.Trace("KifuParserA_Impl.LOGGING_BY_ENGINE, ┏━確認━━━━setoptionDictionary ━┓");
                    foreach (KeyValuePair <string, string> pair in playing.SetoptionDictionary)
                    {
                        Logger.Trace($"{pair.Key}={pair.Value}");
                    }
                    Logger.Trace("┗━━━━━━━━━━━━━━━━━━┛");

                    //Dictionary<string, string> goMateProperties = new Dictionary<string, string>();
                    //goMateProperties["mate"] = "";
                    //LarabeLoggerList_Warabe.ENGINE.WriteLineAddMemo("┗━━━━━━━━━━━━━━━━━━┛");
                    //LarabeLoggerList_Warabe.ENGINE.WriteLineAddMemo("┏━確認━━━━goMateDictionary━━━┓");
                    //foreach (KeyValuePair<string, string> pair in this.goMateProperties)
                    //{
                    //    LarabeLoggerList_Warabe.ENGINE.WriteLineAddMemo($"{pair.Key}={pair.Value}");
                    //}
#endif

                    if (isTimeoutShutdown)
                    {
                        //MessageBox.Show("ループ2で矯正終了するんだぜ☆!");
                        goto gt_EndMethod;//全体ループを抜けます。
                    }
                }
            }
            catch (Exception ex)
            {
                // エラーが起こりました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                // どうにもできないので  ログだけ取って無視します。
                Logger.Fatal($"(^ー^)「大外枠でキャッチ」{ex}");
                Playing.Send("bestmove resign");
            }

gt_EndMethod:
            ;
        }
示例#24
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="line"></param>
        /// <param name="kifuNode"></param>
        public static void Log2_Png_Tyokkin(string line, KifuNode kifuNode)
        {
            var profilePath = System.Configuration.ConfigurationManager.AppSettings["Profile"];
            var toml        = Toml.ReadFile(Path.Combine(profilePath, "Engine.toml"));

            //Logger.Trace(
            //    Util_Sky307.Json_1Sky(this.Kifu.CurNode.Value.ToKyokumenConst, $"現局面になっているのかなんだぜ☆? line={line}] 棋譜={KirokuGakari.ToJsaKifuText(this.Kifu, OwataMinister.WARABE_ENGINE)}",
            //        "PgCS",
            //        this.Kifu.CurNode.Value.ToKyokumenConst.Temezumi
            //    )
            //);

            //
            // 局面画像ログ
            //
            {
                // 出力先
                string fileName = Path.Combine(profilePath, toml.Get <TomlTable>("Resources").Get <string>("ChokkinNoMoveLogPngBasename"));

                int srcMasu_orMinusOne = -1;
                int dstMasu_orMinusOne = -1;
                if (null != kifuNode.Key)
                {
                    srcMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)kifuNode.Key.LongTimeAgo).Masu);
                    dstMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)kifuNode.Key.Now).Masu);
                }

                KyokumenPngArgs_FoodOrDropKoma foodKoma;
                if (null != kifuNode.Key.FoodKomaSyurui)
                {
                    switch (Util_Komasyurui14.NarazuCaseHandle((Komasyurui14)kifuNode.Key.FoodKomaSyurui))
                    {
                    case Komasyurui14.H00_Null___: foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; break;

                    case Komasyurui14.H01_Fu_____: foodKoma = KyokumenPngArgs_FoodOrDropKoma.FU__; break;

                    case Komasyurui14.H02_Kyo____: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KYO_; break;

                    case Komasyurui14.H03_Kei____: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KEI_; break;

                    case Komasyurui14.H04_Gin____: foodKoma = KyokumenPngArgs_FoodOrDropKoma.GIN_; break;

                    case Komasyurui14.H05_Kin____: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KIN_; break;

                    case Komasyurui14.H07_Hisya__: foodKoma = KyokumenPngArgs_FoodOrDropKoma.HI__; break;

                    case Komasyurui14.H08_Kaku___: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KAKU; break;

                    default: foodKoma = KyokumenPngArgs_FoodOrDropKoma.UNKNOWN; break;
                    }
                }
                else
                {
                    foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE;
                }

                // 直近の指し手。
                Util_KyokumenPng_Writer.Write1(
                    Conv_KifuNode.ToRO_Kyokumen1(kifuNode),
                    srcMasu_orMinusOne,
                    dstMasu_orMinusOne,
                    foodKoma,
                    ConvMoveStrSfen.ToMoveStrSfen(kifuNode.Key),//Conv_MoveStr_Jsa.ToMoveStr_Jsa(kifuNode, kifuNode.Value),
                    "",
                    fileName,
                    Util_KifuTreeLogWriter.REPORT_ENVIRONMENT
                    );
            }
        }
示例#25
0
        public void Go(string btime, string wtime, string byoyomi, string binc, string winc)
        {
            //------------------------------------------------------------
            // あなたの手番です
            //------------------------------------------------------------
            //
            // 図.
            //
            //      log.txt
            //      ┌────────────────────────────────────────
            //      ~
            //      │2014/08/02 2:36:19> go btime 599000 wtime 600000 byoyomi 60000
            //      │
            //
            // もう指していいときに、将棋所から送られてくる文字が go です。
            //


            //------------------------------------------------------------
            // 先手 3:00  後手 0:00  記録係「50秒ぉ~」
            //------------------------------------------------------------
            //
            // 上図のメッセージのままだと使いにくいので、
            // あとで使いやすいように Key と Value の表に分けて持ち直します。
            //
            // 図.
            //
            //      goDictionary
            //      ┌──────┬──────┐
            //      │Key         │Value       │
            //      ┝━━━━━━┿━━━━━━┥
            //      │btime       │599000      │
            //      ├──────┼──────┤
            //      │wtime       │600000      │
            //      ├──────┼──────┤
            //      │byoyomi     │60000       │
            //      └──────┴──────┘
            //      単位はミリ秒ですので、599000 は 59.9秒 です。
            //
            //----------------------------------------
            // 棋譜ツリー、局面データは、position コマンドで先に与えられているものとします。
            //----------------------------------------

            // ┏━━━━プログラム━━━━┓

            int latestTemezumi = this.Game.Kifu.CurNode.Value.KyokumenConst.Temezumi;     //現・手目済

            SkyConst src_Sky = this.Game.Kifu.NodeAt(latestTemezumi).Value.KyokumenConst; //現局面

            //Logger.Trace($"将棋サーバー「{latestTemezumi}手目、きふわらべ さんの手番ですよ!」 {line}");


            //----------------------------------------
            // 王の状態を調べます。
            //----------------------------------------
            Result_KingState result_kingState;

            {
                result_kingState = Result_KingState.Empty;

                RO_Star king1p = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now);
                RO_Star king2p = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now);
                //Logger.Trace("将棋サーバー「ではここで、王さまがどこにいるか確認してみましょう」");
                //Logger.Trace($"▲王の置き場={Conv_SyElement.Masu_ToOkiba(koma1.Masu)}");
                //Logger.Trace($"△王の置き場={Conv_SyElement.Masu_ToOkiba(koma2.Masu)}");

                if (Conv_SyElement.ToOkiba(king1p.Masu) != Okiba.ShogiBan)
                {
                    // 先手の王さまが将棋盤上にいないとき☆
                    result_kingState = Result_KingState.Lost_SenteOh;
                }
                else if (Conv_SyElement.ToOkiba(king2p.Masu) != Okiba.ShogiBan)
                {
                    // または、後手の王さまが将棋盤上にいないとき☆
                    result_kingState = Result_KingState.Lost_GoteOh;
                }
                else
                {
                    result_kingState = Result_KingState.Empty;
                }
            }

            //------------------------------------------------------------
            // わたしの手番のとき、王様が 将棋盤上からいなくなっていれば、投了します。
            //------------------------------------------------------------
            //
            //      将棋GUI『きふならべ』用☆ 将棋盤上に王さまがいないときに、本将棋で go コマンドが送られてくることは無いのでは☆?
            //
            switch (result_kingState)
            {
            case Result_KingState.Lost_SenteOh:   // 先手の王さまが将棋盤上にいないとき☆
            case Result_KingState.Lost_GoteOh:    // または、後手の王さまが将棋盤上にいないとき☆
            {
                //------------------------------------------------------------
                // 投了
                //------------------------------------------------------------
                //
                // 図.
                //
                //      log.txt
                //      ┌────────────────────────────────────────
                //      ~
                //      │2014/08/02 2:36:21< bestmove resign
                //      │
                //

                // この将棋エンジンは、後手とします。
                // 20手目、投了  を決め打ちで返します。
                Playing.Send("bestmove resign");        //投了
            }
            break;

            default:    // どちらの王さまも、まだまだ健在だぜ☆!
            {
                List <KifuNode> bestKifuNodeList = new List <KifuNode>();

                //------------------------------------------------------------
                // 指し手のチョイス
                //------------------------------------------------------------
                bool isHonshogi = true;



                //------------------------------------------------------------
                // MultiPV のテスト中☆
                //------------------------------------------------------------
                //
                // 指し手を決めます。
                // TODO: その指し手の評価値がいくらだったのか調べたい。
                //
                // FIXME: ログがMultiPV別になっていないので、混ざって、同じ手を2度指しているみたいに見えてしまう☆
                //
                int multiPV_Count = 1;        // 2;
                {
                    // 最善手、次善手、三次善手、四次善手、五次善手
                    for (int iMultiPV = 0; iMultiPV < multiPV_Count; iMultiPV++)
                    {
                        bestKifuNodeList.Add(this.WA_Bestmove(
                                                 isHonshogi,
                                                 this.Game.Kifu)
                                             );
                    }


#if DEBUG
                    //// 内容をログ出力
                    //// 最善手、次善手、三次善手、四次善手、五次善手
                    //StringBuilder sb = new StringBuilder();
                    //for (int iMultiPV = 0; iMultiPV < 5; iMultiPV++)
                    //{
                    //    string sfenText = Util_Sky.ToSfenMoveText(bestMoveList[iMultiPV]);
                    //    sb.AppendLine($"[{iMultiPV}]{sfenText}");
                    //}
                    //System.Windows.Forms.MessageBox.Show(sb.ToString());
#endif
                }

                KifuNode bestKifuNode = null;
                // 最善手、次善手、三次善手、四次善手、五次善手
                float bestScore = float.MinValue;
                for (int iMultiPV = 0; iMultiPV < bestKifuNodeList.Count; iMultiPV++)
                {
                    KifuNode node = bestKifuNodeList[iMultiPV];

                    if (null != node && null != node.KyHyokaSheet_Mutable && bestScore <= node.Score)
                    {
                        bestScore    = node.Score;
                        bestKifuNode = node;
                    }
                }

                IMove bestMove2;
                if (null == bestKifuNode)
                {
                    // 投了
                    bestMove2 = Util_Sky258A.NullObjectMove;
                }
                else
                {
                    bestMove2 = bestKifuNode.Key;
                }

                if (Util_Sky_BoolQuery.isEnableSfen(bestMove2))
                {
                    string sfenText = ConvMoveStrSfen.ToMoveStrSfen(bestMove2);

                    // ログが重過ぎる☆!
                    //Logger.Trace($"(Warabe)指し手のチョイス: bestmove=[{sfenText}] 棋譜={KirokuGakari.ToJsaKifuText(this.Kifu)}");

                    //----------------------------------------
                    // スコア 試し
                    //----------------------------------------
                    {
                        //int hyojiScore = (int)(bestScore / 100.0d);//FIXME:適当に調整した。
                        int hyojiScore = (int)bestScore;
                        if (this.Game.Kifu.CurNode.Value.KyokumenConst.KaisiPside == Playerside.P2)
                        {
                            // 符号を逆転
                            hyojiScore = -hyojiScore;
                        }
                        Playing.Send($"info time 1 depth 1 nodes 1 score cp {hyojiScore.ToString()} pv ");        //FIXME:
                        //+ " pv 3a3b L*4h 4c4d"
                    }


                    //----------------------------------------
                    // 指し手を送ります。
                    //----------------------------------------
                    Playing.Send($"bestmove {sfenText}");
                }
                else         // 指し手がないときは、SFENが書けない☆ 投了だぜ☆
                {
                    // ログが重過ぎる☆!
                    //Logger.Trace($"(Warabe)指し手のチョイス: 指し手がないときは、SFENが書けない☆ 投了だぜ☆ww(>_<) 棋譜={KirokuGakari.ToJsaKifuText(this.Kifu)}");

                    //----------------------------------------
                    // 投了w!
                    //----------------------------------------
                    Playing.Send("bestmove resign");
                }

                //------------------------------------------------------------
                // 以前の手カッター
                //------------------------------------------------------------
                UtilKifuTree282.IzennoHenkaCutter(this.Game.Kifu);
            }
            break;
            }
            // ┗━━━━プログラム━━━━┛

            // Logger.Trace();

            //throw new Exception("デバッグだぜ☆! エラーはキャッチできたかな~☆?(^▽^)");
        }
示例#26
0
        /// <summary>
        /// 将棋盤、駒台に筋があります。
        /// </summary>
        /// <param name="masu"></param>
        /// <returns>該当なければ-1</returns>
        public static bool TryMasuToDan(SyElement masu, out int result)
        {
            int masuNumber = Conv_SyElement.ToMasuNumber(masu);

            return(Util_MasuNum.TryMasuToDan(masuNumber, out result));
        }
示例#27
0
        public static Okiba ToOkiba(SyElement masu)
        {
            int masuNumber = Conv_SyElement.ToMasuNumber(masu);

            return(Conv_SyElement.ToOkiba(masuNumber));
        }