/// <summary> /// "1" を 対局者1、 "2" を 対局者2 にするぜ☆(^~^) /// </summary> /// <param name="moji1"></param> /// <returns></returns> public static bool Try_MojiToTaikyokusya(FenSyurui f, string moji1, out Taikyokusya out_tai) { switch (f) { case FenSyurui.sfe_n: { switch (moji1) { case "b": out_tai = Taikyokusya.T1; return(true); case "w": out_tai = Taikyokusya.T2; return(true); default: out_tai = Taikyokusya.Yososu; return(false); } } case FenSyurui.dfe_n: { switch (moji1) { case "1": out_tai = Taikyokusya.T1; return(true); case "2": out_tai = Taikyokusya.T2; return(true); default: out_tai = Taikyokusya.Yososu; return(false); } } default: throw new Exception(string.Format("未定義 {0}", f)); } }
/// <summary> /// 移動元の盤の升に、手番の駒を戻すぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_Tejun2Sasu_IdomotoniTebannoKomawoModosu( #if DEBUG FenSyurui dbg_f , IDebugMojiretu dbg_reigai #endif ) { //──────────────────────────────────────── // T0 [1] 移動元に 駒 が無い //──────────────────────────────────────── //──────────────────────────────────────── // T0 [遷移] 移動元に 駒 が現れる☆ //──────────────────────────────────────── { // ハッシュを差分更新 if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(// 手順2 移動元に手番の駒を戻す PureMemory.umv_ms_t0, PureMemory.umv_km_t0, true #if DEBUG , dbg_reigai #endif )) { return(Pure.FailTrue("undo-tj2s gky.ky.shogiban.Try_Oku")); } // TODO: 駒割り評価値を増やすならここだぜ☆(^~^) } //──────────────────────────────────────── // T0 [2] 移動元に 駒 が在る //──────────────────────────────────────── return(Pure.SUCCESSFUL_FALSE); }
/// <summary> /// 升パターン /// </summary> /// <param name="isSfen"></param> /// <returns></returns> public static Regex GetMasuPattern(FenSyurui f) { switch (f) { case FenSyurui.sfe_n: { if (null == masPattern_sfen_) { masPattern_sfen_ = new Regex( $@"([{ Sfen.suji }])([{ Sfen.dan }])" , RegexOptions.Compiled ); } return(masPattern_sfen_); } case FenSyurui.dfe_n: { if (null == masPattern_dfen_) { masPattern_dfen_ = new Regex( $@"([{ Dfen.suji }])([{ Dfen.dan }])" , RegexOptions.Compiled ); } return(masPattern_dfen_); } default: throw new Exception($"未定義 {f}"); } }
public static Regex GetKyokumenPattern(FenSyurui f) { switch (f) { case FenSyurui.sfe_n: { if (null == kyokumenPattern_sfen_) { kyokumenPattern_sfen_ = new Regex( Sfen.position + // とりあえず ごっそりマッチ。123~はスペース数。+は成りゴマ。 "(?: (moves.*))?" //棋譜 , RegexOptions.Compiled ); } return(kyokumenPattern_sfen_); } case FenSyurui.dfe_n: { if (null == kyokumenPattern_dfen_) { kyokumenPattern_dfen_ = new Regex( Dfen.position + // とりあえず ごっそりマッチ。123~はスペース数。+は成りゴマ。 "(?: (moves.*))?" //棋譜 , RegexOptions.Compiled ); } return(kyokumenPattern_dfen_); } default: throw new Exception(string.Format("未定義 {0}", f)); } }
///// <summary> ///// FIXME:分解したい ///// </summary> ///// <param name="isSfen"></param> ///// <returns></returns> //public static Regex GetKikiCommandPattern(bool isSfen) //{ // if (isSfen) // { // if (null == kikiCommandPattern_sfen_) // { // // kiki B3 R 1 : 升と、駒の種類と、手番を指定すると、利きを表示するぜ☆(^▽^) // kikiCommandPattern_sfen_ = new Regex( // $@"([{ Sfen.suji }])([{ Sfen.dan }\*])\s+([{ Sfen.motigomaT1 }{ Sfen.motigomaT2 }])\s+{Sfen.tebanPos}" // , RegexOptions.Compiled // ); // } // return kikiCommandPattern_sfen_; // } // else // { // if (null == kikiCommandPattern_dfen_) // { // // kiki B3 R 1 : 升と、駒の種類と、手番を指定すると、利きを表示するぜ☆(^▽^) // kikiCommandPattern_dfen_ = new Regex( // $@"([{ Sfen.suji }])([{ Sfen.dan }\*])\s+([{ Sfen.motigomaT1 }{ Sfen.motigomaT2 }])\s+{ Sfen.tebanPos}" // , RegexOptions.Compiled // ); // } // return kikiCommandPattern_dfen_; // } //} //static Regex kikiCommandPattern_sfen_; //static Regex kikiCommandPattern_dfen_; #region 移動元升 /// <summary> /// 「打ち」に対応するために、「K*」等も読み込めるようにしてあるぜ☆(^~^) /// </summary> /// <param name="isSfen"></param> /// <returns></returns> static Regex GetSrcMsPattern(FenSyurui f) { switch (f) { case FenSyurui.sfe_n: if (null == srcMs_sfen_) { // 例「K」「K*」 srcMs_sfen_ = new Regex( $@"([{ Sfen.komasyuruiT1 }{ Sfen.suji }][{ Sfen.dan }\*])" //\s* , RegexOptions.Compiled ); } return(srcMs_sfen_); case FenSyurui.dfe_n: { if (null == srcMs_dfen_) { // 例「R」「R*」 srcMs_dfen_ = new Regex( $@"([{ Dfen.komasyuruiT1 }{ Dfen.suji }][{ Dfen.dan }\*])" //\s* , RegexOptions.Compiled ); } return(srcMs_dfen_); } default: throw new Exception(string.Format("未定義 {0}", f)); } }
public static bool Try_DoMove_Input(Move ss #if DEBUG , FenSyurui f , IDebugMojiretu dbg_reigai #endif ) { MoveType ssType = MoveType.N00_Karappo; if (DoMoveOpe.TryFailDoMoveAll(ss, ssType #if DEBUG , f , dbg_reigai , false , "Try_DoMove_Input" #endif )) { return(false); } // 手番を進めるぜ☆(^~^) MoveGenAccessor.AddKifu(ss, ssType, PureMemory.dmv_ks_c); //#if DEBUG // Util_Tansaku.Snapshot("Try_DoMove_Input", dbg_reigai); //#endif return(true); }
static Regex GetTaikyokusyaPattern(FenSyurui f) { switch (f) { case FenSyurui.sfe_n: { if (null == taikyokusya_sfen_) { // 例「K」 taikyokusya_sfen_ = new Regex( $@"([{ Sfen.tebanPos }])" , RegexOptions.Compiled ); } return(taikyokusya_sfen_); } case FenSyurui.dfe_n: { if (null == taikyokusya_dfen_) { // 例「R」 taikyokusya_dfen_ = new Regex( $@"([{ Dfen.tebanPos }])" , RegexOptions.Compiled ); } return(taikyokusya_dfen_); } default: throw new Exception(string.Format("未定義 {0}", f)); } }
public static string ToString_Fen(FenSyurui f, Move ss) { StringBuilder hyoji = new StringBuilder(); AppendFenTo(f, ss, hyoji); return(hyoji.ToString()); }
/// <summary> /// 移動元の盤の升に、手番の駒を戻すぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_Tejun2Utu_IdomotoniTebannoKomawoModosu( #if DEBUG FenSyurui dbg_f , IDebugMojiretu dbg_reigai #endif ) { //──────────────────────────────────────── // T0 [1] 移動元に 駒 が無い //──────────────────────────────────────── //──────────────────────────────────────── // T0 [遷移] 移動元に 駒 が現れる☆ //──────────────────────────────────────── { // 今の駒台の駒数は消える ※駒台だけ、このステップが多い PureMemory.gky_ky.motigomaItiran.Fuyasu(PureMemory.umv_mk_t0); // TODO: 駒割り評価値を増やすならここだぜ☆(^~^) } //──────────────────────────────────────── // T0 [2] 移動元に 駒 が在る //──────────────────────────────────────── return(Pure.SUCCESSFUL_FALSE); }
public static void AppendMovesTo(FenSyurui f, StringBuilder syuturyoku) { ScanKifu_0ToPreTeme((int iKifu, ref bool toBreak) => { Move ss = PureMemory.kifu_moveArray[iKifu]; SpkMove.AppendFenTo(f, ss, syuturyoku); syuturyoku.Append(" "); }); }
/// <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); }
/// <summary> /// 持ち駒の種類 /// </summary> /// <param name="moji">改造Fen</param> /// <returns></returns> public static MotigomaSyurui MojiToMotikomaSyurui(FenSyurui f, string moji) { switch (f) { case FenSyurui.sfe_n: { switch (moji) { case "B": return(MotigomaSyurui.Z); case "R": return(MotigomaSyurui.K); case "P": return(MotigomaSyurui.H); case "G": return(MotigomaSyurui.I); case "S": return(MotigomaSyurui.Neko); case "N": return(MotigomaSyurui.U); case "L": return(MotigomaSyurui.S); default: return(MotigomaSyurui.Yososu); } } case FenSyurui.dfe_n: { switch (moji) { case "Z": return(MotigomaSyurui.Z); case "K": return(MotigomaSyurui.K); case "H": return(MotigomaSyurui.H); case "I": return(MotigomaSyurui.I); case "N": return(MotigomaSyurui.Neko); case "U": return(MotigomaSyurui.U); case "S": return(MotigomaSyurui.S); default: return(MotigomaSyurui.Yososu); } } default: throw new Exception(string.Format("未定義 {0}", f)); } }
public static Move TryFenMove2( FenSyurui f, string str1, string str2, string str3, string str4, string str5 ) { int dstSuji = LisInt.FenSuji_Int(f, str3); // 至筋 int dstDan = LisInt.FenDan_Int(f, str4); // 至段 // 取った駒を調べるぜ☆(^▽^) Masu dstMs = Conv_Masu.ToMasu(dstSuji, dstDan); //------------------------------ // 5 //------------------------------ bool natta = false; if ("+" == str5) { // 成りました natta = true; } //------------------------------ // 結果 //------------------------------ if ("*" == str2) { // 駒台から打ったぜ☆ return(AbstractConvMove.ToMove01cUtta( dstMs, Med_Parser.MojiToMotikomaSyurui(f, str1)//打った駒 )); } else { // 盤上の駒を動かしたぜ☆ if (natta) { return(AbstractConvMove.ToMove01bNariSasi(Med_Parser.FenSujiDan_Masu(f, str1, str2), dstMs)); } else { return(AbstractConvMove.ToMove01aNarazuSasi(Med_Parser.FenSujiDan_Masu(f, str1, str2), dstMs)); } } }
/// <summary> /// /// </summary> /// <param name="line">B4B3、または toryo といった文字列を含む行☆</param> /// <param name="caret">文字カーソルの位置</param> /// <param name="ky">取られた駒を調べるために使う☆</param> /// <param name="out_move"></param> /// <returns></returns> public static bool MatchFenMove( FenSyurui f, string line, ref int caret, out Move out_move ) { if (Util_String.MatchAndNext(Itiran_FenParser.GetToryo(f), line, ref caret)) { out_move = Move.Toryo; return(true); } // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。 Match m = Itiran_FenParser.GetMovePattern(f).Match(line, caret); if (!m.Success) { //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆ //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]"; //Util_Machine.AppendLine(msg); //Util_Machine.Flush(); //throw new Exception(msg); out_move = Move.Toryo; return(false); } // m.Groups[1].Value : ABCabc か、 ZKH // m.Groups[2].Value : 1234 か、 * // m.Groups[3].Value : ABCabc // m.Groups[4].Value : 1234 // m.Groups[5].Value : + // カーソルを進めるぜ☆(^~^) Util_String.SkipMatch(line, ref caret, m); // 符号1「B4B3」を元に、move を作ります。 out_move = TryFenMove2( f, m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value, m.Groups[5].Value ); Debug.Assert((int)out_move != -1, ""); return(true); }
/// <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> public void ShowPrompt(Playing playing, FenSyurui f, StringBuilder hyoji) { if (0 < playing.commandBuffer.Count) { // コマンド・バッファーの実行中だぜ☆(^▽^) hyoji.Append($"{playing.commandBufferName }> "); Logger.Flush(hyoji); } else if (GameMode.Game == PureAppli.gameMode) { // 表示(コンソール・ゲーム用) 局面、あれば勝敗☆(^~^) { if (this.isKyokumenEcho1) { SpkBan_1Column.Setumei_NingenGameYo(PureMemory.kifu_endTeme, hyoji); //#if DEBUG // CommandK.Ky(isSfen, "ky fen", gky, syuturyoku);// 参考:改造FEN表示 // CommandS.Move_cmd(isSfen, "move", gky, syuturyoku);// 参考:指し手表示 // if (false){ // SpkShogiban.HyojiKomanoIbasho(gky.ky.shogiban, syuturyoku);// 参考:駒の表示 // SpkShogiban.HyojiKomanoKikiSu(gky.ky.shogiban, syuturyoku);// 参考:利きの数 // } // CommandS.Move_cmd(isSfen, "move seisei", gky, syuturyoku);// 参考:指し手表示 詳細 // Util_Machine.Flush(syuturyoku); //#endif playing.Result(hyoji, CommandMode.NingenYoConsoleGame); } Logger.Flush(hyoji); } if (!playing.isMultipleLineCommand // 複数行コマンド読み取り中はプロンプトを出さないぜ☆(^~^) && (PureMemory.kifu_teban == Taikyokusya.T1 && !PureSettei.p1Com) || (PureMemory.kifu_teban == Taikyokusya.T2 && !PureSettei.p2Com) ) { // 人間の手番が始まるところで☆ hyoji.Append(@"指し手を入力してください。一例 do B3B2 ※ do b3b2 も同じ > "); Logger.Flush(hyoji); } } else { // 表示(コンソール・ゲーム用) hyoji.Append("> "); Logger.Flush(hyoji); } }
public static void Setumei(FenSyurui f, string header, MoveList sslist, StringBuilder hyoji) { hyoji.AppendLine(header); hyoji.AppendLine("┌──────────┐"); for (int i = 0; i < sslist.listCount; i++) { SpkMove.AppendFenTo(f, sslist.moveList[i], hyoji); hyoji.AppendLine(); } hyoji.AppendLine("└──────────┘"); #if DEBUG hyoji.AppendLine($"指し手生成を抜けた場所:{ PureMemory.ssss_movePickerWoNuketaBasho1}"); #endif }
/// <summary> /// 指定の手目まで進めるぜ☆(^~^) /// </summary> /// <param name="temeMade"></param> /// <param name="ky2"></param> /// <param name="hyoji"></param> public static bool Try_GoToTememade(FenSyurui f, int temeMade, StringBuilder hyoji) { // 棋譜を元に、局面データを再現するぜ☆ int caret = 0; string moves_notUse; // 初期局面のセット☆(^~^) if (LisGenkyoku.TryFail_MatchPositionvalue(f, PureMemory.kifu_syokiKyokumenFen, ref caret, out moves_notUse #if DEBUG , (IDebugMojiretu)hyoji #endif )) { return(false); } // 指定の手目まで進めるぜ☆(^~^) MoveGenAccessor.ScanKifu_0ToPreTeme((int iKifu, ref bool toBreak) => { Move ss = PureMemory.kifu_moveArray[iKifu]; if (temeMade < iKifu) { toBreak = true; return; } MoveType ssType = MoveType.N00_Karappo; if (DoMoveOpe.TryFailDoMoveAll(ss, ssType #if DEBUG , f , (IDebugMojiretu)hyoji , false , "Try_GoToTememade" #endif )) { toBreak = true; return; } // 手番を進めるぜ☆(^~^) MoveGenAccessor.AddKifu(ss, ssType, PureMemory.dmv_ks_c); //#if DEBUG // Util_Tansaku.Snapshot("GoToTememade", (IDebugMojiretu)hyoji); //#endif temeMade--; }); return(true); }
/// <summary> /// 改造Fen用の文字列を返すぜ☆(^▽^) /// </summary> /// <param name="ks"></param> /// <returns></returns> public static void AppendFenTo(FenSyurui f, MotigomaSyurui mks, StringBuilder syuturyoku) { switch (f) { case FenSyurui.sfe_n: syuturyoku.Append(Conv_MotigomaSyurui.m_sfen_[(int)mks]); break; case FenSyurui.dfe_n: syuturyoku.Append(Conv_MotigomaSyurui.m_dfen_[(int)mks]); break; default: throw new Exception(string.Format("未定義 {0}", f)); } }
/// <summary> /// 取った駒を、駒台に置くぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_DaiOn( Piece km_c,// あれば、移動先の相手の駒(取られる駒; capture) Komasyurui ks_c, Motigoma mk_c #if DEBUG , FenSyurui f , IDebugMojiretu dbg_reigai #endif ) { //──────────────────────────────────────── // 状況: // 移動先に駒があれば……。 //──────────────────────────────────────── #region 駒を取る if (km_c != Piece.Kuhaku) { // 駒取るぜ☆(^▽^)! // ただし、らいおんを除く if (ks_c != Komasyurui.R) // らいおん を取っても、持駒は増えないぜ☆ { //──────────────────────────────────────── // C [1] 取る前の 持ち駒が増える前の 駒台が在る //──────────────────────────────────────── //──────────────────────────────────────── // C [遷移] 取った持ち駒を増やす //──────────────────────────────────────── // 取る前の持ち駒をリカウントする // 増やす PureMemory.gky_ky.motigomaItiran.Fuyasu(mk_c); // TODO: 駒割りを増やすならここだぜ☆(^~^) //──────────────────────────────────────── // C [3] 取った後の 持駒が1つ増えた 駒台が在る //──────────────────────────────────────── } } #endregion return(Pure.SUCCESSFUL_FALSE); }
/// <summary> /// 通信用 /// fen(盤上の駒配置、持ち駒の数、手番の対局者) 何手目 同形反復の回数 /// </summary> /// <param name="syuturyoku"></param> public static void TusinYo_Line(FenSyurui f, StringBuilder syuturyoku) { // まず、fen を返すぜ☆(^▽^) // 盤上の駒配置、持ち駒の数、手番の対局者☆ SpkGenkyokuOpe.AppendFenTo(f, syuturyoku); // 次は空白☆(^~^) syuturyoku.Append(" "); // 何手目かは 1 固定☆(^▽^) syuturyoku.Append("1"); // 次は空白☆(^~^) syuturyoku.Append(" "); // #仲ルール かどうかは出さないぜ☆(^▽^) syuturyoku.AppendLine(); }
/// <summary> /// 駒台から、取った駒を除外するぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_Tejun3_KomadaiKaraTottakomawoJogai( #if DEBUG FenSyurui dbg_f , IDebugMojiretu dbg_reigai #endif ) { if (Komasyurui.Yososu != PureMemory.umv_ks_c) { //------------------------------------------------------------ // 取った駒を戻す //------------------------------------------------------------ if (PureMemory.umv_ks_c != Komasyurui.R)// らいおん を盤に戻しても、持駒の数は変わらないぜ☆(^▽^) { //──────────────────────────────────────── // C [1] 取ったあとの 持駒の数 の駒台が在る //──────────────────────────────────────── //──────────────────────────────────────── // C [遷移] 取った 持駒 を除外する //──────────────────────────────────────── // 消して // 増やす MotigomaItiran motiKomaItiranImpl; if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, PureMemory.umv_mk_c #if DEBUG , (IDebugMojiretu)dbg_reigai #endif )) { return(Pure.FailTrue("Try_Herasu")); } // TODO: 駒割り評価値を減らすならここだぜ☆(^~^) //──────────────────────────────────────── // C [2] 戻したあとの 持駒の数 の駒台が在る //──────────────────────────────────────── } } return(Pure.SUCCESSFUL_FALSE); }
/// <summary> /// 改造Fen用の文字列を返すぜ☆(^▽^) /// </summary> /// <param name="ks"></param> /// <returns></returns> public static string ToFen(FenSyurui f, Komasyurui ks) { switch (f) { case FenSyurui.sfe_n: { return(Conv_Komasyurui.m_sfen_[(int)ks]); } case FenSyurui.dfe_n: { return(Conv_Komasyurui.m_dfen_[(int)ks]); } default: throw new Exception(string.Format("未定義 {0}", f)); } }
/// <summary> /// 移動元の自分の駒台から、駒を取るぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_DaiOff( Masu ms_t0, Piece km_t0, Motigoma mk_t0, Masu ms_t1 // 移動先升 #if DEBUG , FenSyurui f , IDebugMojiretu dbg_reigai #endif ) { //──────────────────────────────────────── // T1 [1] 移動元に 手番の駒 が在る //──────────────────────────────────────── //──────────────────────────────────────── // T1 [遷移] 移動元の 手番の駒 を除外する //──────────────────────────────────────── { MotigomaItiran motiKomaItiranImpl; if (!PureMemory.gky_ky.motigomaItiran.Try_Herasu(out motiKomaItiranImpl, mk_t0 #if DEBUG , (IDebugMojiretu)dbg_reigai #endif )) { return(Pure.FailTrue("do-tj3u gky.ky.motiKomas.Try_Herasu")); } // TODO: 駒割り評価値を減らすならここだぜ☆(^~^) // 駒台はこのステップが1つ多い } //DoMove1( isSfen, ss, ssType, ref konoTeme, syuturyoku, out gt_EndMethod); //──────────────────────────────────────── // T1 [2] 移動元に 手番の駒 が無い //──────────────────────────────────────── 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); }
public static void Setumei(FenSyurui f, StringBuilder hyoji) { bool isBelow = false; MoveGenAccessor.ScanBestYomisuji((int iKifu, ref bool toBreak) => { if (isBelow) { // 2週目以降は空白を挟むぜ☆(^~^) hyoji.Append(" "); } else { isBelow = true; } SpkMove.AppendFenTo(f, PureMemory.kifu_moveArray[iKifu], hyoji); }); }
public static Motigoma Yomu_Motikoma(FenSyurui f, string line, ref int caret, ref bool sippai, StringBuilder hyoji) { if (sippai) { hyoji.AppendLine("failure 持ち駒"); return(Motigoma.Yososu); } foreach (Motigoma mk in Conv_Motigoma.itiran) { if (Util_String.MatchAndNext(SpkMotiKoma.GetFen(f, mk), line, ref caret)) { return(mk); } } sippai = true; hyoji.AppendLine("failure 持ち駒"); return(Motigoma.Yososu); }
/// <summary> /// 段 /// </summary> /// <param name="f"></param> /// <param name="suji"></param> /// <returns></returns> public static int FenDan_Int(FenSyurui f, string dan) { switch (f) { case FenSyurui.sfe_n: return(Conv_Kihon.AlphabetToInt(dan)); case FenSyurui.dfe_n: { int iDan; if (!int.TryParse(dan, out iDan)) { throw new Exception($"パース失敗 dan=[{ dan }]"); } return(iDan); } default: throw new Exception(string.Format("未定義 {0}", f)); } }
/// <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> /// 棋譜に沿って、終局図まで進めるぜ☆(^~^) /// 局面は初期局面に設定し、「手目」は0に戻してあるものとするぜ☆(^~^) /// </summary> /// <param name="ky2"></param> /// <param name="hyoji"></param> public static bool Try_PlayMoves_0ToPreTeme(FenSyurui f, StringBuilder hyoji) { // 棋譜を元に、局面データを再現するぜ☆ MoveGenAccessor.ScanMoves_0ToPreTeme((int iTeme, ref bool toBreak) => { Move ss = PureMemory.mvs_ssAr[iTeme]; #if DEBUG hyoji.AppendLine(string.Format("[{0}] 指すぜ☆(^~^) ss={1}", iTeme, SpkMove.ToString_Fen(PureSettei.fenSyurui, ss) )); int a = 0; #endif if (DoMoveOpe.TryFailDoMoveAll( ss, MoveType.N00_Karappo #if DEBUG , f , (IDebugMojiretu)hyoji , false , "Try_GoToFinish" #endif )) { toBreak = true; return; } MoveGenAccessor.AddKifu(ss, MoveType.N00_Karappo, PureMemory.dmv_ks_c); #if DEBUG // 局面表示☆ Interproject.project.HyojiKyokumen(iTeme, hyoji); // 駒の居場所表示☆ Interproject.project.HyojiIbasho("Try_PlayMoves_0ToPreTeme", hyoji); #endif }); return(true); }