/// <summary> /// 読み筋を返すぜ☆(^~^) /// </summary> /// <param name="sentoNantemade">初期局面からのリンクリストなので、どの「図はn手まで」戻すか☆</param> /// <returns></returns> public void ScanYomisuji(bool isSfen, int sentoNantemade, StringBuilder syuturyoku) { // 先頭(投了、初期局面、図は0手まで)まで戻るぜ☆ Nanteme nanteme = this; for (; null != nanteme.Ittemae; nanteme = nanteme.Ittemae) { } // 先頭から今までの読み筋をつなげるぜ☆(^▽^) int zuhaNantemade = 0; // 図はn手まで for (; null != nanteme;// 一番最後まで回すぜ☆(^▽^) nanteme = nanteme.Ittego) { if (sentoNantemade <= zuhaNantemade) { // 「図はn手まで」の数字 syuturyoku.Append($"({zuhaNantemade})"); ConvMove.AppendFenTo(isSfen, nanteme.Move, syuturyoku); syuturyoku.Append(" "); // おまけ syuturyoku.Append($"{AbstractConvMoveType.Setumei(nanteme.MoveType)} "); } zuhaNantemade++; } }
public void Setumei(bool isSfen, StringBuilder syuturyoku) { // 初期局面を作成 Kyokumen ky2 = new Kyokumen(); int caret = 0; ky2.ParsePositionvalue(isSfen, SyokiKyokumenFen, ref caret, false, false, out string moves, syuturyoku); // 初期局面を出力 syuturyoku.AppendLine("初期局面"); Util_Information.Setumei_NingenGameYo(ky2, syuturyoku); int temeMade = 1; foreach (Move ss in this.SsList) { syuturyoku.Append("("); syuturyoku.Append(temeMade.ToString()); syuturyoku.Append(")"); ConvMove.AppendFenTo(isSfen, ss, syuturyoku); syuturyoku.Append(" "); temeMade++; } syuturyoku.AppendLine(); }
/// <summary> /// 駒を打った指し手☆(^▽^) /// 空き升に打ち込む前提だぜ☆(^~^)! /// </summary> /// <param name="ms_dst"></param> /// <param name="mkUtta"></param> /// <param name="natta"></param> /// <returns></returns> public static Move ToMove01cUtta(Masu ms_dst, MotiKomasyurui mkUtta) { Debug.Assert(MotiKomasyurui.Yososu != mkUtta, ""); // バリュー int v = 0; // 元筋と元段☆(^▽^)「打」のときは何もしないぜ☆(^▽^) // 先筋と先段☆(^▽^) ConvMove.SetDstMasu_WithoutErrorCheck(ref v, ms_dst); //必ず指定されているはず☆ if (MotiKomasyurui.Yososu != mkUtta) { // 変換(列挙型→ビット) // ぞう 0 → 1 // きりん 1 → 2 // ひよこ 2 → 3 // ~中略~ // いのしし 6 → 7 // なし 7 → 0 // 1 足して 8 で割った余り☆ v |= (((int)mkUtta + 1) % Conv_MotiKomasyurui.SETS_LENGTH) << (int)MoveShift.UttaKomasyurui; } // 打ったときは成れないぜ☆(^▽^) return((Move)v); }
public void AppendMovesTo(bool isSfen, StringBuilder syuturyoku) { foreach (Move ss in SsList) { ConvMove.AppendFenTo(isSfen, ss, syuturyoku); syuturyoku.Append(" "); } }
public void Setumei(bool isSfen, StringBuilder syuturyoku) { for (int i = 0; i < this.Size; i++) { ConvMove.AppendFenTo(isSfen, this.SasiteItiran[i], syuturyoku); if (i + 1 < this.Size) { syuturyoku.Append(" "); } } }
public static Move TryFenMove2( bool isSfen, Kyokumen.Sindanyo kys, string str1, string str2, string str3, string str4, string str5 ) { int dstSuji = FenSuji_Int(isSfen, str3); // 至筋 int dstDan = FenDan_Int(isSfen, str4); // 至段 // 取った駒を調べるぜ☆(^▽^) Masu dstMs = Conv_Masu.ToMasu(dstSuji, dstDan); //------------------------------ // 5 //------------------------------ bool natta = false; if ("+" == str5) { // 成りました natta = true; } //------------------------------ // 結果 //------------------------------ if ("*" == str2) { // 駒台から打ったぜ☆ return(ConvMove.ToMove01cUtta( dstMs, Med_Parser.Moji_MotikomaSyurui(isSfen, str1)//打った駒 )); } else { // 盤上の駒を動かしたぜ☆ if (natta) { return(ConvMove.ToMove01bNariSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys)); } else { return(ConvMove.ToMove01aNarazuSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys)); } } }
public static void Setumei(bool isSfen, string header, List <MoveKakucho> sslist, StringBuilder syuturyoku) { syuturyoku.AppendLine(header); syuturyoku.AppendLine("┌──────────┐"); foreach (MoveKakucho ss in sslist) { ConvMove.AppendFenTo(isSfen, ss.Move, syuturyoku); syuturyoku.AppendLine(); } syuturyoku.AppendLine("└──────────┘"); #if DEBUG MoveGenBunseki.Instance.Setumei(syuturyoku); #endif }
/// <summary> /// 定跡更新(ゲームセクション内) /// </summary> public static void Update2_JosekiToroku(Move bestMove, Hyokati bestHyokati, Kyokumen ky, StringBuilder syuturyoku) { if (Util_Machine.IsEnableBoardSize() && Option_Application.Optionlist.JosekiRec) { if (!IsJosekiTraced)// 定跡を使った指し手ではない場合に限り { #if DEBUG // 指し手の整合性をチェックしておきたいぜ☆(^▽^) { Kyokumen ky_forAssert = new Kyokumen(); int caret_2 = 0; if (!ky_forAssert.ParsePositionvalue(Option_Application.Optionlist.USI, KyFen_before, ref caret_2, true, false, out string moves, syuturyoku)) // ビットボードを更新したいので、適用する { syuturyoku.AppendLine("パースに失敗だぜ☆(^~^)! #鯰"); var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); throw new Exception(msg); } if (!ky_forAssert.CanDoMove(bestMove, out MoveMatigaiRiyu riyu)) { StringBuilder reigai1 = new StringBuilder(); reigai1.AppendLine("指せない指し手を定跡に登録しようとしたぜ☆(^~^)!:"); // reigai1.Append("理由:"); ConvMove.SetumeiLine(riyu, reigai1); reigai1.Append("指し手:"); ConvMove.SetumeiLine(Option_Application.Optionlist.USI, bestMove, reigai1); reigai1.Append("定跡にする1手前の局面 ("); reigai1.Append(KyFen_before); reigai1.AppendLine(")"); Util_Information.Setumei_Lines_Kyokumen(ky_forAssert, reigai1); reigai1.AppendLine(); reigai1.Append("1手後は、現局面"); Util_Information.Setumei_Lines_Kyokumen(ky, reigai1); syuturyoku.AppendLine(reigai1.ToString()); var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); throw new Exception(msg); } } #endif Option_Application.Joseki.AddMove(KyFen_before, KyHash_before, OptionalPhaseBeforeMove, bestMove, bestHyokati, Util_Tansaku.NekkoKaranoFukasa, Util_Application.VERSION, syuturyoku); } } }
/// <summary> /// 定跡ファイル /// </summary> /// <returns></returns> public void ToContentsLine_NotUnity(bool isSfen, StringBuilder syuturyoku) { ConvMove.AppendFenTo(isSfen, this.Move, syuturyoku); syuturyoku.Append(" "); if (this.Ousyu == Move.Toryo) { syuturyoku.Append("none");// FIXME: toryo と none の区別に未対応 } else { ConvMove.AppendFenTo(isSfen, this.Ousyu, syuturyoku); } syuturyoku.Append(" "); syuturyoku.Append(((int)this.Hyokati).ToString());// enum型の変数名で出力されないように、int型に変換してから文字列にするぜ☆(^▽^) syuturyoku.Append(" "); syuturyoku.Append(this.Fukasa.ToString()); syuturyoku.Append(" "); syuturyoku.AppendLine(this.Version.ToString()); }
public void ToContents_NotUnity(bool isSfen, StringBuilder syuturyoku) { ConvMove.AppendFenTo(isSfen, Move, syuturyoku); syuturyoku.Append(" "); if (Ousyu == Move.Toryo) { syuturyoku.Append("none");// FIXME: toryo と none の区別に未対応 } else { ConvMove.AppendFenTo(isSfen, Ousyu, syuturyoku); } syuturyoku.Append(" "); syuturyoku.Append(Version.ToString()); syuturyoku.Append(" "); syuturyoku.Append(Kati.ToString()); syuturyoku.Append(" "); syuturyoku.Append(Hikiwake.ToString()); syuturyoku.Append(" "); syuturyoku.AppendLine(Make.ToString()); }
public void TusinYo(bool isSfen, StringBuilder syuturyoku) { // 初期局面を作成 Kyokumen ky2 = new Kyokumen(); int caret = 0; ky2.ParsePositionvalue(isSfen, SyokiKyokumenFen, ref caret, false, false, out string moves, syuturyoku); // 初期局面を出力 syuturyoku.Append("< kifu, 初期局面, "); ky2.TusinYo_Line(isSfen, syuturyoku); syuturyoku.Append("< kifu, move = "); int temeMade = 1; foreach (Move ss in this.SsList) { ConvMove.AppendFenTo(isSfen, ss, syuturyoku); syuturyoku.Append(" "); temeMade++; } syuturyoku.AppendLine(); }
public void Setumei_Description(bool isSfen, StringBuilder syuturyoku) { syuturyoku.Append($"key=[{Key}] move=["); ConvMove.Setumei(isSfen, Move, syuturyoku); syuturyoku.Append($"] sasiteType=[{AbstractConvMoveType.Setumei(MoveType)}] fukasa=[{Fukasa}] hyokati=[{(int)Hyokati}] komawariHyokati_forJoho=[{(int)KomawariHyokati_ForJoho}] nikomaHyokati_forJoho=[{(int)NikomaHyokati_ForJoho}] okimariHyokati_forJoho=[${(int)OkimariHyokati_ForJoho}]"); }
/// <summary> /// 定跡局面の中で、評価値が一番高い指し手を返すぜ☆(^▽^) /// </summary> /// <param name="ky"></param> /// <returns>なければ投了☆</returns> public Move GetMove(bool isSfen, Kyokumen ky, out Hyokati out_bestHyokati, StringBuilder syuturyoku #if DEBUG , out string fen_forTest #endif ) { Move bestMove = Move.Toryo; out_bestHyokati = Hyokati.TumeTesu_GohosyuNasi; int bestFukasa = 0; #if DEBUG fen_forTest = ""; #endif //Util_Machine.Assert_KyokumenSeigosei_SabunKosin("ゲット指し手 #鯨",true); ulong hash = ky.KyokumenHash.Value; if (this.KyItems.ContainsKey(hash)) { JosekiKyokumen josekyKy = this.KyItems[hash]; // 整合性の確認用だぜ☆(^~^) #if DEBUG fen_forTest = josekyKy.Fen; #endif foreach (KeyValuePair <Move, JosekiMove> entry in josekyKy.SsItems) { if (out_bestHyokati < entry.Value.Hyokati)// 評価値が高い指し手を選ぶぜ☆(^▽^) { bestMove = entry.Key; out_bestHyokati = entry.Value.Hyokati; bestFukasa = entry.Value.Fukasa; } else if (out_bestHyokati == entry.Value.Hyokati && //評価値が同じ場合は、 bestFukasa < entry.Value.Fukasa //深く読んでいる指し手を選ぶぜ☆(^▽^) ) { bestMove = entry.Key; out_bestHyokati = entry.Value.Hyokati; bestFukasa = entry.Value.Fukasa; } } } #if DEBUG // 指し手の整合性をチェックしておきたいぜ☆(^▽^) { Kyokumen ky_forAssert = new Kyokumen(); int caret = 0; StringBuilder sindan1 = new StringBuilder(); ky.AppendFenTo(Option_Application.Optionlist.USI, sindan1); //if (!ky2.ParseFen(sindan1.ToString(), ref caret, false, syuturyoku)) if (!ky_forAssert.ParsePositionvalue(isSfen, sindan1.ToString(), ref caret, true, false, out string moves, syuturyoku))// ビットボードを更新したいので、適用する { syuturyoku.AppendLine("取得: パースに失敗だぜ☆(^~^)! #鰯"); var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); throw new Exception(msg); } if (!ky_forAssert.CanDoMove(bestMove, out MoveMatigaiRiyu riyu)) { StringBuilder sindan2 = new StringBuilder(); sindan2.Append("取得: 指せない指し手を定跡から取り出そうとしたぜ☆(^~^)!:"); // sindan2.Append("理由:"); ConvMove.SetumeiLine(riyu,sindan2); sindan2.Append("指し手:"); ConvMove.SetumeiLine(isSfen, bestMove, sindan2); sindan2.Append("定跡局面 ("); ky_forAssert.AppendFenTo(Option_Application.Optionlist.USI, sindan2); sindan2.AppendLine(")"); Util_Information.Setumei_Lines_Kyokumen(ky_forAssert, sindan2); //str2.AppendLine("以下、定跡メモリのダンプ"); //str2.AppendLine("┌──────────┐"); //str2.Append(this.ToString()); //str2.AppendLine("└──────────┘"); syuturyoku.AppendLine(sindan2.ToString()); var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); throw new Exception(sindan2.ToString()); } } #endif return(bestMove); }
public static bool IsUtta(Move ss) { // 打か☆? return(MotiKomasyurui.Yososu != ConvMove.GetUttaKomasyurui(ss));//指定があれば }