/// <summary> /// 駒の利き /// </summary> /// <param name="bbItiran_kikiZenbu"></param> /// <param name="bbItiran_kikiKomabetu"></param> /// <param name="hyoji"></param> public static void HyojiKomanoKiki(KikiBan.YomiKikiBan yomiKikiBan, StringBuilder hyoji) { Debug.Assert(yomiKikiBan.IsActiveBBKiki(), ""); // 対局者別 { hyoji.AppendLine("利き(対局者別)"); YomiBitboard[] bbHairetu = new YomiBitboard[Conv_Taikyokusya.itiran.Length]; foreach (Taikyokusya tai in Conv_Taikyokusya.itiran) { bbHairetu[(int)tai] = new YomiBitboard(yomiKikiBan.CloneBBKikiZenbu(tai)); } SpkBan_MultiColumn.Setumei_Bitboard(Conv_Taikyokusya.namaeItiran, bbHairetu, " + ", " ", hyoji); } // 駒別 { hyoji.AppendLine("利き(駒別)"); foreach (Taikyokusya tai in Conv_Taikyokusya.itiran)// 対局者1、対局者2 { // 盤上 YomiBitboard[] bbHairetu = new YomiBitboard[Conv_Komasyurui.itiran.Length]; foreach (Komasyurui ks in Conv_Komasyurui.itiran) { bbHairetu[(int)ks] = new YomiBitboard(yomiKikiBan.CloneBBKiki(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai))); } SpkBan_MultiColumn.Setumei_Bitboard(Med_Koma.GetKomasyuruiNamaeItiran(tai), 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> /// <param name="komanoUgokikata"></param> /// <param name="hyoji"></param> public static void HyojiKomanoUgoki(KikiBan.YomiKikiBan yomiKikiBan, int masuYososu, StringBuilder hyoji) { for (int ms = 0; ms < masuYososu; ms++) { hyoji.AppendLine($"ます{ ms}"); foreach (Taikyokusya tai in Conv_Taikyokusya.itiran) { // 盤上 YomiBitboard[] bbHairetu = new YomiBitboard[Conv_Komasyurui.itiran.Length]; foreach (Komasyurui ks in Conv_Komasyurui.itiran) { bbHairetu[(int)ks] = new YomiBitboard(BitboardsOmatome.KomanoUgokikataYk00.Clone_Merge( Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai), (Masu)ms)); } SpkBan_MultiColumn.Setumei_Bitboard(Med_Koma.GetKomasyuruiNamaeItiran(tai), bbHairetu, " + ", " ", hyoji); hyoji.AppendLine(); } } }
/// <summary> /// /// </summary> public static void DoMovePickerBegin(MoveType flag) { MoveGenAccessor.Clear_SsssUtikiri(); // 空っぽにしておくぜ☆ 何か入れないと投了だぜ☆(^▽^)www MoveGenAccessor.ClearMoveList(); PureMemory.ssss_isSyobuNasi = GenkyokuOpe.IsSyobuNasi(); PureMemory.ssss_bbBase_idosaki01_checker.Clear(); PureMemory.ssss_bbBase_idosaki02_raionCatch.Clear(); PureMemory.ssss_bbBase_idosaki03_nigeroTe.Clear(); PureMemory.ssss_bbBase_idosaki04_try.Clear(); PureMemory.ssss_bbBase_idosaki05_komaWoToruTe.Clear(); PureMemory.ssss_bbBase_idosaki06_himodukiOteZasi.Clear(); PureMemory.ssss_bbBase_idosaki07_suteOteZasi.Clear(); PureMemory.ssss_bbBase_idosaki08_suteOteDa.Clear(); PureMemory.ssss_bbBase_idosaki09_himodukiOteDa.Clear(); PureMemory.ssss_bbBase_idosaki10_himodukiKanmanDa.Clear(); PureMemory.ssss_bbBase_idosaki11_himodukiKanmanZasi.Clear(); PureMemory.ssss_bbBase_idosaki12_bottiKanmanZasi.Clear(); PureMemory.ssss_bbBase_idosaki13_bottiKanmanDa.Clear(); PureMemory.ssss_bbBase_idosaki14_suteKanmanZasi.Clear(); PureMemory.ssss_bbBase_idosaki15_suteKanmanDa.Clear(); PureMemory.ssss_bbVar_idosaki_narazu.Clear(); PureMemory.ssss_bbVar_idosaki_nari.Clear(); PureMemory.ssssTmp_bbVar_ibasho.Clear(); // 変数名短縮 Kyokumen.YomiKy yomiKy = PureMemory.gky_ky.yomiKy; IbashoBan.YomiIbashoBan yomiIbashoBan = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan; KikiBan.YomiKikiBan yomiKikiBan = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiKikiBan; //──────────────────────────────────────── // 被王手 //──────────────────────────────────────── Util_Hioute.Tukurinaosi(); //──────────────────────────────────────── // 移動先 //──────────────────────────────────────── if ( flag.HasFlag(MoveType.N13_HippakuKaeriutiTe) || flag.HasFlag(MoveType.N14_YoyuKaeriutiTe) ) { // 移動先は、王手をかけてきている駒☆(^~^) PureMemory.ssss_bbBase_idosaki01_checker.Set(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); } if (flag.HasFlag(MoveType.N12_RaionCatch) || flag.HasFlag(MoveType.N17_RaionCatchChosa)) { // 相手らいおん を取る手のみ生成するぜ☆(^▽^) yomiIbashoBan.ToSet_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki02_raionCatch); } if (flag.HasFlag(MoveType.N15_NigeroTe)) { // 移動先 PureMemory.ssss_bbBase_idosaki03_nigeroTe.Set(BitboardsOmatome.bb_boardArea); PureMemory.ssss_bbBase_idosaki03_nigeroTe.Siborikomi(PureMemory.hot_bb_nigeroAr[PureMemory.kifu_nTeban]); PureMemory.ssss_bbBase_idosaki03_nigeroTe.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // (逼迫/余裕)返討手は除外するぜ☆(^▽^) yomiIbashoBan.ToSitdown_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki03_nigeroTe); // 利きのうち、らいおんを取る手 は、除外するぜ☆(^▽^) PureMemory.ssss_bbBase_idosaki03_nigeroTe.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外するぜ☆(^▽^) } if (flag.HasFlag(MoveType.N16_Try)) { // トライは どうぶつしょうぎ用 だぜ☆(^~^) if (PureSettei.gameRule == GameRule.DobutuShogi) { PureMemory.ssss_bbBase_idosaki04_try.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki04_try); // 味方の駒があるところには移動できないぜ☆(^▽^) yomiIbashoBan.ToSitdown_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki04_try); // 利きのうち、らいおん を取る手は、除外するぜ☆(^▽^) PureMemory.ssss_bbBase_idosaki04_try.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外するぜ☆(^▽^) } } if (flag.HasFlag(MoveType.N01_KomaWoToruTe)) { // 移動先 yomiIbashoBan.ToSet_KomaZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki05_komaWoToruTe); // 相手の駒があるところだけ☆(^▽^) yomiIbashoBan.ToSitdown_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki05_komaWoToruTe); // らいおんキャッチ は除外するぜ☆(^▽^) PureMemory.ssss_bbBase_idosaki05_komaWoToruTe.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外するぜ☆(^▽^) } if (flag.HasFlag(MoveType.N10_HimozukiOteZasi)) { // 移動先 PureMemory.ssss_bbBase_idosaki06_himodukiOteZasi.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki06_himodukiOteZasi); // 味方の駒があるところには移動できないぜ☆(^▽^) yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki06_himodukiOteZasi); // 相手の駒がある升 は除外するぜ☆(^▽^) PureMemory.ssss_bbBase_idosaki06_himodukiOteZasi.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外するぜ☆(^▽^) } if (flag.HasFlag(MoveType.N06_SuteOteZasi)) { // 移動先 PureMemory.ssss_bbBase_idosaki07_suteOteZasi.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki07_suteOteZasi); // 味方の駒がある升 は除外☆(^▽^) yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki07_suteOteZasi); // 相手の駒がある升 は除外☆(^▽^) PureMemory.ssss_bbBase_idosaki07_suteOteZasi.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外☆(^▽^) } if (flag.HasFlag(MoveType.N07_SuteOteDa)) { // 持ち駒 PureMemory.ssss_bbBase_idosaki08_suteOteDa.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T1, PureMemory.ssss_bbBase_idosaki08_suteOteDa);// 持ち駒の打てる場所 = 駒が無いところ☆ yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T2, PureMemory.ssss_bbBase_idosaki08_suteOteDa); } if (flag.HasFlag(MoveType.N11_HimodukiOteDa)) { // 持ち駒 PureMemory.ssss_bbBase_idosaki09_himodukiOteDa.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T1, PureMemory.ssss_bbBase_idosaki09_himodukiOteDa); // 持ち駒の打てる場所 = 駒が無いところ☆ yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T2, PureMemory.ssss_bbBase_idosaki09_himodukiOteDa); PureMemory.gky_ky.yomiKy.yomiShogiban.yomiKikiBan.ToSelect_BBKikiZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki09_himodukiOteDa); // 紐を付ける☆ } if (flag.HasFlag(MoveType.N08_HimotukiKanmanSasi)) { // 盤面全体 PureMemory.ssss_bbBase_idosaki11_himodukiKanmanZasi.Set(BitboardsOmatome.bb_boardArea); // - 味方の駒がある升 ※味方の駒があるところには移動できないぜ☆(^▽^) yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki11_himodukiKanmanZasi); // - 相手の駒がある升 ※除外するぜ☆(^▽^) yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki11_himodukiKanmanZasi); // - 利きのうち、らいおんを取る手 ※除外するぜ☆(^▽^) yomiIbashoBan.ToSitdown_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki11_himodukiKanmanZasi); } if (flag.HasFlag(MoveType.N02_BottiKanmanSasi)) { // 移動先 PureMemory.ssss_bbBase_idosaki12_bottiKanmanZasi.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki12_bottiKanmanZasi); // 味方の駒があるところには移動できないぜ☆(^▽^) yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki12_bottiKanmanZasi); // 相手の駒がある升 は除外するぜ☆(^▽^) yomiIbashoBan.ToSitdown_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki12_bottiKanmanZasi); // 利きのうち、らいおんを取る手 は、除外するぜ☆(^▽^) PureMemory.ssss_bbBase_idosaki12_bottiKanmanZasi.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外するぜ☆(^▽^) } if (flag.HasFlag(MoveType.N03_BottiKanmanDa)) { // 持ち駒 PureMemory.ssss_bbBase_idosaki13_bottiKanmanDa.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T1, PureMemory.ssss_bbBase_idosaki13_bottiKanmanDa); // 自駒が無いところ☆ yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T2, PureMemory.ssss_bbBase_idosaki13_bottiKanmanDa); // 相手駒が無いところ☆ yomiKikiBan.ToSitdown_BBKikiZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki13_bottiKanmanDa); // 味方の利きが利いていない場所☆(^▽^) yomiKikiBan.ToSitdown_BBKikiZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki13_bottiKanmanDa); // 敵の利きが利いていない場所☆(^▽^) } if (flag.HasFlag(MoveType.N04_SuteKanmanSasi)) { PureMemory.ssss_bbBase_idosaki14_suteKanmanZasi.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_teban, PureMemory.ssss_bbBase_idosaki14_suteKanmanZasi); // 味方の駒があるところには移動できないぜ☆(^▽^) yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki14_suteKanmanZasi); // 相手の駒がある升 は除外するぜ☆(^▽^) yomiIbashoBan.ToSitdown_Koma(Med_Koma.ToRaion(PureMemory.kifu_aiteban), PureMemory.ssss_bbBase_idosaki14_suteKanmanZasi); // 利きのうち、らいおん を取る手は、除外するぜ☆(^▽^) PureMemory.ssss_bbBase_idosaki14_suteKanmanZasi.Sitdown(PureMemory.hot_bb_checkerAr[PureMemory.kifu_nTeban]); // 返討手 は除外するぜ☆(^▽^) } if (flag.HasFlag(MoveType.N05_SuteKanmanDa)) { PureMemory.ssss_bbBase_idosaki15_suteKanmanDa.Set(BitboardsOmatome.bb_boardArea); yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T1, PureMemory.ssss_bbBase_idosaki15_suteKanmanDa); // 味方の駒がない升 yomiIbashoBan.ToSitdown_KomaZenbu(Taikyokusya.T2, PureMemory.ssss_bbBase_idosaki15_suteKanmanDa); // 相手の駒がない升// 2016-12-22 捨てだからと言って、紐を付けないとは限らない☆ yomiKikiBan.ToSelect_BBKikiZenbu(PureMemory.kifu_aiteban, PureMemory.ssss_bbBase_idosaki15_suteKanmanDa); // 敵の利きが利いている場所に打つぜ☆(^▽^) } }