Пример #1
0
        /// <summary>
        /// 駒別の居場所
        /// </summary>
        /// <param name="hyoji"></param>
        static void AppendKomaBetuIbashoTo(IbashoBan.YomiIbashoBan yomiIbashoBan, StringBuilder hyoji)
        {
            hyoji.AppendLine("駒別の居場所");
            foreach (Taikyokusya tai in Conv_Taikyokusya.itiran)// 対局者1、対局者2
            {
                // 駒別
                foreach (Piece km_tai in Conv_Koma.itiranTai[(int)tai])
                {
                    hyoji.Append(SpkBanWaku.CutHeaderBanWidthZenkaku(Conv_Koma.GetName(km_tai)));
                }
                hyoji.AppendLine();

                // 盤
                YomiBitboard[] bbHairetu = new YomiBitboard[Conv_Komasyurui.itiran.Length];
                int            i         = 0;
                foreach (Komasyurui ks in Conv_Komasyurui.itiran)
                {
                    bbHairetu[i] = yomiIbashoBan.GetKoma(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai));
                    i++;
                }
                SpkBan_MultiColumn.Setumei_Bitboard(null, bbHairetu,
                                                    " 〇 ", "  ",
                                                    hyoji);
            }
        }
Пример #2
0
        /// <summary>
        /// 駒の利き数☆(^~^)
        /// 対局者別と、駒別
        /// </summary>
        /// <returns></returns>
        public static void HyojiKomanoKikiSu(KikiBan.YomiKikiBan yomiKikiBan, StringBuilder hyoji)
        {
            hyoji.AppendLine("重ね利き数全部");
            hyoji.AppendLine(string.Format("差分更新トータル ▲{0} △{1}", yomiKikiBan.CountKikisuTotalZenbu(Taikyokusya.T1), yomiKikiBan.CountKikisuTotalZenbu(Taikyokusya.T2)));
            // 対局者別 全部
            {
                // 見出し
                SpkBanWaku.Setumei_Headers(Conv_Taikyokusya.namaeItiran, hyoji);

                SpkBanWaku.AppendLine_TopBar(Conv_Taikyokusya.itiran.Length, PureSettei.banYokoHaba, hyoji); // ┌──┬──┬──┐みたいな線☆
                for (int dan = 0; dan < PureSettei.banTateHaba; dan++)
                {
                    // データ表示
                    SpkBanWaku.AppendLine_Record_Cell4Hankakus1(
                        (Taikyokusya tai, Masu ms) =>
                    {
                        int kikisuZenbu = yomiKikiBan.CountKikisuZenbu(tai, ms);
                        return(0 < kikisuZenbu ? string.Format(" {0,2} ", kikisuZenbu) : "  ");
                    },
                        dan,
                        hyoji
                        );

                    if (dan + 1 < PureSettei.banTateHaba)
                    {
                        SpkBanWaku.AppendLine_MiddleBar(Conv_Taikyokusya.itiran.Length, PureSettei.banYokoHaba, hyoji); // ├──┼──┼──┤みたいな線☆
                    }
                }
                SpkBanWaku.AppendLine_BottomBar(Conv_Taikyokusya.itiran.Length, PureSettei.banYokoHaba, hyoji); // └──┴──┴──┘みたいな線☆
            }
            // 駒別
            foreach (Taikyokusya tai in Conv_Taikyokusya.itiran) // 対局者1、対局者2
            {
                foreach (Piece km_tai in Conv_Koma.itiranTai[(int)tai])
                {
                    hyoji.Append(SpkBanWaku.CutHeaderBanWidthZenkaku(Conv_Koma.GetName(km_tai)));
                }
                hyoji.AppendLine();

                SpkBanWaku.AppendLine_TopBar(Conv_Komasyurui.itiran.Length, PureSettei.banYokoHaba, hyoji);

                for (int dan = 0; dan < PureSettei.banTateHaba; dan++)
                {
                    SpkBanWaku.AppendLine_Record_Cell4Hankakus3(
                        (Taikyokusya tai1, Komasyurui ks, Masu ms) => {
                        int kikisuKomabetu = yomiKikiBan.CountKikisuKomabetu(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai1), ms);
                        return(0 < kikisuKomabetu ? string.Format(" {0,2} ", kikisuKomabetu) : "  ");
                    },
                        tai, dan, hyoji);

                    if (dan + 1 < PureSettei.banTateHaba)
                    {
                        SpkBanWaku.AppendLine_MiddleBar(Conv_Komasyurui.itiran.Length, PureSettei.banYokoHaba, hyoji);
                    }
                }
                SpkBanWaku.AppendLine_BottomBar(Conv_Komasyurui.itiran.Length, PureSettei.banYokoHaba, hyoji);
            }
        }
Пример #3
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);
        }
Пример #4
0
        public static void BunkaiMoveUmv()
        {
            PureMemory.umv_ss = PureMemory.kifu_moveArray[PureMemory.kifu_endTeme];

            // 駒がないところを指していることがないか?
            PureMemory.umv_ms_t1 = AbstractConvMove.GetDstMasu_WithoutErrorCheck((int)PureMemory.umv_ss);
            PureMemory.umv_km_t1 = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma(PureMemory.umv_ms_t1);
            PureMemory.umv_ks_t1 = Med_Koma.KomaToKomasyurui(PureMemory.umv_km_t1);// 成っているかもしれない☆
            Debug.Assert(Conv_Masu.IsBanjoOrError(PureMemory.umv_ms_t1), "error Undo-Begin-6");
            Debug.Assert(Conv_Koma.IsOk(PureMemory.umv_km_t1), "error Undo-Begin-7");


            if (!AbstractConvMove.IsUtta(PureMemory.umv_ss))                                                  // 指す
            {
                PureMemory.umv_ms_t0 = AbstractConvMove.GetSrcMasu_WithoutErrorCheck((int)PureMemory.umv_ss); // 戻し先。
                Debug.Assert(Conv_Masu.IsBanjo(PureMemory.umv_ms_t0), "error Undo-Begin-21 #金魚 戻し先が盤上でない?");

                PureMemory.umv_mk_t0 = Motigoma.Yososu;
                if (AbstractConvMove.IsNatta(PureMemory.umv_ss))                               // 成っていたとき
                {
                    PureMemory.umv_ks_t0 = Conv_Komasyurui.ToNarazuCase(PureMemory.umv_ks_t1); // 成る前
                }
                else
                {
                    PureMemory.umv_ks_t0 = PureMemory.umv_ks_t1;// 成る前、あるいは、成っていない、あるいは もともと にわとり☆
                }
                PureMemory.umv_km_t0 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(PureMemory.umv_ks_t0, PureMemory.kifu_teban);
                Debug.Assert(Conv_Koma.IsOk(PureMemory.umv_km_t0), "error Undo-Begin-9 #羊");
                Debug.Assert(Conv_Masu.IsBanjoOrError(PureMemory.umv_ms_t0), "error Undo-Begin-8 #颪");
            }
            else// 打つ
            {
                PureMemory.umv_ms_t0 = Conv_Masu.masu_error;
                PureMemory.umv_km_t0 = Piece.Yososu;
                PureMemory.umv_ks_t0 = Komasyurui.Yososu;
                PureMemory.umv_mk_t0 = Med_Koma.KomasyuruiAndTaikyokusyaToMotiKoma(PureMemory.umv_ks_t1, PureMemory.kifu_teban);
            }


            PureMemory.umv_ks_c = PureMemory.kifu_toraretaKsAr[PureMemory.kifu_endTeme];

            if (Komasyurui.Yososu != PureMemory.umv_ks_c)
            {
                PureMemory.umv_km_c = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(PureMemory.umv_ks_c, PureMemory.kifu_aiteban);
                PureMemory.umv_mk_c = Med_Koma.BanjoKomaToMotiKoma(PureMemory.umv_km_c);
                Debug.Assert(Conv_Koma.IsOk(PureMemory.umv_km_c), "error Undo-Begin-10 #竜巻");
            }
            else
            {
                PureMemory.umv_km_c = Piece.Yososu;
                PureMemory.umv_mk_c = Motigoma.Yososu;
            }
        }
Пример #5
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);
        }
Пример #6
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);
        }
Пример #7
0
        // 成れない駒(X Koma) 捨て緩慢指し(タダ捨て指し)
        public static void GenerateXk_SuteKanmanZasi()
        {
            Debug.Assert(Conv_Koma.IsOk(PureMemory.ssss_ugoki_km), "");

            // 王手も除外するぜ☆(^▽^)
            GenerateMove03.KesuOte();

            while (PureMemory.ssss_bbVar_idosaki_narazu.Ref_PopNTZ(out PureMemory.ssss_ugoki_ms_dst)) // 立っているビットを降ろすぜ☆
            {
                if (GenerateMove03.TadasuteNoUgoki())                                                 // 相手の利きがあって、自分を除いた味方の利きがない升 に限るぜ☆(^▽^)www
                {
                    PureMemory.SetSsssGenk(
                        false, // タダ捨てに、一手詰めは無いだろう☆(*^~^*)
                        GenerateMove03.IsMisuteruUgoki(),
                        false  //逃げ道を開けて逃がすかどうかは判定しないぜ☆(^~^)
                        );

                    MoveGenAccessor.AddMoveNarazuGoodXorBad();
                }
            }
        }
Пример #8
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);
        }
Пример #9
0
        /// <summary>
        /// 将棋盤の駒を適当に動かすぜ☆(^▽^)www
        /// 主にテスト用だぜ☆(^▽^)
        /// </summary>
        public static bool TryFail_Mazeru(FenSyurui f
#if DEBUG
                                          , IDebugMojiretu reigai1
#endif
                                          )
        {
            int            r;                  //ランダム値☆
            Piece          tmpKm;
            MotigomaItiran motiKomaItiranImpl; //使わない

            // 盤がでかくなると時間がかかる☆(^~^)最大 1万回で☆(^~^)
            int nokori = 10000;

            // 50回もやれば混ざるだろ☆(^▽^)
            for (int i = 0; i < 50; i++)
            {
                int        kakuritu = PureSettei.banHeimen + Conv_Motigoma.itiran.Length;//適当☆(^~^)
                Komasyurui tmpKs;

                // 盤上にある駒を、別の空き升、あるいは持ち駒に移動するぜ☆(^▽^)
                for (int iMs1 = 0; iMs1 < PureSettei.banHeimen; iMs1++)
                {
                    for (int iMs2 = 0; iMs2 < PureSettei.banHeimen; iMs2++)
                    {
                        r = PureSettei.random.Next(kakuritu);
                        if (3 == r || 4 == r || 5 == r || 6 == r)// 確率
                        {
                            // 位置交換成立☆(^~^)空白同士の交換とか意味ないこともするぜ☆(^▽^)
                            tmpKm = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs1);
                            if (3 == r || 5 == r)
                            {
                                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//混ぜる
                                        (Masu)iMs1, Conv_Koma.Hanten(PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs2)),
                                        true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("TryFail_Oku"));
                                }
                            }
                            else
                            {
                                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//混ぜる
                                        (Masu)iMs1, PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs2),
                                        true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("Try_Oku"));
                                }
                            }

                            if (4 == r || 5 == r)
                            {
                                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//混ぜる
                                        (Masu)iMs2, Conv_Koma.Hanten(tmpKm), true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("Try_Oku"));
                                }
                            }
                            else
                            {
                                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//混ぜる
                                        (Masu)iMs2, tmpKm, true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("Try_Oku"));
                                }
                            }

                            nokori--;
                        }
                        else if ((1 == r || 2 == r) && PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKomaZenbu((Masu)iMs1))
                        {
                            // 持駒交換成立☆(^▽^)
                            Piece km_tmp = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs1);
                            tmpKs = Med_Koma.KomaToKomasyurui(km_tmp);

                            //Taikyokusya tai_tmp = Med_Koma.KomaToTaikyokusya(km_tmp);

                            // どちらの持駒にするかはランダムで☆(^~^)
                            Motigoma mk = Med_Koma.KomasyuruiAndTaikyokusyaToMotiKoma(tmpKs, 1 == r ? Taikyokusya.T1 : Taikyokusya.T2);

                            switch (tmpKs)
                            {
                            case Komasyurui.Z:
                            {
                                PureMemory.gky_ky.motigomaItiran.Fuyasu(mk);
                                Piece km_remove = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs1);
                                Debug.Assert(Conv_Koma.IsOk(km_remove), "km_remove can not remove");
                                if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                                        (Masu)iMs1,
                                        km_remove, Conv_Masu.masu_error, true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("TryFail_Torinozoku(4)"));
                                }
                            }
                            break;

                            case Komasyurui.K:
                            {
                                PureMemory.gky_ky.motigomaItiran.Fuyasu(mk);
                                Piece km_remove = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs1);
                                Debug.Assert(Conv_Koma.IsOk(km_remove), "km_remove can not remove");
                                if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                                        (Masu)iMs1,
                                        km_remove,
                                        Conv_Masu.masu_error, true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("TryFail_Torinozoku(5)"));
                                }
                            }
                            break;

                            case Komasyurui.PH:    //thru
                            case Komasyurui.H:
                            {
                                PureMemory.gky_ky.motigomaItiran.Fuyasu(mk);
                                Piece km_remove = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma((Masu)iMs1);
                                Debug.Assert(Conv_Koma.IsOk(km_remove), "km_remove can not remove");
                                if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma(
                                        (Masu)iMs1,
                                        km_remove,
                                        Conv_Masu.masu_error, true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("TryFail_Torinozoku(6)"));
                                }
                            }
                            break;
                            }

                            nokori--;
                        }
                    }

                    // ひんぱんに、ひよこ/にわとりの入れ替えだぜ☆(^▽^)www
                    {
                        Piece km;
                        r = PureSettei.random.Next(kakuritu);
                        if (r % 5 < 2)
                        {
                            if (PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKoma(Piece.P1, (Masu)iMs1) || PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKoma(Piece.P2, (Masu)iMs1))
                            {
                                if (0 == r)
                                {
                                    km = Piece.PP1;
                                }
                                else
                                {
                                    km = Piece.PP2;
                                }
                            }
                            else if (PureMemory.gky_ky.shogiban.yomiIbashoBan_yoko.IsOn(Piece.PP1, (Masu)iMs1) || PureMemory.gky_ky.shogiban.yomiIbashoBan_yoko.IsOn(Piece.PP2, (Masu)iMs1))
                            {
                                if (0 == r)
                                {
                                    km = Piece.P1;
                                }
                                else
                                {
                                    km = Piece.P2;
                                }
                            }
                            else
                            {
                                km = Piece.Yososu;
                            }

                            if (km != Piece.Yososu)
                            {
                                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(// 混ぜる
                                        (Masu)iMs1, km, true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("TryFail_Oku"));
                                }
                            }
                        }
                    }

                    for (int iMk2 = 0; iMk2 < Conv_Motigoma.itiran.Length; iMk2++)
                    {
                        Piece km = Piece.Yososu;
                        r = PureSettei.random.Next(kakuritu);
                        if ((1 == r || 2 == r) && PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKomaZenbu((Masu)iMs1) &&
                            PureMemory.gky_ky.motigomaItiran.yomiMotigomaItiran.HasMotigoma((Motigoma)iMk2))
                        {
                            // 持駒交換成立☆(^▽^)
                            switch ((Motigoma)iMk2)
                            {
                            case Motigoma.Z:

                                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, Motigoma.Z
#if DEBUG
                                                                                 , reigai1
#endif
                                                                                 ))
                                {
                                    return(Pure.FailTrue("Try_Herasu"));
                                }

                                if (1 == r)
                                {
                                    km = Piece.B1;
                                }
                                else
                                {
                                    km = Piece.B2;
                                }
                                break;

                            case Motigoma.K:

                                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, Motigoma.K
#if DEBUG
                                                                                 , reigai1
#endif
                                                                                 ))
                                {
                                    return(Pure.FailTrue("Try_Herasu"));
                                }

                                if (1 == r)
                                {
                                    km = Piece.R1;
                                }
                                else
                                {
                                    km = Piece.R2;
                                }
                                break;

                            case Motigoma.H:
                                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, Motigoma.H
#if DEBUG
                                                                                 , (IDebugMojiretu)reigai1
#endif
                                                                                 ))
                                {
                                    return(Pure.FailTrue("Try_Herasu"));
                                }

                                if (1 == r)
                                {
                                    km = Piece.P1;
                                }
                                else
                                {
                                    km = Piece.P2;
                                }
                                break;

                            case Motigoma.z:
                                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, Motigoma.z
#if DEBUG
                                                                                 , (IDebugMojiretu)reigai1
#endif
                                                                                 ))
                                {
                                    return(Pure.FailTrue("Try_Herasu"));
                                }

                                if (1 == r)
                                {
                                    km = Piece.B2;
                                }
                                else
                                {
                                    km = Piece.B1;
                                }
                                break;

                            case Motigoma.k:
                                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, Motigoma.k
#if DEBUG
                                                                                 , reigai1
#endif
                                                                                 ))
                                {
                                    return(Pure.FailTrue("Try_Herasu"));
                                }

                                if (1 == r)
                                {
                                    km = Piece.R2;
                                }
                                else
                                {
                                    km = Piece.R1;
                                }
                                break;

                            case Motigoma.h:
                                if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, Motigoma.h
#if DEBUG
                                                                                 , reigai1
#endif
                                                                                 ))
                                {
                                    return(Pure.FailTrue("Try_Herasu"));
                                }

                                if (1 == r)
                                {
                                    km = Piece.P2;
                                }
                                else
                                {
                                    km = Piece.P1;
                                }
                                break;
                            }

                            if (Piece.Yososu != km)
                            {
                                if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//混ぜる
                                        (Masu)iMs1, km, true
#if DEBUG
                                        , reigai1
#endif
                                        ))
                                {
                                    return(Pure.FailTrue("TryFail_Oku"));
                                }
                            }

                            nokori--;
                        }
                    }

                    if (nokori < 0)
                    {
                        break;
                    }
                }

                // FIXME: 手番をひっくり返す機能は無いぜ☆(^~^)

                if (nokori < 0)
                {
                    break;
                }
            }

            // らいおんの先後を調整するぜ☆(^▽^)
            {
                Taikyokusya tb = Taikyokusya.T1;
                r = PureSettei.random.Next(2);
                if (0 == r)
                {
                    tb = Conv_Taikyokusya.Hanten(tb);
                }

                for (int iMs1 = 0; iMs1 < PureSettei.banHeimen; iMs1++)
                {
                    /*
                     * // トライしてたら、位置を変えるぜ☆(^▽^)www
                     * if (Koma.R == this.Komas[iMs1] && Conv_Masu.IsTried(Taikyokusya.T1, (Masu)iMs1))
                     * {
                     *  int iMs2 = iMs1 + 9;//9升足しておくか☆(^▽^)www
                     *  tmpKm = this.Komas[iMs1];
                     *  this.Komas[iMs1] = this.Komas[iMs2];
                     *  this.Komas[iMs2] = tmpKm;
                     * }
                     * else if (Koma.r == this.Komas[iMs1] && Conv_Masu.IsTried(Taikyokusya.T2, (Masu)iMs1))
                     * {
                     *  int iMs2 = iMs1 - 9;//9升引いておくか☆(^▽^)www
                     *  tmpKm = this.Komas[iMs1];
                     *  this.Komas[iMs1] = this.Komas[iMs2];
                     *  this.Komas[iMs2] = tmpKm;
                     * }
                     */

                    if (PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKoma(Piece.K1, (Masu)iMs1) || PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKoma(Piece.K2, (Masu)iMs1))
                    {
                        Piece km = Piece.Yososu;
                        if (tb == Taikyokusya.T1)
                        {
                            km = Piece.K1;
                        }
                        else
                        {
                            km = Piece.K2;
                        }

                        if (Piece.Yososu != km)
                        {
                            if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//混ぜる
                                    (Masu)iMs1, km, true
#if DEBUG
                                    , reigai1
#endif
                                    ))
                            {
                                return(Pure.FailTrue("TryFail_Oku"));
                            }
                        }

                        tb = Conv_Taikyokusya.Hanten(tb);
                    }
                }
            }

            // 駒を配置したあとで使えだぜ☆(^~^)
            PureMemory.gky_ky.shogiban.Tukurinaosi_RemakeKiki();
            return(Pure.SUCCESSFUL_FALSE);
        }
Пример #10
0
        /// <summary>
        /// 指したあとの、次の局面へと更新するぜ☆
        /// ハッシュも差分変更するぜ☆
        ///
        /// 手番を進める処理は、分けるぜ☆(^~^)
        /// </summary>
        /// <param name="ss">指し手☆</param>
        public static bool TryFailDoMoveAll(
            Move ss,
            MoveType ssType
#if DEBUG
            , FenSyurui f
            , IDebugMojiretu reigai1
            , bool isAssertYokusei // 駒の取り合いは呼び出し回数が多いので、アサートを抑制したいときに真
            , string hint
#endif
            )
        {
#if DEBUG
            isAssertYokusei = false;//FIXME:
#endif



            // 投了なら、なにも更新せず終了☆(^▽^)
            if (Move.Toryo == ss)
            {
                PureMemory.dmv_ks_c = Komasyurui.Yososu;
                goto gt_EndMethod;
            }
            MoveGenAccessor.BunkaiMoveDmv(ss);

            Debug.Assert(Conv_Koma.IsOk(PureMemory.dmv_km_t0), string.Format("Do km_t0={0}", PureMemory.dmv_km_t0));
            Debug.Assert(Conv_Koma.IsOk(PureMemory.dmv_km_t1), "Do");
            Debug.Assert(Conv_Masu.IsBanjoOrError(PureMemory.dmv_ms_t1), "");
            Debug.Assert(Conv_Koma.IsOkOrKuhaku(PureMemory.dmv_km_c), "Do");

            if (AbstractConvMove.IsUtta(ss))
            {
                // 打った場合☆(^~^)

                // 駒台から駒を減らすんだぜ☆(^~^)
                if (TryFail_DaiOff(
                        PureMemory.dmv_ms_t0, // 打ち、の場合は使わないので、エラー値を入れておく
                        PureMemory.dmv_km_t0, // 打つ駒
                        PureMemory.dmv_mk_t0, // 持駒
                        PureMemory.dmv_ms_t1  // 移動先升

#if DEBUG
                        , f
                        , reigai1
#endif
                        ))
                {
                    return(Pure.FailTrue("TryFail_Tejun3_IdomotoJibunnoKomaTorinozoku"));
                }
            }
            else
            {
                // 盤上の駒を動かした場合☆(^~^)


                // 移動先に駒があれば取る
                if (CanDstOff(PureMemory.dmv_km_c))
                {
                    if (TryFail_DstOff(
                            PureMemory.dmv_ms_t1, // 移動先升
                            PureMemory.dmv_km_c,  // あれば、移動先の相手の駒(取られる駒; capture)
                            PureMemory.dmv_ks_c
#if DEBUG
                            , f
                            , reigai1
#endif
                            ))
                    {
                        return(Pure.FailTrue("TryFail_Tejun1_IdosakiNoKomaWoToru"));
                    }

                    // 取った駒が有れば駒台に増やすぜ☆(^~^)
                    if (TryFail_DaiOn(
                            PureMemory.dmv_km_c,// あれば、移動先の相手の駒(取られる駒; capture)
                            PureMemory.dmv_ks_c,
                            PureMemory.dmv_mk_c
#if DEBUG
                            , f
                            , reigai1
#endif
                            ))
                    {
                        return(Pure.FailTrue("TryFail_Tejun2_TottaKomaWoKomadainiOku"));
                    }
                }


                // 移動元から自分の駒を取り除くぜ☆(^~^)
                if (TryFail_SrcOff(
                        ss,
                        PureMemory.dmv_ms_t0,
                        PureMemory.dmv_km_t0,
                        PureMemory.dmv_mk_t0,
                        PureMemory.dmv_ms_t1 // 移動先升

    #if DEBUG
                        , f
                        , reigai1
    #endif
                        ))
                {
                    return(Pure.FailTrue("TryFail_Tejun3_IdomotoJibunnoKomaTorinozoku"));
                }
            }

            // 移動先に手番の駒を置くぜ☆(^~^)
            if (TryFail_DstOn(
                    PureMemory.dmv_ms_t0,
                    PureMemory.dmv_km_t1,
                    PureMemory.dmv_ms_t1 // 移動先升

#if DEBUG
                    , f
                    , reigai1
#endif
                    ))
            {
                return(Pure.FailTrue("TryFail_Tejun4_IdosakiNiTebanonKomawoOku"));
            }


            //────────────────────────────────────────
            // 最後に診断
            //────────────────────────────────────────
gt_EndMethod:
            return(Pure.SUCCESSFUL_FALSE);
        }