/// <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); } }
/// <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); } }
/// <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); }
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; } }
/// <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); }
/// <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); }
// 成れない駒(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(); } } }
/// <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); }
/// <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); }
/// <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); }