Esempio n. 1
0
        /// <summary>
        /// "1" を 対局者1、 "2" を 対局者2 にするぜ☆(^~^)
        /// </summary>
        /// <param name="moji1"></param>
        /// <returns></returns>
        public static bool Try_MojiToTaikyokusya(FenSyurui f, string moji1, out Taikyokusya out_tai)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
            {
                switch (moji1)
                {
                case "b": out_tai = Taikyokusya.T1; return(true);

                case "w": out_tai = Taikyokusya.T2; return(true);

                default: out_tai = Taikyokusya.Yososu; return(false);
                }
            }

            case FenSyurui.dfe_n:
            {
                switch (moji1)
                {
                case "1": out_tai = Taikyokusya.T1; return(true);

                case "2": out_tai = Taikyokusya.T2; return(true);

                default: out_tai = Taikyokusya.Yososu; return(false);
                }
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 移動元の盤の升に、手番の駒を戻すぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_Tejun2Sasu_IdomotoniTebannoKomawoModosu(
#if DEBUG
            FenSyurui dbg_f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            //────────────────────────────────────────
            //  T0  [1]     移動元に 駒 が無い
            //────────────────────────────────────────

            //────────────────────────────────────────
            //  T0  [遷移]    移動元に 駒 が現れる☆
            //────────────────────────────────────────
            {
                // ハッシュを差分更新

                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(// 手順2 移動元に手番の駒を戻す
                        PureMemory.umv_ms_t0, PureMemory.umv_km_t0, true
#if DEBUG
                        , dbg_reigai
#endif
                        ))
                {
                    return(Pure.FailTrue("undo-tj2s gky.ky.shogiban.Try_Oku"));
                }
                // TODO: 駒割り評価値を増やすならここだぜ☆(^~^)
            }

            //────────────────────────────────────────
            //  T0  [2]     移動元に 駒 が在る
            //────────────────────────────────────────
            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 3
0
        /// <summary>
        /// 升パターン
        /// </summary>
        /// <param name="isSfen"></param>
        /// <returns></returns>
        public static Regex GetMasuPattern(FenSyurui f)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
            {
                if (null == masPattern_sfen_)
                {
                    masPattern_sfen_ = new Regex(
                        $@"([{ Sfen.suji }])([{ Sfen.dan }])"
                        , RegexOptions.Compiled
                        );
                }
                return(masPattern_sfen_);
            }

            case FenSyurui.dfe_n:
            {
                if (null == masPattern_dfen_)
                {
                    masPattern_dfen_ = new Regex(
                        $@"([{ Dfen.suji }])([{ Dfen.dan }])"
                        , RegexOptions.Compiled
                        );
                }
                return(masPattern_dfen_);
            }

            default:
                throw new Exception($"未定義 {f}");
            }
        }
Esempio n. 4
0
        public static Regex GetKyokumenPattern(FenSyurui f)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
            {
                if (null == kyokumenPattern_sfen_)
                {
                    kyokumenPattern_sfen_ = new Regex(
                        Sfen.position +        // とりあえず ごっそりマッチ。123~はスペース数。+は成りゴマ。
                        "(?: (moves.*))?"      //棋譜
                        , RegexOptions.Compiled
                        );
                }
                return(kyokumenPattern_sfen_);
            }

            case FenSyurui.dfe_n:
            {
                if (null == kyokumenPattern_dfen_)
                {
                    kyokumenPattern_dfen_ = new Regex(
                        Dfen.position +        // とりあえず ごっそりマッチ。123~はスペース数。+は成りゴマ。
                        "(?: (moves.*))?"      //棋譜
                        , RegexOptions.Compiled
                        );
                }
                return(kyokumenPattern_dfen_);
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 5
0
        ///// <summary>
        ///// FIXME:分解したい
        ///// </summary>
        ///// <param name="isSfen"></param>
        ///// <returns></returns>
        //public static Regex GetKikiCommandPattern(bool isSfen)
        //{
        //    if (isSfen)
        //    {
        //        if (null == kikiCommandPattern_sfen_)
        //        {
        //            // kiki B3 R 1  : 升と、駒の種類と、手番を指定すると、利きを表示するぜ☆(^▽^)
        //            kikiCommandPattern_sfen_ = new Regex(
        //                $@"([{ Sfen.suji }])([{ Sfen.dan }\*])\s+([{ Sfen.motigomaT1 }{ Sfen.motigomaT2 }])\s+{Sfen.tebanPos}"
        //                , RegexOptions.Compiled
        //            );
        //        }
        //        return kikiCommandPattern_sfen_;
        //    }
        //    else
        //    {
        //        if (null == kikiCommandPattern_dfen_)
        //        {
        //            // kiki B3 R 1  : 升と、駒の種類と、手番を指定すると、利きを表示するぜ☆(^▽^)
        //            kikiCommandPattern_dfen_ = new Regex(
        //                $@"([{ Sfen.suji }])([{ Sfen.dan }\*])\s+([{ Sfen.motigomaT1 }{ Sfen.motigomaT2 }])\s+{ Sfen.tebanPos}"
        //                , RegexOptions.Compiled
        //            );
        //        }
        //        return kikiCommandPattern_dfen_;
        //    }
        //}
        //static Regex kikiCommandPattern_sfen_;
        //static Regex kikiCommandPattern_dfen_;

        #region 移動元升
        /// <summary>
        /// 「打ち」に対応するために、「K*」等も読み込めるようにしてあるぜ☆(^~^)
        /// </summary>
        /// <param name="isSfen"></param>
        /// <returns></returns>
        static Regex GetSrcMsPattern(FenSyurui f)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
                if (null == srcMs_sfen_)
                {
                    // 例「K」「K*」
                    srcMs_sfen_ = new Regex(
                        $@"([{ Sfen.komasyuruiT1 }{ Sfen.suji }][{ Sfen.dan }\*])"    //\s*
                        , RegexOptions.Compiled
                        );
                }
                return(srcMs_sfen_);

            case FenSyurui.dfe_n:
            {
                if (null == srcMs_dfen_)
                {
                    // 例「R」「R*」
                    srcMs_dfen_ = new Regex(
                        $@"([{ Dfen.komasyuruiT1 }{ Dfen.suji }][{ Dfen.dan }\*])"        //\s*
                        , RegexOptions.Compiled
                        );
                }
                return(srcMs_dfen_);
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 6
0
        public static bool Try_DoMove_Input(Move ss
#if DEBUG
                                            , FenSyurui f
                                            , IDebugMojiretu dbg_reigai
#endif
                                            )
        {
            MoveType ssType = MoveType.N00_Karappo;

            if (DoMoveOpe.TryFailDoMoveAll(ss, ssType
#if DEBUG
                                           , f
                                           , dbg_reigai
                                           , false
                                           , "Try_DoMove_Input"
#endif
                                           ))
            {
                return(false);
            }
            // 手番を進めるぜ☆(^~^)
            MoveGenAccessor.AddKifu(ss, ssType, PureMemory.dmv_ks_c);
//#if DEBUG
//            Util_Tansaku.Snapshot("Try_DoMove_Input", dbg_reigai);
//#endif
            return(true);
        }
Esempio n. 7
0
        static Regex GetTaikyokusyaPattern(FenSyurui f)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
            {
                if (null == taikyokusya_sfen_)
                {
                    // 例「K」
                    taikyokusya_sfen_ = new Regex(
                        $@"([{ Sfen.tebanPos }])"
                        , RegexOptions.Compiled
                        );
                }
                return(taikyokusya_sfen_);
            }

            case FenSyurui.dfe_n:
            {
                if (null == taikyokusya_dfen_)
                {
                    // 例「R」
                    taikyokusya_dfen_ = new Regex(
                        $@"([{ Dfen.tebanPos }])"
                        , RegexOptions.Compiled
                        );
                }
                return(taikyokusya_dfen_);
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 8
0
        public static string ToString_Fen(FenSyurui f, Move ss)
        {
            StringBuilder hyoji = new StringBuilder();

            AppendFenTo(f, ss, hyoji);
            return(hyoji.ToString());
        }
Esempio n. 9
0
        /// <summary>
        /// 移動元の盤の升に、手番の駒を戻すぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_Tejun2Utu_IdomotoniTebannoKomawoModosu(
#if DEBUG
            FenSyurui dbg_f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            //────────────────────────────────────────
            //  T0  [1]     移動元に 駒 が無い
            //────────────────────────────────────────

            //────────────────────────────────────────
            //  T0  [遷移]    移動元に 駒 が現れる☆
            //────────────────────────────────────────
            {
                // 今の駒台の駒数は消える ※駒台だけ、このステップが多い
                PureMemory.gky_ky.motigomaItiran.Fuyasu(PureMemory.umv_mk_t0);

                // TODO: 駒割り評価値を増やすならここだぜ☆(^~^)
            }

            //────────────────────────────────────────
            //  T0  [2]     移動元に 駒 が在る
            //────────────────────────────────────────

            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 10
0
 public static void AppendMovesTo(FenSyurui f, StringBuilder syuturyoku)
 {
     ScanKifu_0ToPreTeme((int iKifu, ref bool toBreak) =>
     {
         Move ss = PureMemory.kifu_moveArray[iKifu];
         SpkMove.AppendFenTo(f, ss, syuturyoku);
         syuturyoku.Append(" ");
     });
 }
Esempio n. 11
0
        /// <summary>
        /// 移動元の盤の升から、自分の駒を取るぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_SrcOff(
            Move ss,
            Masu ms_t0,
            Piece km_t0,
            Motigoma mk_t0,
            Masu ms_t1 // 移動先升
#if DEBUG
            , FenSyurui f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            //────────────────────────────────────────
            // T1   [1]  移動元に 手番の駒 が在る
            //────────────────────────────────────────

            //────────────────────────────────────────
            // T1   [遷移]    移動元の 手番の駒 を除外する
            //────────────────────────────────────────
            {
                // TODO: 駒割りを評価値減らすならここだぜ☆(^~^)

                // FIXME: ここに問題のコードがあった★★★★★★★★★★★★★★★★★★★
            }

            //DoMove1( isSfen, ss, ssType, ref konoTeme, syuturyoku, out gt_EndMethod);


            // ローカル変数はグローバル変数に移動した。
            {
                // この下の HerasuBanjoKoma で指し手件数が動くようだ。

                // 盤上はこのステップが多い
                Debug.Assert(Conv_Koma.IsOk(km_t0), "km_t0 can not remove");
                if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                        ms_t0, km_t0,
                        ms_t1, // (2017-05-02 22:19 Add)移動先の升(将来駒を置く升)を指定しておくぜ☆(^~^)
                        true
#if DEBUG
                        , dbg_reigai
#endif
                        ))
                {
                    return(Pure.FailTrue("TryFail_Torinozoku(2)"));
                }
                // 駒が無かった、というキャッシュは取らないぜ☆(^▽^)

                // この上の HerasuBanjoKoma で指し手件数が動くようだ。
            }

            //────────────────────────────────────────
            // T1   [2]      移動元に 手番の駒 が無い
            //────────────────────────────────────────

            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 12
0
        /// <summary>
        /// 持ち駒の種類
        /// </summary>
        /// <param name="moji">改造Fen</param>
        /// <returns></returns>
        public static MotigomaSyurui MojiToMotikomaSyurui(FenSyurui f, string moji)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
            {
                switch (moji)
                {
                case "B": return(MotigomaSyurui.Z);

                case "R": return(MotigomaSyurui.K);

                case "P": return(MotigomaSyurui.H);

                case "G": return(MotigomaSyurui.I);

                case "S": return(MotigomaSyurui.Neko);

                case "N": return(MotigomaSyurui.U);

                case "L": return(MotigomaSyurui.S);

                default: return(MotigomaSyurui.Yososu);
                }
            }

            case FenSyurui.dfe_n:
            {
                switch (moji)
                {
                case "Z": return(MotigomaSyurui.Z);

                case "K": return(MotigomaSyurui.K);

                case "H": return(MotigomaSyurui.H);

                case "I": return(MotigomaSyurui.I);

                case "N": return(MotigomaSyurui.Neko);

                case "U": return(MotigomaSyurui.U);

                case "S": return(MotigomaSyurui.S);

                default: return(MotigomaSyurui.Yososu);
                }
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 13
0
        public static Move TryFenMove2(
            FenSyurui f,
            string str1,
            string str2,
            string str3,
            string str4,
            string str5
            )
        {
            int dstSuji = LisInt.FenSuji_Int(f, str3); // 至筋
            int dstDan  = LisInt.FenDan_Int(f, str4);  // 至段

            // 取った駒を調べるぜ☆(^▽^)
            Masu dstMs = Conv_Masu.ToMasu(dstSuji, dstDan);


            //------------------------------
            // 5
            //------------------------------
            bool natta = false;

            if ("+" == str5)
            {
                // 成りました
                natta = true;
            }


            //------------------------------
            // 結果
            //------------------------------
            if ("*" == str2)
            {
                // 駒台から打ったぜ☆
                return(AbstractConvMove.ToMove01cUtta(
                           dstMs,
                           Med_Parser.MojiToMotikomaSyurui(f, str1)//打った駒
                           ));
            }
            else
            {
                // 盤上の駒を動かしたぜ☆
                if (natta)
                {
                    return(AbstractConvMove.ToMove01bNariSasi(Med_Parser.FenSujiDan_Masu(f, str1, str2), dstMs));
                }
                else
                {
                    return(AbstractConvMove.ToMove01aNarazuSasi(Med_Parser.FenSujiDan_Masu(f, str1, str2), dstMs));
                }
            }
        }
Esempio n. 14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="line">B4B3、または toryo といった文字列を含む行☆</param>
        /// <param name="caret">文字カーソルの位置</param>
        /// <param name="ky">取られた駒を調べるために使う☆</param>
        /// <param name="out_move"></param>
        /// <returns></returns>
        public static bool MatchFenMove(
            FenSyurui f,
            string line,
            ref int caret,
            out Move out_move
            )
        {
            if (Util_String.MatchAndNext(Itiran_FenParser.GetToryo(f), line, ref caret))
            {
                out_move = Move.Toryo;
                return(true);
            }

            // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み
            // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。

            Match m = Itiran_FenParser.GetMovePattern(f).Match(line, caret);

            if (!m.Success)
            {
                //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆
                //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]";
                //Util_Machine.AppendLine(msg);
                //Util_Machine.Flush();
                //throw new Exception(msg);

                out_move = Move.Toryo;
                return(false);
            }

            // m.Groups[1].Value : ABCabc か、 ZKH
            // m.Groups[2].Value : 1234   か、 *
            // m.Groups[3].Value : ABCabc
            // m.Groups[4].Value : 1234
            // m.Groups[5].Value : +

            // カーソルを進めるぜ☆(^~^)
            Util_String.SkipMatch(line, ref caret, m);

            // 符号1「B4B3」を元に、move を作ります。
            out_move = TryFenMove2(
                f,
                m.Groups[1].Value,
                m.Groups[2].Value,
                m.Groups[3].Value,
                m.Groups[4].Value,
                m.Groups[5].Value
                );
            Debug.Assert((int)out_move != -1, "");

            return(true);
        }
Esempio n. 15
0
        /// <summary>
        /// 盤上に駒を置くだけ。
        ///
        /// クリアーしない(もうクリアーしてあるはず)。適用しない。利きを更新しない。
        /// </summary>
        public static bool TryFail_DoHirate_KomaNarabe(
            FenSyurui f
#if DEBUG
            , IDebugMojiretu reigai1
#endif
            )
        {
            bool updateKiki = false;

            // 0 ~ 初期局面升数-1
            // FIXME: 本将棋にしても、これが12のままになっている

            // 初期局面升数 ~ 将棋盤の升数-1

            for (int iMs = 0; iMs < PureSettei.banHeimen; iMs++)
            {
                if (iMs < HirateShokiKyokumen.banjo.Length)
                {
                    Piece km = HirateShokiKyokumen.banjo[iMs];
                    if (Piece.Kuhaku != km)
                    {
                        if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(
                                (Masu)iMs, km, updateKiki
#if DEBUG
                                , reigai1
#endif
                                ))
                        {
                            return(Pure.FailTrue("TryFail_Oku"));
                        }
                    }
                }
                else
                {
                    Piece km_remove = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs);
                    Debug.Assert(Conv_Koma.IsOk(km_remove), string.Format("km_remove can not remove 初期局面升数={0} 盤上の升数={1}", HirateShokiKyokumen.banjo.Length, PureSettei.banHeimen));
                    if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                            (Masu)iMs,
                            km_remove,
                            Conv_Masu.masu_error, updateKiki
#if DEBUG
                            , reigai1
#endif
                            ))
                    {
                        return(Pure.FailTrue("TryFail_Torinozoku(8)"));
                    }
                }
            }
            // ここではまだ、利きチェックは働かない
            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 16
0
        /// <summary>
        /// 次の入力を促す表示をしてるだけだぜ☆(^~^)
        /// </summary>
        public void ShowPrompt(Playing playing, FenSyurui f, StringBuilder hyoji)
        {
            if (0 < playing.commandBuffer.Count)
            {
                // コマンド・バッファーの実行中だぜ☆(^▽^)
                hyoji.Append($"{playing.commandBufferName }> ");
                Logger.Flush(hyoji);
            }
            else if (GameMode.Game == PureAppli.gameMode)
            {
                // 表示(コンソール・ゲーム用) 局面、あれば勝敗☆(^~^)
                {
                    if (this.isKyokumenEcho1)
                    {
                        SpkBan_1Column.Setumei_NingenGameYo(PureMemory.kifu_endTeme, hyoji);

                        //#if DEBUG
                        //                        CommandK.Ky(isSfen, "ky fen", gky, syuturyoku);// 参考:改造FEN表示
                        //                        CommandS.Move_cmd(isSfen, "move", gky, syuturyoku);// 参考:指し手表示
                        //                        if (false){
                        //                            SpkShogiban.HyojiKomanoIbasho(gky.ky.shogiban, syuturyoku);// 参考:駒の表示
                        //                            SpkShogiban.HyojiKomanoKikiSu(gky.ky.shogiban, syuturyoku);// 参考:利きの数
                        //                        }
                        //                        CommandS.Move_cmd(isSfen, "move seisei", gky, syuturyoku);// 参考:指し手表示 詳細
                        //                        Util_Machine.Flush(syuturyoku);
                        //#endif

                        playing.Result(hyoji, CommandMode.NingenYoConsoleGame);
                    }
                    Logger.Flush(hyoji);
                }

                if (!playing.isMultipleLineCommand // 複数行コマンド読み取り中はプロンプトを出さないぜ☆(^~^)
                    &&
                    (PureMemory.kifu_teban == Taikyokusya.T1 && !PureSettei.p1Com)
                    ||
                    (PureMemory.kifu_teban == Taikyokusya.T2 && !PureSettei.p2Com)
                    )
                {
                    // 人間の手番が始まるところで☆
                    hyoji.Append(@"指し手を入力してください。一例 do B3B2 ※ do b3b2 も同じ
> ");
                    Logger.Flush(hyoji);
                }
            }
            else
            {
                // 表示(コンソール・ゲーム用)
                hyoji.Append("> ");
                Logger.Flush(hyoji);
            }
        }
Esempio n. 17
0
        public static void Setumei(FenSyurui f, string header, MoveList sslist, StringBuilder hyoji)
        {
            hyoji.AppendLine(header);
            hyoji.AppendLine("┌──────────┐");
            for (int i = 0; i < sslist.listCount; i++)
            {
                SpkMove.AppendFenTo(f, sslist.moveList[i], hyoji);
                hyoji.AppendLine();
            }
            hyoji.AppendLine("└──────────┘");
#if DEBUG
            hyoji.AppendLine($"指し手生成を抜けた場所:{ PureMemory.ssss_movePickerWoNuketaBasho1}");
#endif
        }
Esempio n. 18
0
        /// <summary>
        /// 指定の手目まで進めるぜ☆(^~^)
        /// </summary>
        /// <param name="temeMade"></param>
        /// <param name="ky2"></param>
        /// <param name="hyoji"></param>
        public static bool Try_GoToTememade(FenSyurui f, int temeMade, StringBuilder hyoji)
        {
            // 棋譜を元に、局面データを再現するぜ☆

            int    caret = 0;
            string moves_notUse;

            // 初期局面のセット☆(^~^)
            if (LisGenkyoku.TryFail_MatchPositionvalue(f, PureMemory.kifu_syokiKyokumenFen, ref caret, out moves_notUse
#if DEBUG
                                                       , (IDebugMojiretu)hyoji
#endif
                                                       ))
            {
                return(false);
            }
            // 指定の手目まで進めるぜ☆(^~^)
            MoveGenAccessor.ScanKifu_0ToPreTeme((int iKifu, ref bool toBreak) =>
            {
                Move ss = PureMemory.kifu_moveArray[iKifu];
                if (temeMade < iKifu)
                {
                    toBreak = true;
                    return;
                }

                MoveType ssType = MoveType.N00_Karappo;
                if (DoMoveOpe.TryFailDoMoveAll(ss, ssType
#if DEBUG
                                               , f
                                               , (IDebugMojiretu)hyoji
                                               , false
                                               , "Try_GoToTememade"
#endif
                                               ))
                {
                    toBreak = true;
                    return;
                }
                // 手番を進めるぜ☆(^~^)
                MoveGenAccessor.AddKifu(ss, ssType, PureMemory.dmv_ks_c);
//#if DEBUG
//                Util_Tansaku.Snapshot("GoToTememade", (IDebugMojiretu)hyoji);
//#endif

                temeMade--;
            });
            return(true);
        }
Esempio n. 19
0
        /// <summary>
        /// 改造Fen用の文字列を返すぜ☆(^▽^)
        /// </summary>
        /// <param name="ks"></param>
        /// <returns></returns>
        public static void AppendFenTo(FenSyurui f, MotigomaSyurui mks, StringBuilder syuturyoku)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
                syuturyoku.Append(Conv_MotigomaSyurui.m_sfen_[(int)mks]);
                break;

            case FenSyurui.dfe_n:
                syuturyoku.Append(Conv_MotigomaSyurui.m_dfen_[(int)mks]);
                break;

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 20
0
        /// <summary>
        /// 取った駒を、駒台に置くぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_DaiOn(
            Piece km_c,// あれば、移動先の相手の駒(取られる駒; capture)
            Komasyurui ks_c,
            Motigoma mk_c

#if DEBUG
            , FenSyurui f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            //────────────────────────────────────────
            // 状況:
            //          移動先に駒があれば……。
            //────────────────────────────────────────
            #region 駒を取る
            if (km_c != Piece.Kuhaku)
            {
                // 駒取るぜ☆(^▽^)!

                // ただし、らいおんを除く
                if (ks_c != Komasyurui.R) // らいおん を取っても、持駒は増えないぜ☆
                {
                    //────────────────────────────────────────
                    // C    [1]     取る前の 持ち駒が増える前の 駒台が在る
                    //────────────────────────────────────────

                    //────────────────────────────────────────
                    //  C    [遷移]    取った持ち駒を増やす
                    //────────────────────────────────────────
                    // 取る前の持ち駒をリカウントする
                    // 増やす
                    PureMemory.gky_ky.motigomaItiran.Fuyasu(mk_c);

                    // TODO: 駒割りを増やすならここだぜ☆(^~^)


                    //────────────────────────────────────────
                    // C   [3]  取った後の 持駒が1つ増えた 駒台が在る
                    //────────────────────────────────────────
                }
            }
            #endregion

            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 21
0
        /// <summary>
        /// 通信用
        /// fen(盤上の駒配置、持ち駒の数、手番の対局者) 何手目 同形反復の回数
        /// </summary>
        /// <param name="syuturyoku"></param>
        public static void TusinYo_Line(FenSyurui f, StringBuilder syuturyoku)
        {
            // まず、fen を返すぜ☆(^▽^)
            // 盤上の駒配置、持ち駒の数、手番の対局者☆
            SpkGenkyokuOpe.AppendFenTo(f, syuturyoku);
            // 次は空白☆(^~^)
            syuturyoku.Append(" ");

            // 何手目かは 1 固定☆(^▽^)
            syuturyoku.Append("1");
            // 次は空白☆(^~^)
            syuturyoku.Append(" ");

            // #仲ルール かどうかは出さないぜ☆(^▽^)

            syuturyoku.AppendLine();
        }
Esempio n. 22
0
        /// <summary>
        /// 駒台から、取った駒を除外するぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_Tejun3_KomadaiKaraTottakomawoJogai(
#if DEBUG
            FenSyurui dbg_f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            if (Komasyurui.Yososu != PureMemory.umv_ks_c)
            {
                //------------------------------------------------------------
                // 取った駒を戻す
                //------------------------------------------------------------

                if (PureMemory.umv_ks_c != Komasyurui.R)// らいおん を盤に戻しても、持駒の数は変わらないぜ☆(^▽^)
                {
                    //────────────────────────────────────────
                    //  C   [1]      取ったあとの 持駒の数 の駒台が在る
                    //────────────────────────────────────────

                    //────────────────────────────────────────
                    //  C   [遷移]    取った 持駒 を除外する
                    //────────────────────────────────────────
                    // 消して

                    // 増やす
                    MotigomaItiran motiKomaItiranImpl;
                    if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, PureMemory.umv_mk_c
#if DEBUG
                                                                     , (IDebugMojiretu)dbg_reigai
#endif
                                                                     ))
                    {
                        return(Pure.FailTrue("Try_Herasu"));
                    }

                    // TODO: 駒割り評価値を減らすならここだぜ☆(^~^)


                    //────────────────────────────────────────
                    // C   [2]     戻したあとの 持駒の数 の駒台が在る
                    //────────────────────────────────────────
                }
            }
            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 23
0
        /// <summary>
        /// 改造Fen用の文字列を返すぜ☆(^▽^)
        /// </summary>
        /// <param name="ks"></param>
        /// <returns></returns>
        public static string ToFen(FenSyurui f, Komasyurui ks)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
            {
                return(Conv_Komasyurui.m_sfen_[(int)ks]);
            }

            case FenSyurui.dfe_n:
            {
                return(Conv_Komasyurui.m_dfen_[(int)ks]);
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 24
0
        /// <summary>
        /// 移動元の自分の駒台から、駒を取るぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_DaiOff(
            Masu ms_t0,
            Piece km_t0,
            Motigoma mk_t0,
            Masu ms_t1 // 移動先升

#if DEBUG
            , FenSyurui f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            //────────────────────────────────────────
            // T1   [1]  移動元に 手番の駒 が在る
            //────────────────────────────────────────

            //────────────────────────────────────────
            // T1   [遷移]    移動元の 手番の駒 を除外する
            //────────────────────────────────────────
            {
                MotigomaItiran motiKomaItiranImpl;
                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, mk_t0
#if DEBUG
                                                                 , (IDebugMojiretu)dbg_reigai
#endif
                                                                 ))
                {
                    return(Pure.FailTrue("do-tj3u gky.ky.motiKomas.Try_Herasu"));
                }

                // TODO: 駒割り評価値を減らすならここだぜ☆(^~^)

                // 駒台はこのステップが1つ多い
            }

            //DoMove1( isSfen, ss, ssType, ref konoTeme, syuturyoku, out gt_EndMethod);


            //────────────────────────────────────────
            // T1   [2]      移動元に 手番の駒 が無い
            //────────────────────────────────────────
            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 25
0
        /// <summary>
        /// 移動先の手番の駒を取り除くぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_Tejun1_IdosakiNoTebanNoKomaWoTorinozoku(
#if DEBUG
            FenSyurui f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            //────────────────────────────────────────
            //  T1 [1]      移動先に 手番の駒 が在る
            //────────────────────────────────────────

            //────────────────────────────────────────
            //  T1 [遷移]   移動先の 手番の駒 を除外する
            //────────────────────────────────────────

            // ハッシュ、駒割、二駒

            // TODO:駒割り評価値を減らすならここだぜ☆(^~^)

            // 駒を取り除く
            Debug.Assert(Conv_Koma.IsOk(PureMemory.umv_km_t1), "km_t1 can not remove");
            if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                    PureMemory.umv_ms_t1, // 移動先の升
                    PureMemory.umv_km_t1, // 移動先の駒
                    PureMemory.umv_ms_t0, // 移動元の升 (2017-05-02 22:44 Add) 未来に駒があるのは、元の場所なのでここなんだが☆(^~^)?
                    // 未指定の場合があるが、飛び利きに使ってるだけなんで関係無い☆(^~^)
                    // × ms_t1,
                    // × Sindan.MASU_ERROR,
                    // × ms_t0
                    true
#if DEBUG
                    , dbg_reigai
#endif
                    ))
            {
                return(Pure.FailTrue("TryFail_Torinozoku(3)"));
            }

            //────────────────────────────────────────
            //  T1 [2]     移動先に 手番の駒 が無い
            //────────────────────────────────────────
            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 26
0
        public static void Setumei(FenSyurui f, StringBuilder hyoji)
        {
            bool isBelow = false;

            MoveGenAccessor.ScanBestYomisuji((int iKifu, ref bool toBreak) =>
            {
                if (isBelow)
                {
                    // 2週目以降は空白を挟むぜ☆(^~^)
                    hyoji.Append(" ");
                }
                else
                {
                    isBelow = true;
                }

                SpkMove.AppendFenTo(f, PureMemory.kifu_moveArray[iKifu], hyoji);
            });
        }
Esempio n. 27
0
        public static Motigoma Yomu_Motikoma(FenSyurui f, string line, ref int caret, ref bool sippai, StringBuilder hyoji)
        {
            if (sippai)
            {
                hyoji.AppendLine("failure 持ち駒");
                return(Motigoma.Yososu);
            }

            foreach (Motigoma mk in Conv_Motigoma.itiran)
            {
                if (Util_String.MatchAndNext(SpkMotiKoma.GetFen(f, mk), line, ref caret))
                {
                    return(mk);
                }
            }

            sippai = true;
            hyoji.AppendLine("failure 持ち駒");
            return(Motigoma.Yososu);
        }
Esempio n. 28
0
        /// <summary>
        /// 段
        /// </summary>
        /// <param name="f"></param>
        /// <param name="suji"></param>
        /// <returns></returns>
        public static int FenDan_Int(FenSyurui f, string dan)
        {
            switch (f)
            {
            case FenSyurui.sfe_n:
                return(Conv_Kihon.AlphabetToInt(dan));

            case FenSyurui.dfe_n:
            {
                int iDan;
                if (!int.TryParse(dan, out iDan))
                {
                    throw new Exception($"パース失敗 dan=[{ dan }]");
                }
                return(iDan);
            }

            default:
                throw new Exception(string.Format("未定義 {0}", f));
            }
        }
Esempio n. 29
0
        /// <summary>
        /// 移動先の相手番の駒を取るぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool TryFail_DstOff(
            Masu ms_t1,     // 移動先升
            Piece km_c,     // あれば、移動先の相手の駒(取られる駒; capture)
            Komasyurui ks_c // 取られた駒の種類
#if DEBUG
            , FenSyurui f
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            // 移動先に駒があるかどうかのチェックは先に終わらせておくこと☆(^~^)
            //────────────────────────────────────────
            // T2C  [1] 移動先に 相手の駒 が在る
            //────────────────────────────────────────

            //────────────────────────────────────────
            // T2C  [遷移]    移動先の 相手の駒 を除外する
            //────────────────────────────────────────
            Debug.Assert(Conv_Koma.IsOk(km_c), "km_c can not remove");

            if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                    ms_t1,
                    km_c,
                    Conv_Masu.masu_error,
                    true
#if DEBUG
                    , dbg_reigai
#endif
                    ))
            {
                return(Pure.FailTrue("TryFail_Torinozoku(1)"));
            }

            //────────────────────────────────────────
            // T2C  [2]     移動先に 相手の駒 が無い
            //────────────────────────────────────────

            // ビットボードの駒の数は合っていないからチェックしないぜ☆
            return(Pure.SUCCESSFUL_FALSE);
        }
Esempio n. 30
0
        /// <summary>
        /// 棋譜に沿って、終局図まで進めるぜ☆(^~^)
        /// 局面は初期局面に設定し、「手目」は0に戻してあるものとするぜ☆(^~^)
        /// </summary>
        /// <param name="ky2"></param>
        /// <param name="hyoji"></param>
        public static bool Try_PlayMoves_0ToPreTeme(FenSyurui f, StringBuilder hyoji)
        {
            // 棋譜を元に、局面データを再現するぜ☆
            MoveGenAccessor.ScanMoves_0ToPreTeme((int iTeme, ref bool toBreak) => {
                Move ss = PureMemory.mvs_ssAr[iTeme];

#if DEBUG
                hyoji.AppendLine(string.Format("[{0}] 指すぜ☆(^~^) ss={1}",
                                               iTeme,
                                               SpkMove.ToString_Fen(PureSettei.fenSyurui, ss)
                                               ));
                int a = 0;
#endif


                if (DoMoveOpe.TryFailDoMoveAll(
                        ss,
                        MoveType.N00_Karappo
#if DEBUG
                        , f
                        , (IDebugMojiretu)hyoji
                        , false
                        , "Try_GoToFinish"
#endif
                        ))
                {
                    toBreak = true;
                    return;
                }
                MoveGenAccessor.AddKifu(ss, MoveType.N00_Karappo, PureMemory.dmv_ks_c);
#if DEBUG
                // 局面表示☆
                Interproject.project.HyojiKyokumen(iTeme, hyoji);
                // 駒の居場所表示☆
                Interproject.project.HyojiIbasho("Try_PlayMoves_0ToPreTeme", hyoji);
#endif
            });

            return(true);
        }