/// <summary> /// 駒の利き /// </summary> /// <param name="bbItiran_kikiZenbu"></param> /// <param name="bbItiran_kikiKomabetu"></param> /// <param name="syuturyoku"></param> public static void HyojiKomanoKiki(Shogiban shogiban, StringBuilder syuturyoku) { Debug.Assert(shogiban.IsActiveBBKiki(), ""); // 利き全部 { syuturyoku.AppendLine("利き(全部)"); Bitboard[] bbHairetu = new Bitboard[Conv_Taikyokusya.AllOptionalPhaseList.Length]; foreach (var optionalPhase65 in Conv_Taikyokusya.AllOptionalPhaseList) { bbHairetu[OptionalPhase.IndexOf(optionalPhase65)] = shogiban.GetBBKikiZenbu(optionalPhase65); } Setumei_Bitboards(Conv_Taikyokusya.NamaeItiran, bbHairetu, syuturyoku); } // 駒別 { syuturyoku.AppendLine("利き(駒別)"); foreach (var optionalPhase74 in Conv_Taikyokusya.AllOptionalPhaseList)// 対局者1、対局者2 { // 盤上 Bitboard[] bbHairetu = new Bitboard[Conv_Komasyurui.Itiran.Length]; foreach (Komasyurui ks in Conv_Komasyurui.Itiran) { bbHairetu[(int)ks] = shogiban.GetBBKiki(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase74)); } Setumei_Bitboards(Med_Koma.GetKomasyuruiNamaeItiran(optionalPhase74), bbHairetu, syuturyoku); } } }
public static void Update(Hyokati hyokati, Option <Phase> optionalPhase, int teme) { var phaseIndex = OptionalPhase.IndexOf(optionalPhase); if (Conv_Hyokati.InTumeTesu(hyokati)) { // 詰め手数が表示されているぜ☆ if (Util_Taikyoku.PNNantedume_Teme[phaseIndex] == int.MaxValue) { // 詰め手数が新たに表示されたようだぜ☆ Util_Taikyoku.PNNantedume_Teme[phaseIndex] = teme; } // 前から表示されていたのなら、そのままだぜ☆(^▽^) } else { // 詰め手数は、表示されていないぜ☆ if (Util_Taikyoku.PNNantedume_Teme[phaseIndex] != int.MaxValue) { // 詰め手数が消えたようだぜ☆ Util_Taikyoku.PNNantedume_Teme[phaseIndex] = int.MaxValue; } // もともと表示されていなかったのなら、そのままだぜ☆(^▽^) } }
/// <summary> /// /// </summary> /// <returns></returns> public static ulong GetTaikyokusyaKey(Option <Phase> optionalPhase, Kyokumen.Sindanyo kys) { if (Util_ZobristHashing.Dirty) { Util_ZobristHashing.Tukurinaosi(kys); } return(Util_ZobristHashing.m_tbTaikyokusya_[OptionalPhase.IndexOf(optionalPhase)]); }
/// <summary> /// コンピューター思考中表示☆(^~^) /// </summary> public static void AppendMessage_ComputerSikochu(Kyokumen ky, StringBuilder syuturyoku) { #if DEBUG syuturyoku.Append("**デバッグ・モード** ");//注意喚起☆(^▽^) #endif Conv_Taikyokusya.Setumei_Name(ky.CurrentOptionalPhase, syuturyoku); syuturyoku.Append("("); syuturyoku.Append(Option_Application.Optionlist.PNChar[OptionalPhase.IndexOf(ky.CurrentOptionalPhase)].ToString()); syuturyoku.Append(")の思考中(^~^)"); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); }
public static void Assert_Sabun_Kiki(string message, Kyokumen.Sindanyo kys) { // 駒の利き☆ bool safe = true; // 再計算 Recalculate Shogiban saikeisan = new Shogiban(kys); saikeisan.Tukurinaosi_1_Clear_KikiKomabetu(); saikeisan.Tukurinaosi_2_Input_KikiKomabetu(kys); foreach (var optionalPhase in Conv_Taikyokusya.AllOptionalPhaseList) // 対局者1、対局者2 { int iKm = 0; //どの駒でエラーがあったか foreach (Koma km in Conv_Koma.ItiranTai[OptionalPhase.IndexOf(optionalPhase)]) { if (!kys.EqualsKiki(km, saikeisan))//現行版と、再計算版の比較 { safe = false; break; } iKm++; } // ダイアログボックスに収まるように分けるぜ☆ if (!safe) { StringBuilder sindan1 = new StringBuilder(); //// 参考:駒の居場所 //{ // sindan1.Append(message); // sindan1.AppendLine("参考:駒の居場所"); // Util_Information.HyojiKomanoIbasho(ky.BB_KomaZenbu, ky.BB_Koma, sindan1); // sindan1.AppendLine($"Util_Tansaku.TansakuTyakusyuEdas=[{Util_Tansaku.TansakuTyakusyuEdas}]"); //} sindan1.Append(message); sindan1.Append("【エラー】"); Conv_Taikyokusya.Setumei_Name(optionalPhase, sindan1); sindan1.AppendLine(); sindan1.AppendLine($"iKm=[{iKm}]"); sindan1.AppendLine("利き:(再計算)"); Util_Information.Setumei_Bitboards(Med_Koma.GetKomasyuruiNamaeItiran(optionalPhase), saikeisan.WhereBBKiki(optionalPhase), sindan1); kys.Setumei_GenkoKiki(optionalPhase, sindan1); // 利き:(現行) var msg = sindan1.ToString(); sindan1.Clear(); Logger.Flush(msg); Debug.Assert(safe, msg); } } }
public static void AppendLine_Data_Countboard(Shogiban sg, int ms_hidariHasi, StringBuilder syuturyoku) { for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++) { syuturyoku.Append("│"); for (int iMs_offset = 0; iMs_offset < Option_Application.Optionlist.BanYokoHaba; iMs_offset++) { int kikisuZenbu = sg.CountKikisuZenbu(OptionalPhase.From(iTai), (Masu)(ms_hidariHasi + iMs_offset)); syuturyoku.Append(0 < kikisuZenbu ? string.Format(" {0,2} ", kikisuZenbu) : " "); syuturyoku.Append("│"); } } syuturyoku.AppendLine(); }
/// <summary> /// 駒の利き数☆(^~^) /// </summary> /// <returns></returns> public static void HyojiKomanoKikiSu(Shogiban shogiban, StringBuilder syuturyoku) { //, KikisuKomabetuCountboardItiran kikiKomabetuCB // KikisuZenbuCountboardItiran kikiZenbuCB syuturyoku.AppendLine("重ね利き数全部"); // 対局者別 全部 { // 見出し Setumei_Headers(Conv_Taikyokusya.NamaeItiran, syuturyoku); Util_Information.AppendLine_Top_Kyokumen(Conv_Taikyokusya.AllOptionalPhaseList.Length, syuturyoku); // ┌──┬──┬──┐みたいな線☆ for (int dan = 0; dan < Option_Application.Optionlist.BanTateHaba; dan++) { AppendLine_Data_Countboard(shogiban, dan * Option_Application.Optionlist.BanYokoHaba, syuturyoku); if (dan + 1 < Option_Application.Optionlist.BanTateHaba) { Util_Information.AppendLine_Middle(Conv_Taikyokusya.AllOptionalPhaseList.Length, syuturyoku); // ├──┼──┼──┤みたいな線☆ } } Util_Information.AppendLine_Bottom(Conv_Taikyokusya.AllOptionalPhaseList.Length, syuturyoku); // └──┴──┴──┘みたいな線☆ } // 駒別 foreach (var optionalPhase29 in Conv_Taikyokusya.AllOptionalPhaseList) // 対局者1、対局者2 { foreach (Koma km in Conv_Koma.ItiranTai[OptionalPhase.IndexOf(optionalPhase29)]) { syuturyoku.Append(Util_Information.FormatBanWidthZenkaku(Conv_Koma.GetName(km))); } syuturyoku.AppendLine(); Util_Information.AppendLine_Top_Kyokumen(Conv_Komasyurui.Itiran.Length, syuturyoku); for (int dan = 0; dan < Option_Application.Optionlist.BanTateHaba; dan++) { AppendLine_Data_Countboard(optionalPhase29, shogiban, dan * Option_Application.Optionlist.BanYokoHaba, syuturyoku); if (dan + 1 < Option_Application.Optionlist.BanTateHaba) { Util_Information.AppendLine_Middle(Conv_Komasyurui.Itiran.Length, syuturyoku); } } Util_Information.AppendLine_Bottom(Conv_Komasyurui.Itiran.Length, syuturyoku); } }
/// <summary> /// 局面に点数を付けるぜ☆(^▽^) /// /// どちらの対局者でも、自分に有利と思っていれば正の数の方向に点数が付くぜ☆(^▽^) /// </summary> /// <param name="ky_base"></param> /// <returns></returns> public void Tukurinaosi(Kyokumen.Sindanyo kys) { Hyokati[] hyokati = new Hyokati[] { Hyokati.Hyokati_Rei, Hyokati.Hyokati_Rei , Hyokati.Hyokati_Rei // 空白は手番なしで ここに入れるぜ☆(^~^) }; // 盤上 Bitboard komaBB = new Bitboard(); for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++) { var optionalPhase = Conv_Taikyokusya.AllOptionalPhaseList[iTai]; for (int iKs = 0; iKs < Conv_Komasyurui.Itiran.Length; iKs++) { Komasyurui ks = Conv_Komasyurui.Itiran[iKs]; kys.ToSetIbasho(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase), komaBB); while (komaBB.Ref_PopNTZ(out Masu ms_jissai)) { hyokati[iTai] += Conv_Koma.BanjoKomaHyokatiNumber[(int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase)]; } } } // 持ち駒 foreach (MotiKoma mk in Conv_MotiKoma.Itiran) { var optionalPhase = Med_Koma.MotiKomaToPhase(mk); var phaseIndex = OptionalPhase.IndexOf(optionalPhase); MotiKomasyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk); Hyokati komaHyokati = Conv_Hyokati.KomaHyokati[(int)Med_Koma.MotiKomasyuruiAndPhaseToKoma(mks, optionalPhase)]; hyokati[phaseIndex] += (int)komaHyokati * kys.CountMotikoma(mk); } // 手番 - 相手番 Hyokati hyokatiP1 = hyokati[(int)Phase.Black]; hyokati[(int)Phase.Black] -= hyokati[(int)Phase.White]; hyokati[(int)Phase.White] -= hyokatiP1; KomawariHyokati_Sabun = hyokati; }
public Task <bool> CreateConvertTask(CancellationToken cancellationToken, string mkvPath = null) { if (!string.IsNullOrWhiteSpace(mkvPath)) { Job.OutputPath = mkvPath; } var token = cancellationToken; var muxPhase = new CriticalPhase(() => Mux(token)); var optionalPhases = new OptionalPhase[] { () => PostProcess(token) }; return(CreateStageTask( token, ConvertStart, muxPhase, optionalPhases, ConvertFail, ConvertSucceed )); }
/// <summary> /// 現局面の盤上、駒台に置いてある駒を 駒の種類別に数え、 /// 片方の対局者の駒台に全部乗れるよう、拡張する。 /// </summary> public static void Tukurinaosi(Kyokumen.Sindanyo kys) { // 盤上 m_banjoKeys_ = new ulong[kys.MASU_YOSOSU, Conv_Koma.Itiran.Length]; for (int iMs = 0; iMs < kys.MASU_YOSOSU; iMs++) { foreach (Komasyurui ks in Conv_Komasyurui.Itiran) { // 対局者1 m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.Black)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); // 対局者2 m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.White)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); } } // 持ち駒 { m_motiKeys_ = new ulong[Conv_MotiKoma.Itiran.Length][]; int[] counts = kys.CountMotikomaHashSize(); foreach (MotiKoma mk in Conv_MotiKoma.Itiran) { MotiKomasyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk); m_motiKeys_[(int)mk] = new ulong[counts[(int)mks]]; for (int iCount = 0; iCount < counts[(int)mks]; iCount++) { m_motiKeys_[(int)mk][iCount] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); } } } // 手番 m_tbTaikyokusya_ = new ulong[Conv_Taikyokusya.AllOptionalPhaseList.Length]; foreach (var optionalPhase78 in Conv_Taikyokusya.AllOptionalPhaseList) { m_tbTaikyokusya_[OptionalPhase.IndexOf(optionalPhase78)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); } Dirty = false; }
public static void InLoop_SeisekiKosin(Move ss_after, Kyokumen ky, StringBuilder syuturyoku) { if (Option_Application.Optionlist.SeisekiRec)// 今回指した手全てに、成績を付けたいぜ☆(^~^) { int teme = ky.Konoteme.ScanNantemadeBango(); if (Util_Taikyoku.PNNantedume_Teme[OptionalPhase.IndexOf(ky.CurrentOptionalPhase)] <= teme) { // 何手詰め、何手詰められ の表記が出て以降の成績を記録するぜ☆(^~^) // 一手前の局面と、指したあとの指し手で成績更新☆(^▽^) Conv_Seiseki.ResultToCount(ky.CurrentOptionalPhase, Util_Application.Result(ky), out int kati, out int hikiwake, out int make); StringBuilder kyMojiretu = new StringBuilder(); ky.AppendFenTo(Option_Application.Optionlist.USI, kyMojiretu); Option_Application.Seiseki.AddMove( kyMojiretu.ToString(), ky.KyokumenHash.Value, ky.CurrentOptionalPhase, ss_after, Util_Application.VERSION, kati, hikiwake, make ); syuturyoku.Append("|"); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } else { syuturyoku.Append("."); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } }//成績の記録☆ }
/// <summary> /// 駒の居場所 /// </summary> /// <param name="syuturyoku"></param> public static void HyojiKomanoIbasho(Shogiban shogiban, StringBuilder syuturyoku) { //IbasyoKomabetuBitboardItiran bb_koma, // KomaZenbuIbasyoBitboardItiran bb_komaZenbu syuturyoku.AppendLine("駒の居場所"); // 駒全部☆ { Setumei_Bitboards(new string[] { "対局者1", "対局者2" }, new Bitboard[] { shogiban.GetBBKomaZenbu(OptionalPhase.Black), shogiban.GetBBKomaZenbu(OptionalPhase.White) }, syuturyoku); syuturyoku.AppendLine(); } foreach (var optionalPhase81 in Conv_Taikyokusya.AllOptionalPhaseList)// 対局者1、対局者2 { // 見出し foreach (Koma km in Conv_Koma.ItiranTai[OptionalPhase.IndexOf(optionalPhase81)]) { syuturyoku.Append(FormatBanWidthZenkaku(Conv_Koma.GetName(km))); } syuturyoku.AppendLine(); // 盤 Bitboard[] bbHairetu = new Bitboard[Conv_Komasyurui.Itiran.Length]; int i = 0; foreach (Komasyurui ks in Conv_Komasyurui.Itiran) { bbHairetu[i] = shogiban.GetBBKoma(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase81)); i++; } Setumei_Bitboards(bbHairetu, syuturyoku); } }
public static void TusinYo(Option <Phase> optionalPhase, StringBuilder syuturyoku) { syuturyoku.Append(Conv_Taikyokusya.m_tusinYo_[OptionalPhase.IndexOf(optionalPhase)]); }
public static string ToFen(bool isSfen, Option <Phase> optionalPhase) { var phaseIndex = OptionalPhase.IndexOf(optionalPhase); return(isSfen ? Conv_Taikyokusya.m_sfen_[phaseIndex] : Conv_Taikyokusya.m_dfen_[phaseIndex]); }
public void Increase(Option <Phase> optionalPhase, Hyokati henkaRyo) { this.KomawariHyokati_Sabun[OptionalPhase.IndexOf(optionalPhase)] += (int)henkaRyo; }
public Hyokati Get(Option <Phase> phase) { return(this.KomawariHyokati_Sabun[OptionalPhase.IndexOf(phase)]); }
public static string[] GetKomasyuruiNamaeItiran(Option <Phase> optionalPhase) { return(komasyuruiNamaeItiran[OptionalPhase.IndexOf(optionalPhase)]); }
public static Koma KomasyuruiAndTaikyokusyaToKoma(Komasyurui ks, Option <Phase> optionalPhase) { return(Med_Koma.m_KomasyuruiAndTaikyokusyaToKoma_[(int)ks, OptionalPhase.IndexOf(optionalPhase)]); }
public Task<bool> CreateConvertTask(CancellationToken cancellationToken, string mkvPath = null) { if (!string.IsNullOrWhiteSpace(mkvPath)) Job.OutputPath = mkvPath; var token = cancellationToken; var muxPhase = new CriticalPhase(() => Mux(token)); var optionalPhases = new OptionalPhase[] { () => PostProcess(token) }; return CreateStageTask( token, ConvertStart, muxPhase, optionalPhases, ConvertFail, ConvertSucceed ); }
public static string GetKomasyuruiNamae(Option <Phase> optionalPhase, Komasyurui ks) { return(komasyuruiNamaeItiran[OptionalPhase.IndexOf(optionalPhase)][(int)ks]); }
public static MotiKoma MotiKomasyuruiAndPhaseToMotiKoma(MotiKomasyurui mks, Option <Phase> phase) { return(m_MotiKomasyuruiAndPhaseToMotiKoma_[(int)mks, OptionalPhase.IndexOf(phase)]); }
public static Koma MotiKomasyuruiAndPhaseToKoma(MotiKomasyurui mks, Option <Phase> optionalPhase) { return(Med_Koma.m_MotiKomasyuruiAndPhaseToKoma_[(int)mks, OptionalPhase.IndexOf(optionalPhase)]); }
public static bool IsOk(Option <Phase> optionalPhase) { var phaseIndex = OptionalPhase.IndexOf(optionalPhase); return((int)Phase.Black <= phaseIndex && phaseIndex <= (int)Phase.White); }
/// <summary> /// トライできる先。 /// </summary> /// <param name="ky">局面</param> /// <param name="kikiBB">手番らいおんの利きビットボード</param> /// <param name="tb">手番</param> /// <param name="ms1">手番らいおんがいる升</param> /// <returns></returns> public static Bitboard GetTrySaki(Kyokumen ky, Bitboard kikiBB, Option <Phase> optionalPhase, Masu ms1, StringBuilder syuturyoku) { var phaseIndex = OptionalPhase.IndexOf(optionalPhase); Util_Test.AppendLine("テスト: トライルール", syuturyoku); m_trySakiBB_.Clear(); // 自分はN段目にいる☆ int dan = Conv_Masu.ToDan_JibunSiten(optionalPhase, ms1, ky.Sindan); bool nidanme = 2 == dan; Util_Test.AppendLine("2段目にいるか☆?[{ nidanme }] わたしは[{ dan }]段目にいるぜ☆", syuturyoku); if (!nidanme) { Util_Test.AppendLine("むりだぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); } // 1段目に移動できる升☆ m_trySakiBB_.Set(kikiBB); m_trySakiBB_.Select(ky.BB_Try[phaseIndex]); Util_Test.TestCode((StringBuilder syuturyoku2) => { Util_Information.Setumei_Bitboards(new string[] { "らいおんの利き", "1段目に移動できる升" }, new Bitboard[] { kikiBB, m_trySakiBB_ }, syuturyoku2); }); // 味方の駒がないところ☆ Bitboard spaceBB = new Bitboard(); spaceBB.Set(ky.BB_BoardArea); spaceBB.Sitdown(ky.Shogiban.GetBBKomaZenbu(optionalPhase)); m_trySakiBB_.Select(spaceBB); Util_Test.TestCode((StringBuilder str) => { Util_Information.Setumei_Bitboards(new string[] { "味方駒無い所", "トライ先" }, new Bitboard[] { spaceBB, m_trySakiBB_ }, str); }); if (m_trySakiBB_.IsEmpty()) { Util_Test.AppendLine("むりだぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); } // 相手の利きが届いていないところ☆ var optionalOpponent2 = Conv_Taikyokusya.Reverse(optionalPhase); Bitboard safeBB = new Bitboard(); safeBB.Set(ky.BB_BoardArea); ky.Shogiban.ToSitdown_BBKikiZenbu(optionalOpponent2, safeBB); m_trySakiBB_.Select(safeBB); Util_Test.TestCode((StringBuilder syuturyoku2) => { Util_Information.Setumei_Bitboards(new string[] { "相手利き無い所", "トライ先" }, new Bitboard[] { safeBB, m_trySakiBB_ }, syuturyoku2); }); if (m_trySakiBB_.IsEmpty()) { Util_Test.AppendLine("むりだぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); } Util_Test.AppendLine("トライできるぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); }