/// <summary> /// 下側に自分の陣地がある視点の段番号だぜ☆(^▽^) /// 例:対局者1でも2でも、トライルールは らいおん が1段目に入ったときだぜ☆(^▽^) /// </summary> /// <param name="ms"></param> /// <returns></returns> public static int ToDan_JibunSiten(Option <Phase> optionalPhase, Masu ms, Kyokumen.Sindanyo kys) { var phase = optionalPhase.Unwrap(); if (phase == Phase.Black) { return(Conv_Masu.ToDan_WithoutErrorCheck((int)ms)); } return(Conv_Masu.ToDan_WithoutErrorCheck(kys.MASU_YOSOSU - 1 - (int)ms)); }
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)); } } }
/// <summary> /// 2017-04-19 作成 /// </summary> /// <param name="commandline"></param> /// <param name="caret"></param> /// <param name="out_ms"></param> /// <returns></returns> public static bool TryParseMs(bool isSfen, string commandline, Kyokumen ky, ref int caret, out Masu out_ms) { Match m = Itiran_FenParser.GetMasuPattern(isSfen).Match(commandline, caret); if (m.Success) { Util_String.SkipMatch(commandline, ref caret, m); int suji = FenSuji_Int(isSfen, m.Groups[1].Value); int dan = FenDan_Int(isSfen, m.Groups[2].Value); out_ms = Conv_Masu.ToMasu(suji, dan); return(true); } else { out_ms = ky.MASU_ERROR; return(false); } }
/// <summary> /// A1 を 0 に。 /// </summary> /// <param name="isSfen"></param> /// <param name="suji"></param> /// <param name="dan"></param> /// <returns></returns> public static Masu FenSujiDan_Masu(bool isSfen, string suji, string dan) { return(Conv_Masu.ToMasu(FenSuji_Int(isSfen, suji), FenDan_Int(isSfen, dan))); }
/// <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_); }
public static int GetDstDan_WithoutErrorCheck(int ss) { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト return(Conv_Masu.ToDan_WithoutErrorCheck((int)GetDstMasu_WithoutErrorCheck(ss))); // if (Move.Toryo == ss) { return Conv_Masu.ERROR_DAN; } // 解析不能☆ }
public static int GetDstSuji_WithoutErrorCheck(int ss) { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト return(Conv_Masu.ToSuji_WithoutErrorCheck((int)GetDstMasu_WithoutErrorCheck(ss))); // if (Move.Toryo == ss) { return Conv_Masu.ERROR_SUJI; } // エラーチェック付き }
public static int GetSrcDan_WithoutErrorCheck(int ss) { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト return(Conv_Masu.ToDan_WithoutErrorCheck((int)GetSrcMasu_WithoutErrorCheck(ss))); // if (Move.Toryo == ss || ConvMove.IsUtta(ss)) { return Conv_Masu.ERROR_DAN; } // エラーチェック付き }