/// <summary> /// ************************************************************************************************************************ /// 1マス上、のように指定して、マスを取得します。 /// ************************************************************************************************************************ /// </summary> /// <param name="offsetSuji"></param> /// <param name="offsetDan"></param> /// <returns></returns> public static SyElement Offset(Okiba okiba, SyElement masu, int offsetSuji, int offsetDan) { int suji; int dan; Util_MasuNum.MasuToSuji(masu, out suji); Util_MasuNum.MasuToDan(masu, out dan); return(Util_Masu.OkibaSujiDanToMasu( okiba, suji + offsetSuji, dan + offsetDan )); }
/// <summary> /// ************************************************************************************************************************ /// 1マス上、のように指定して、マスを取得します。 /// ************************************************************************************************************************ /// </summary> /// <param name="offsetSuji"></param> /// <param name="offsetDan"></param> /// <returns></returns> public static SyElement Offset(Okiba okiba, SyElement masu, Playerside pside, Hogaku muki) { int offsetSuji; int offsetDan; Util_Muki.MukiToOffsetSujiDan(muki, pside, out offsetSuji, out offsetDan); int suji; int dan; Util_MasuNum.MasuToSuji(masu, out suji); Util_MasuNum.MasuToDan(masu, out dan); return(Util_Masu.OkibaSujiDanToMasu( okiba, suji + offsetSuji, dan + offsetDan)); }
/// <summary> /// ロードした内容を確認するときに使います。 /// </summary> /// <returns></returns> public static string LogHtml() { StringBuilder sb = new StringBuilder(); sb.AppendLine("<html>"); sb.AppendLine("<head>"); sb.AppendLine(" <title>強制転成表</title>"); sb.AppendLine(" <style type=\"text/css\">"); sb.AppendLine(" /* 将棋盤 */"); sb.AppendLine(" table{"); sb.AppendLine(" border-collapse:collapse;"); sb.AppendLine(" border:2px #2b2b2b solid;"); sb.AppendLine(" }"); sb.AppendLine(" td{"); sb.AppendLine(" border:1px #2b2b2b solid;"); sb.AppendLine(" background-color:#ffcc55;"); sb.AppendLine(" width:48px; height:48px;"); sb.AppendLine(" }"); sb.AppendLine(" </style>"); sb.AppendLine("</head>"); sb.AppendLine("<body>"); foreach (KeyValuePair <Kh185, Dictionary <int, Kh185> > entry1 in ForcePromotionArray.HaiyakuMap) { sb.Append("<h1>"); sb.Append(entry1.Key); sb.AppendLine("</h1>"); sb.Append("<table>"); // 9一~1一、9二~1二、…9九~1九の順だぜ☆ for (int dan = 1; dan <= 9; dan++) { sb.AppendLine("<tr>"); sb.Append(" "); for (int suji = 9; suji >= 1; suji--) { SyElement masu = Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan); sb.Append("<td>"); if (entry1.Value.ContainsKey(Util_Masu.AsMasuNumber(masu))) { // 強制転成が起こるマスなら、画像を出します。 Kh185 kh184 = entry1.Value[Util_Masu.AsMasuNumber(masu)]; int haiyakuHandle = (int)kh184; sb.Append("<img src=\"../Profile/Data/img/train"); if (haiyakuHandle < 10) { sb.Append("00"); } else if (haiyakuHandle < 100) { sb.Append("0"); } sb.Append(haiyakuHandle); sb.Append(".png\" />"); } sb.Append("</td>"); } sb.AppendLine(); sb.AppendLine("</tr>"); } sb.AppendLine("</table>"); } sb.AppendLine("</body>"); sb.AppendLine("</html>"); return(sb.ToString()); }
/// <summary> /// 次の1手データを作ります(*1) /// /// *1…符号1「▲68銀上」を元に、「7968」を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ExecuteJfugo_FromTextSub( string strPside, //▲△ string strSuji, //123…9、123…9、一二三…九 string strDan, //123…9、123…9、一二三…九 string strDou, // “同” string strSrcSyurui, //(歩|香|桂|… string strMigiHidari, // 右|左… string strAgaruHiku, // 上|引 string strNariNarazu, //成|不成 string strDaHyoji, //打 out ShootingStarlightable move, KifuTree kifu ) { Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode; SkyConst src_Sky = siteiNode.Value.ToKyokumenConst; //------------------------------ // 符号確定 //------------------------------ MigiHidari migiHidari = Converter04.Str_ToMigiHidari(strMigiHidari); AgaruHiku agaruHiku = Converter04.Str_ToAgaruHiku(strAgaruHiku); // 上|引 NariNarazu nariNarazu = Converter04.Nari_ToBool(strNariNarazu); //成 DaHyoji daHyoji = Converter04.Str_ToDaHyoji(strDaHyoji); //打 PieceType srcSyurui = Converter04.Str_ToSyurui(strSrcSyurui); //------------------------------ // //------------------------------ Playerside pside = Converter04.Pside_ToEnum(strPside); SyElement dstMasu; if ("同" == strDou) { // 1手前の筋、段を求めるのに使います。 RO_Star_Koma koma = Util_Koma.AsKoma(siteiNode.Key.Now); dstMasu = koma.Masu; } else { dstMasu = Util_Masu.OkibaSujiDanToMasu( Okiba.ShogiBan, ConverterKnSh.Suji_ToInt(strSuji), ConverterKnSh.Suji_ToInt(strDan) ); } // TODO: 駒台にあるかもしれない。 Okiba srcOkiba1 = Okiba.ShogiBan; //Okiba.FUMEI_FUGO_YOMI_CHOKUGO;// Okiba.SHOGIBAN; if (DaHyoji.Visible == daHyoji) { if (Playerside.P2 == pside) { srcOkiba1 = Okiba.Gote_Komadai; } else { srcOkiba1 = Okiba.Sente_Komadai; } } // SyElement dst1 = dstMasu; Finger foundKoma = Fingers.Error_1; //---------- // 駒台の駒を(明示的に)打つなら //---------- bool utsu = false;//駒台の駒を打つなら真 if (DaHyoji.Visible == daHyoji) { utsu = true; goto gt_EndShogiban; } if (PieceType.P == srcSyurui) { //************************************************************ // 歩 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│ │ │ │ //├─┼─┼─┤ //│ │至│ │ //├─┼─┼─┤ //│ │E│ │ //└─┴─┴─┘ bool isE = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } } else if (PieceType.R == srcSyurui) { #region 飛 //************************************************************ // 飛 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │ │ │ │ │ │ │ │ │A7│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A0│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E0│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E7│ │ │ │ │ │ │ │ │ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isA = true; bool isC = true; bool isE = true; bool isG = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isE = false; break; case AgaruHiku.Agaru: isA = false; isC = false; isG = false; break; case AgaruHiku.Hiku: isC = false; isE = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isG = false; break; case MigiHidari.Hidari: isA = false; isC = false; isE = false; break; case MigiHidari.Sugu: isA = false; isC = false; isG = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.B == srcSyurui) { #region 角 //************************************************************ // 角 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │H7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │B7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │H6│ │ │ │ │ │ │ │ │ │ │ │ │ │B6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │H5│ │ │ │ │ │ │ │ │ │ │ │B5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │H4│ │ │ │ │ │ │ │ │ │B4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │H3│ │ │ │ │ │ │ │B3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │H2│ │ │ │ │ │B2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │H1│ │ │ │B1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │H0│ │B0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │至│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │F0│ │D0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │F1│ │ │ │D1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │F2│ │ │ │ │ │D2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │F3│ │ │ │ │ │ │ │D3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │F4│ │ │ │ │ │ │ │ │ │D4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │F5│ │ │ │ │ │ │ │ │ │ │ │D5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │F6│ │ │ │ │ │ │ │ │ │ │ │ │ │D6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │F7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │D7│ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isB = true; bool isD = true; bool isF = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isB = false; isD = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isB = false; isH = false; break; case AgaruHiku.Hiku: isB = false; isH = false; break; } switch (migiHidari) { case MigiHidari.Migi: isF = false; isH = false; break; case MigiHidari.Hidari: isB = false; isD = false; break; case MigiHidari.Sugu: isD = false; isF = false; break; } SySet_Default <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isB) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1)); } //---------- // 候補マスB //---------- if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.L == srcSyurui) { #region 香 //************************************************************ // 香 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┐ // │ │至│ │ // ├─┼─┼─┤ // │ │E0│ │ // ├─┼─┼─┤ // │ │E1│ │ // ├─┼─┼─┤ // │ │E2│ │ // ├─┼─┼─┤ // │ │E3│ │ // ├─┼─┼─┤ // │ │E4│ │ // ├─┼─┼─┤ // │ │E5│ │ // ├─┼─┼─┤ // │ │E6│ │ // ├─┼─┼─┤ // │ │E7│ │ // └─┴─┴─┘ bool isE = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isE) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.N == srcSyurui) { #region 桂 //************************************************************ // 桂 //************************************************************ //---------- // 候補マス //---------- //┌─┐ ┌─┐ //│ │ │ │ //├─┼─┼─┤ //│ │ │ │ //├─┼─┼─┤ //│ │至│ │先手から見た図 //├─┼─┼─┤ //│ │ │ │ //├─┼─┼─┤ //│J│ │I│ //└─┘ └─┘ bool isI = true; bool isJ = true; switch (agaruHiku) { case AgaruHiku.Yoru: isI = false; isJ = false; break; case AgaruHiku.Agaru: break; case AgaruHiku.Hiku: isI = false; isJ = false; break; } switch (migiHidari) { case MigiHidari.Migi: isJ = false; break; case MigiHidari.Hidari: isI = false; break; case MigiHidari.Sugu: isI = false; isJ = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isI) { srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻跳(pside, dst1)); } if (isJ) { srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻駆(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.S == srcSyurui) { #region 銀 //************************************************************ // 銀 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│H│ │B│ //├─┼─┼─┤ //│ │至│ │先手から見た図 //├─┼─┼─┤ //│F│E│D│ //└─┴─┴─┘ bool isB = true; bool isD = true; bool isE = true; bool isF = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isB = false; isD = false; isE = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isB = false; isH = false; break; case AgaruHiku.Hiku: isD = false; isE = false; isF = false; break; } switch (migiHidari) { case MigiHidari.Migi: isE = false; isF = false; isH = false; break; case MigiHidari.Hidari: isB = false; isD = false; isE = false; break; case MigiHidari.Sugu: isB = false; isD = false; isF = false; isH = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isB) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if ( PieceType.G == srcSyurui || PieceType.PP == srcSyurui || PieceType.PL == srcSyurui || PieceType.PN == srcSyurui || PieceType.PS == srcSyurui ) { #region △金、△と金、△成香、△成桂、△成銀 //************************************************************ // △金、△と金、△成香、△成桂、△成銀 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│ │A│ │ //├─┼─┼─┤ //│G│至│C│先手から見た図 //├─┼─┼─┤ //│F│E│D│ //└─┴─┴─┘ bool isA = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isD = false; isE = false; isF = false; break; case AgaruHiku.Agaru: isA = false; isC = false; isG = false; break; case AgaruHiku.Hiku: isC = false; isD = false; isE = false; isF = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isF = false; isG = false; break; case MigiHidari.Hidari: isA = false; isC = false; isD = false; isE = false; break; case MigiHidari.Sugu: isA = false; isC = false; isD = false; isF = false; isG = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.K == srcSyurui) { #region 王 //************************************************************ // 王 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│H│A│B│ //├─┼─┼─┤ //│G│至│C│先手から見た図 //├─┼─┼─┤ //│F│E│D│ //└─┴─┴─┘ bool isA = true; bool isB = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; bool isH = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1)); } if (isB) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1)); } // 王は1つです。 if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.PR == srcSyurui) { #region 竜 //************************************************************ // 竜 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │ │ │ │ │ │ │ │ │A7│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │H│A0│B│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │F│E0│D│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E7│ │ │ │ │ │ │ │ │ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isA = true; bool isB = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isB = false; isD = false; isE = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isA = false; isB = false; isC = false; isG = false; isH = false; break; case AgaruHiku.Hiku: isC = false; isD = false; isE = false; isF = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isF = false; isG = false; isH = false; break; case MigiHidari.Hidari: isA = false; isB = false; isC = false; isD = false; isE = false; break; case MigiHidari.Sugu: isA = false; isB = false; isC = false; isD = false; isF = false; isG = false; isH = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1)); } if (isB) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.PB == srcSyurui) { #region 馬 //************************************************************ // 馬 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │H7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │B7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │H6│ │ │ │ │ │ │ │ │ │ │ │ │ │B6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │H5│ │ │ │ │ │ │ │ │ │ │ │B5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │H4│ │ │ │ │ │ │ │ │ │B4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │H3│ │ │ │ │ │ │ │B3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │H2│ │ │ │ │ │B2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │H1│ │ │ │B1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │H0│A│B0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │G│至│C│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │F0│E│D0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │F1│ │ │ │D1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │F2│ │ │ │ │ │D2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │F3│ │ │ │ │ │ │ │D3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │F4│ │ │ │ │ │ │ │ │ │D4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │F5│ │ │ │ │ │ │ │ │ │ │ │D5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │F6│ │ │ │ │ │ │ │ │ │ │ │ │ │D6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │F7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │D7│ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isA = true; bool isB = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isB = false; isD = false; isE = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isA = false; isB = false; isC = false; isG = false; isH = false; break; case AgaruHiku.Hiku: isC = false; isD = false; isE = false; isF = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isF = false; isG = false; isH = false; break; case MigiHidari.Hidari: isA = false; isB = false; isC = false; isD = false; isE = false; break; case MigiHidari.Sugu: isA = false; isB = false; isC = false; isD = false; isF = false; isG = false; isH = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1)); } if (isB) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else { #region エラー //************************************************************ // エラー //************************************************************ #endregion } gt_EndShogiban: if (Fingers.Error_1 == foundKoma && utsu) { // 駒台の駒を(明示的に)打ちます。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fingers komas = Util_Sky.Fingers_ByOkibaPsideSyuruiNow( siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui); if (0 < komas.Count) { switch (pside) { case Playerside.P2: srcOkiba1 = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba1 = Okiba.Sente_Komadai; break; default: srcOkiba1 = Okiba.Empty; break; } foundKoma = komas[0]; goto gt_EndSyurui; } } gt_EndSyurui: int srcMasuHandle1; if (Fingers.Error_1 != foundKoma) { // 将棋盤の上に駒がありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(foundKoma).Now); srcMasuHandle1 = Util_Masu.AsMasuNumber(koma.Masu); } else { // (符号に書かれていませんが)「打」のとき。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> switch (pside) { case Playerside.P2: srcOkiba1 = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba1 = Okiba.Sente_Komadai; break; default: srcOkiba1 = Okiba.Empty; break; } Debug.Assert(0 < siteiNode.Value.ToKyokumenConst.Count, "星の光が 1個未満。"); // 駒台から、該当する駒を探します。 Fingers daiKomaFgs = Util_Sky.Fingers_ByOkibaPsideSyuruiNow( siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui);//(2014-10-04 12:46)変更 Debug.Assert(0 < daiKomaFgs.Count, "フィンガーズが 1個未満。 srcOkiba1=[" + srcOkiba1 + "] pside=[" + pside + "] srcSyurui=[" + srcSyurui + "]"); // 1個はヒットするはず Finger hitKoma = daiKomaFgs[0];//▲![コマ送り]ボタンを連打すると、エラーになります。 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(hitKoma).Now); srcMasuHandle1 = Util_Masu.AsMasuNumber(koma.Masu); } PieceType dstSyurui; if (NariNarazu.Nari == nariNarazu) { // 成ります dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)srcSyurui]; } else { // そのままです。 dstSyurui = srcSyurui; } // 1手を、データにします。 move = new RO_ShootingStarlight( //foundKoma,//TODO: new RO_Star_Koma( pside, Util_Masu.HandleToMasu(srcMasuHandle1), srcSyurui ), new RO_Star_Koma( pside, dstMasu,//符号は将棋盤の升目です。 dstSyurui ), PieceType.None // 符号からは、取った駒の種類は分からないんだぜ☆ だがバグではない☆ あとで調べる☆ ); }
/// <summary> /// 符号1「7g7f」を元に、move を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ExecuteSfenMoves_FromTextSub( bool isHonshogi, string str1, //123456789 か、 PLNSGKRB string str2, //abcdefghi か、 * string str3, //123456789 string str4, //abcdefghi string strNari, //+ out ShootingStarlightable move, KifuTree kifu, string hint, int tesumi_yomiGenTeban//読み進めている現在の手目済 ) { move = Util_Sky.NullObjectMove; SkyConst src_Sky = kifu.NodeAt(tesumi_yomiGenTeban).Value.ToKyokumenConst; Debug.Assert(!Util_MasuNum.OnKomabukuro(Util_Masu.AsMasuNumber(((RO_Star_Koma)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), "[" + tesumi_yomiGenTeban + "]手目、駒が駒袋にあった。"); try { PieceType uttaSyurui; // 打った駒の種類 int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI; int srcDan = Util_Koma.CTRL_NOTHING_PROPERTY_DAN; if ("*" == str2) { //>>>>>>>>>> 「打」でした。 Converter04.SfenUttaSyurui(str1, out uttaSyurui); } else { //>>>>>>>>>> 指しました。 uttaSyurui = PieceType.None;//打った駒はない☆ //------------------------------ // 1 //------------------------------ if (!int.TryParse(str1, out srcSuji)) { } //------------------------------ // 2 //------------------------------ srcDan = Converter04.Alphabet_ToInt(str2); } //------------------------------ // 3 //------------------------------ int suji; if (!int.TryParse(str3, out suji)) { } //------------------------------ // 4 //------------------------------ int dan; dan = Converter04.Alphabet_ToInt(str4); Finger koma; if ("*" == str2) { //>>>>> 「打」でした。 Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode; // 駒台から、打った種類の駒を取得 koma = Util_Sky.FingerNow_BySyuruiIgnoreCase( siteiNode.Value.ToKyokumenConst, Converter04.Pside_ToKomadai(kifu.CountPside(kifu.CurNode)),//Okiba.Sente_Komadai,//FIXME: uttaSyurui); if (Fingers.Error_1 == koma) { throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。"); } //// FIXME: 打のとき、srcSuji、srcDan が Int.Min } else { //>>>>> 打ではないとき koma = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan) ).ToFirst(); if (Fingers.Error_1 == koma) { // // エラーの理由: // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど // var sky2 = Util_Sky.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3", tesumi_yomiGenTeban); throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗: 将棋盤から [{srcSuji}]筋、[{srcDan}]段 にある駒を掴もうとしましたが、駒がありませんでした。 isHonshogi=[{isHonshogi}] str1=[{str1}] str2=[{str2}] str3=[{str3}] str4=[{str4}] strNari=[{strNari}] hint=[{hint}] tesumi_yomiGenTeban=[{tesumi_yomiGenTeban}] 局面=sfen {Util_SfenStartposWriter.CreateSfenstring(new StartposExporter(src_Sky), true)} {sky2}"); } } PieceType dstSyurui; PieceType srcSyurui; Okiba srcOkiba; SyElement srcMasu; if ("*" == str2) { //>>>>> 打った駒の場合 dstSyurui = uttaSyurui; srcSyurui = uttaSyurui; switch (kifu.CountPside(kifu.CurNode)) { case Playerside.P2: srcOkiba = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba = Okiba.Sente_Komadai; break; default: srcOkiba = Okiba.Empty; break; } int lastTesumi = kifu.CountTesumi(kifu.CurNode); Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.NodeAt(lastTesumi); Finger srcKoma = Util_Sky.FingerNow_BySyuruiIgnoreCase(siteiNode.Value.ToKyokumenConst, srcOkiba, srcSyurui); RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now); srcMasu = dstKoma.Masu; } else { //>>>>> 盤上の駒を指した場合 RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma).Now); dstSyurui = Haiyaku184Array.Syurui(dstKoma.Haiyaku); srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。 srcOkiba = Okiba.ShogiBan; srcMasu = Util_Masu.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan); } //------------------------------ // 5 //------------------------------ if ("+" == strNari) { // 成りました dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)dstSyurui]; } //------------------------------ // 結果 //------------------------------ // 棋譜 move = new RO_ShootingStarlight( //koma,//TODO: new RO_Star_Koma( kifu.CountPside(kifu.CurNode), srcMasu,//FIXME:升ハンドルにしたい srcSyurui ), new RO_Star_Koma( kifu.CountPside(kifu.CurNode), Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい dstSyurui ), PieceType.None//符号からは、取った駒は分からない ); } catch (Exception ex) { //>>>>> エラーが起こりました。 // どうにもできないので 経路と情報を付け足して 更に外側に投げます。 throw new Exception($"{ex.GetType().Name}:{ex.Message} in TuginoItte_Sfen.GetData_FromTextSub(A) str1=「{str1}」 str2=「{str2}」 str3=「{str3}」 str4=「{str4}」 strNari=「{strNari}」 "); } }
/// <summary> /// ロードした内容を確認するときに使います。 /// </summary> /// <returns></returns> public static string LogHtml() { StringBuilder sb = new StringBuilder(); sb.AppendLine("<html>"); sb.AppendLine("<head>"); sb.AppendLine(" <title>道表</title>"); sb.AppendLine(" <style type=\"text/css\">"); sb.AppendLine(" /* 将棋盤 */"); sb.AppendLine(" table{"); sb.AppendLine(" border-collapse:collapse;"); sb.AppendLine(" border:2px #2b2b2b solid;"); sb.AppendLine(" }"); sb.AppendLine(" td{"); sb.AppendLine(" border:1px #2b2b2b solid;"); sb.AppendLine(" background-color:#ffcc55;"); sb.AppendLine(" width:48px; height:48px;"); sb.AppendLine(" }"); sb.AppendLine(" </style>"); sb.AppendLine("</head>"); sb.AppendLine("<body>"); foreach (SySet <SyElement> michi in Michi187Array.Items) { sb.Append("<h1>「"); sb.Append(michi.Word); sb.AppendLine("」</h1>"); // そのマスに振る、順番の番号。「M 味方陣」「H 平野部」「T 敵陣」で分けてあります。 Dictionary <SyElement, int> orderOnBanM = new Dictionary <SyElement, int>(); Dictionary <SyElement, int> orderOnBanH = new Dictionary <SyElement, int>(); Dictionary <SyElement, int> orderOnBanT = new Dictionary <SyElement, int>(); int order = 1; foreach (SySet <SyElement> superset in michi.Supersets) { switch (superset.Word) { case "味方陣": { foreach (SyElement masu in superset.Elements) { orderOnBanM.Add(masu, order); order++; } } break; case "平野部": { foreach (SyElement masu in superset.Elements) { orderOnBanH.Add(masu, order); order++; } } break; case "敵陣": { foreach (SyElement masu in superset.Elements) { orderOnBanT.Add(masu, order); order++; } } break; default: throw new Exception($"未定義の集合名です。[{superset.Word}]"); } } sb.Append("<table>"); // 9一~1一、9二~1二、…9九~1九の順だぜ☆ for (int dan = 1; dan <= 9; dan++) { sb.AppendLine("<tr>"); sb.Append(" "); for (int suji = 9; suji >= 1; suji--) { SyElement masu = Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan); if (orderOnBanM.ContainsKey(masu)) { // 順番が記されている味方陣マス sb.Append("<td style=\"text-align:center; background-color:blue;\">"); sb.Append(orderOnBanM[masu]); sb.Append("</td>"); } else if (orderOnBanH.ContainsKey(masu)) { // 順番が記されている平野部マス sb.Append("<td style=\"text-align:center; background-color:green;\">"); sb.Append(orderOnBanH[masu]); sb.Append("</td>"); } else if (orderOnBanT.ContainsKey(masu)) { // 順番が記されている敵陣マス sb.Append("<td style=\"text-align:center; background-color:red;\">"); sb.Append(orderOnBanT[masu]); sb.Append("</td>"); } else { // 特に指定のないマス。 sb.Append("<td></td>"); } } sb.AppendLine(); sb.AppendLine("</tr>"); } sb.AppendLine("</table>"); } sb.AppendLine("</body>"); sb.AppendLine("</html>"); return(sb.ToString()); }
public string ToSfenstring(Playerside pside) { SkyConst src_Sky = this.Value.ToKyokumenConst; StringBuilder sb = new StringBuilder(); sb.Append("sfen "); for (int dan = 1; dan <= 9; dan++) { int spaceCount = 0; for (int suji = 9; suji >= 1; suji--) { // 将棋盤上のどこかにある駒? Finger koma0 = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan) ).ToFirst(); if (Fingers.Error_1 != koma0) { if (0 < spaceCount) { sb.Append(spaceCount); spaceCount = 0; } RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma0).Now); sb.Append(KomaSyurui14Array.SfenText( Haiyaku184Array.Syurui(koma1.Haiyaku), koma1.Pside )); } else { spaceCount++; } } if (0 < spaceCount) { sb.Append(spaceCount); spaceCount = 0; } if (dan != 9) { sb.Append("/"); } } sb.Append(" "); //------------------------------------------------------------ // 先後 //------------------------------------------------------------ switch (pside) { case Playerside.P2: sb.Append("w"); break; default: sb.Append("b"); break; } sb.Append(" "); //------------------------------------------------------------ // 持ち駒 //------------------------------------------------------------ { int mK = 0; int mR = 0; int mB = 0; int mG = 0; int mS = 0; int mN = 0; int mL = 0; int mP = 0; int mk = 0; int mr = 0; int mb = 0; int mg = 0; int ms = 0; int mn = 0; int ml = 0; int mp = 0; this.GetMoti( src_Sky, out mK, out mR, out mB, out mG, out mS, out mN, out mL, out mP, out mk, out mr, out mb, out mg, out ms, out mn, out ml, out mp ); if (0 == mK + mR + mB + mG + mS + mN + mL + mP + mk + mr + mb + mg + ms + mn + ml + mp) { sb.Append("-"); } else { if (0 < mK) { if (1 < mK) { sb.Append(mK); } sb.Append("K"); } if (0 < mR) { if (1 < mR) { sb.Append(mR); } sb.Append("R"); } if (0 < mB) { if (1 < mB) { sb.Append(mB); } sb.Append("B"); } if (0 < mG) { if (1 < mG) { sb.Append(mG); } sb.Append("G"); } if (0 < mS) { if (1 < mS) { sb.Append(mS); } sb.Append("S"); } if (0 < mN) { if (1 < mN) { sb.Append(mN); } sb.Append("N"); } if (0 < mL) { if (1 < mL) { sb.Append(mL); } sb.Append("L"); } if (0 < mP) { if (1 < mP) { sb.Append(mP); } sb.Append("P"); } if (0 < mk) { if (1 < mk) { sb.Append(mk); } sb.Append("k"); } if (0 < mr) { if (1 < mr) { sb.Append(mr); } sb.Append("r"); } if (0 < mb) { if (1 < mb) { sb.Append(mb); } sb.Append("b"); } if (0 < mg) { if (1 < mg) { sb.Append(mg); } sb.Append("g"); } if (0 < ms) { if (1 < ms) { sb.Append(ms); } sb.Append("s"); } if (0 < mn) { if (1 < mn) { sb.Append(mn); } sb.Append("n"); } if (0 < ml) { if (1 < ml) { sb.Append(ml); } sb.Append("l"); } if (0 < mp) { if (1 < mp) { sb.Append(mp); } sb.Append("p"); } } } // 手目 sb.Append(" 1"); return(sb.ToString()); }
public ISfenPosition1 ToRO_Kyokumen1() { ISfenPosition1 ro_Kyokumen1 = new SfenPosition1Impl(); SkyConst src_Sky = this.Value.ToKyokumenConst; for (int suji = 1; suji < 10; suji++) { for (int dan = 1; dan < 10; dan++) { Finger koma0 = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan) ).ToFirst(); if (Fingers.Error_1 != koma0) { RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma0).Now); ro_Kyokumen1.Ban[suji][dan] = KomaSyurui14Array.SfenText( Haiyaku184Array.Syurui(koma1.Haiyaku), koma1.Pside ); } } } int mK = 0; int mR = 0; int mB = 0; int mG = 0; int mS = 0; int mN = 0; int mL = 0; int mP = 0; int mk = 0; int mr = 0; int mb = 0; int mg = 0; int ms = 0; int mn = 0; int ml = 0; int mp = 0; this.GetMoti( src_Sky, out mK, out mR, out mB, out mG, out mS, out mN, out mL, out mP, out mk, out mr, out mb, out mg, out ms, out mn, out ml, out mp ); ro_Kyokumen1.MotiP1[0] = mR; ro_Kyokumen1.MotiP1[1] = mB; ro_Kyokumen1.MotiP1[2] = mG; ro_Kyokumen1.MotiP1[3] = mS; ro_Kyokumen1.MotiP1[4] = mN; ro_Kyokumen1.MotiP1[5] = mL; ro_Kyokumen1.MotiP1[6] = mP; ro_Kyokumen1.MotiP2[0] = mr; ro_Kyokumen1.MotiP2[1] = mb; ro_Kyokumen1.MotiP2[2] = mg; ro_Kyokumen1.MotiP2[3] = ms; ro_Kyokumen1.MotiP2[4] = mn; ro_Kyokumen1.MotiP2[5] = ml; ro_Kyokumen1.MotiP2[6] = mp; return(ro_Kyokumen1); }
/// <summary> /// /// </summary> /// <param name="figMovedKoma"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="kifu"></param> /// <param name="isMakimodosi"></param> private static void Kifusasi25( out Finger figMovedKoma, ShootingStarlightable move, KifuTree kifu, bool isMakimodosi , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { figMovedKoma = Fingers.Error_1; SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst; //------------------------------------------------------------ // 選択 : 動かす駒 //------------------------------------------------------------ if (isMakimodosi) { // [巻戻し]のとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // 打った駒も、指した駒も、結局は将棋盤の上にあるはず。 RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); // 動かす駒 figMovedKoma = Util_Sky.Finger_AtMasuNow_Shogiban( src_Sky, koma.Pside, koma.Masu//[巻戻し]のときは、先位置が 駒の居場所。 ); } else { // 進むとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //------------------------------ // 符号の追加(一手進む) //------------------------------ KifuNode genKyokumenCopyNode = new KifuNodeImpl(move, new KyokumenWrapper(src_Sky), KifuNodeImpl.GetReverseTebanside(((KifuNode)kifu.CurNode).Tebanside)); // TODO: ↓? ((KifuNode)kifu.CurNode).AppendChildA_New(genKyokumenCopyNode); kifu.CurNode = genKyokumenCopyNode; if (Util_Sky.IsDaAction(move)) { //---------- // 駒台から “打” //---------- RO_Star_Koma srcKoma = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); figMovedKoma = Util_Sky.FingerNow_BySyuruiIgnoreCase( src_Sky, Util_Masu.GetOkiba(srcKoma.Masu), Haiyaku184Array.Syurui(dstKoma.Haiyaku) ); } else { //---------- // 将棋盤から //---------- RO_Star_Koma srcKoma = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); figMovedKoma = Util_Sky.Finger_AtMasuNow_Shogiban( src_Sky, dstKoma.Pside, Util_Masu.OkibaSujiDanToMasu( Util_Masu.GetOkiba(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(dstKoma.Masu)]), Util_Masu.AsMasuNumber(srcKoma.Masu) ) ); } } }
/// <summary> /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。 /// </summary> /// <param name="input_node"></param> /// <param name="playerInfo"></param> /// <returns></returns> public override void Keisan(out KyHyokaItem kyokumenScore, KyHandanArgs args) { double score = 0.0d; SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // // 自玉 // RO_Star_Koma jiGyoku = null; foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒 { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (koma.Pside == args.PlayerInfo.Playerside && koma.Syurui == PieceType.K) { jiGyoku = koma; break; } } if (null == jiGyoku) { goto gt_EndMethod; } int jiGyoku_Suji; Util_MasuNum.MasuToSuji(jiGyoku.Masu, out jiGyoku_Suji); int jiGyoku_Dan; Util_MasuNum.MasuToDan(jiGyoku.Masu, out jiGyoku_Dan); int[] sujis = new int[25]; int[] dans = new int[25]; { // // 25近傍。12の位置に、視点の中心となる駒があるとします。 // // -2 -1 0 +1 +2 // ┌─┬─┬─┬─┬─┐ //-2│ 0│ 1│ 2│ 3│ 4│ // ├─┼─┼─┼─┼─┤ //-1│ 5│ 6│ 7│ 8│ 9│ // ├─┼─┼─┼─┼─┤ // 0│10│11│12│13│14│ // ├─┼─┼─┼─┼─┤ //+1│15│16│17│18│19│ // ├─┼─┼─┼─┼─┤ //+2│20│21│22│23│24│ // └─┴─┴─┴─┴─┘ // int index = 0; for (int dDan = -2; dDan < 3; dDan++) { for (int dSuji = -2; dSuji < 3; dSuji++) { sujis[index] = jiGyoku_Suji + dSuji; dans[index] = jiGyoku_Dan + dDan; index++; } } } // 25近傍に、得点の重みを付けます。 double aa = 0.0d; double bb = 100.0d; double cc = 100.0d / 3.0d; double dd = 100.0d / 3.0d / 3.0d; double ee = 100.0d / 3.0d / 3.0d / 3.0d; double ff = 100.0d / 3.0d / 3.0d / 3.0d / 3.0d; double[] omomi = new double[] { ff, ee, dd, ee, ff, ee, cc, bb, cc, ee, dd, bb, aa, bb, dd, ee, cc, bb, cc, ee, ff, ee, dd, ee, ff, }; // 25近傍のマス番号を取得しておきます。該当がなければ Masu_Honshogi.Error。 Dictionary <SyElement, double> masuOmomi = new Dictionary <SyElement, double>(); { for (int index = 0; index < 25; index++) { SyElement masu = Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, sujis[index], dans[index]); if (masu != Masu_Honshogi.Error) { masuOmomi.Add(masu, omomi[index]); } } } // // 味方の金、銀について。 // int countKanagoma = 0; // カナゴマ foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) // 全駒 { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (koma.Pside == args.PlayerInfo.Playerside && koma.Syurui == PieceType.S && koma.Syurui == PieceType.G ) { if (masuOmomi.ContainsKey(koma.Masu)) { score += masuOmomi[koma.Masu]; countKanagoma++; if (3 <= countKanagoma) { break; } } } } gt_EndMethod: string meisai = ""; #if DEBUG // 明細の作成 { StringBuilder sb = new StringBuilder(); sb.Append("略"); meisai = sb.ToString(); } #endif kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai); }
/// <summary> /// デバッグ用文字列を作ります。 /// </summary> /// <param name="masus"></param> /// <param name="memo"></param> /// <returns></returns> public static string Log_Masus(SySet <SyElement> masus, string memo) { StringBuilder sb = new StringBuilder(); int errorCount = 0; // フォルスクリア bool[] ban81 = new bool[81]; // フラグ立て foreach (Basho hMasu in masus.Elements) { if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(Masu_Honshogi.Items_All[hMasu.MasuNumber])) { ban81[hMasu.MasuNumber] = true; } } sb.AppendLine("...(^▽^)さて、局面は☆?"); if (null != memo && "" != memo.Trim()) { sb.AppendLine(memo); } sb.AppendLine(" 9 8 7 6 5 4 3 2 1"); sb.AppendLine("┏━┯━┯━┯━┯━┯━┯━┯━┯━┓"); for (int dan = 1; dan <= 9; dan++) { sb.Append("┃"); for (int suji = 9; suji >= 1; suji--)// 筋は左右逆☆ { SyElement masu = Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan); if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(masu)) { if (ban81[Util_Masu.AsMasuNumber(masu)]) { sb.Append("●"); } else { sb.Append(" "); } } else { errorCount++; sb.Append(" "); } if (suji == 1)//1筋が最後だぜ☆ { sb.Append("┃"); sb.AppendLine(ConverterKnSh.Int_ToKanSuji(dan)); } else { sb.Append("│"); } } if (dan == 9) { sb.AppendLine("┗━┷━┷━┷━┷━┷━┷━┷━┷━┛"); } else { sb.AppendLine("┠─┼─┼─┼─┼─┼─┼─┼─┼─┨"); } } // 後手駒台 sb.Append("エラー数:"); sb.AppendLine(errorCount.ToString()); sb.AppendLine("...(^▽^)ドウダッタカナ~☆"); return(sb.ToString()); }