/// <summary> /// 次の1手データを作ります(*1) /// /// *1…符号1「▲68銀上」を元に、「7968」を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ToMove( 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 IMove move, KifuTree kifu ) { Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode; SkyConst src_Sky = siteiNode.Value.KyokumenConst; //------------------------------ // 符号確定 //------------------------------ MigiHidari migiHidari = Conv_String268.Str_ToMigiHidari(strMigiHidari); AgaruHiku agaruHiku = Conv_String268.Str_ToAgaruHiku(strAgaruHiku); // 上|引 NariNarazu nariNarazu = Conv_String268.Nari_ToBool(strNariNarazu); //成 DaHyoji daHyoji = Conv_String268.Str_ToDaHyoji(strDaHyoji); //打 PieceType srcSyurui = Conv_String268.Str_ToSyurui(strSrcSyurui); //------------------------------ // //------------------------------ Playerside pside = Conv_String268.Pside_ToEnum(strPside); SyElement dstMasu; if ("同" == strDou) { // 1手前の筋、段を求めるのに使います。 RO_Star koma = Util_Starlightable.AsKoma(siteiNode.Key.Now); dstMasu = koma.Masu; } else { dstMasu = Util_Masu10.OkibaSujiDanToMasu( Okiba.ShogiBan, Conv_Suji.ToInt(strSuji), Conv_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) { #region 歩 //************************************************************ // 歩 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│ │ │ │ //├─┼─┼─┤ //│ │至│ │ //├─┼─┼─┤ //│ │E│ │ //└─┴─┴─┘ bool isE = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, 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 (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else { #region エラー //************************************************************ // エラー //************************************************************ #endregion } gt_EndShogiban: if (Fingers.Error_1 == foundKoma && utsu) { // 駒台の駒を(明示的に)打ちます。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fingers komas = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow( siteiNode.Value.KyokumenConst, srcOkiba1, pside, srcSyurui);//(2015-08-05 01:04)変更 //Fingers komas = Util_Sky051Fingers.Fingers_ByOkibaPsideSyuruiNow_OldSpec( // 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 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(foundKoma).Now); srcMasuHandle1 = Conv_SyElement.ToMasuNumber(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.KyokumenConst.Count, "星の光が 1個未満。"); // 駒台から、該当する駒を探します。 Fingers daiKomaFgs = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow( siteiNode.Value.KyokumenConst, srcOkiba1, pside, srcSyurui);//(2015-08-05 01:04)変更 //Fingers daiKomaFgs = Util_Sky051Fingers.Fingers_ByOkibaPsideSyuruiNow_OldSpec( // 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 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(hitKoma).Now); srcMasuHandle1 = Conv_SyElement.ToMasuNumber(koma.Masu); } PieceType dstSyurui; if (NariNarazu.Nari == nariNarazu) { // 成ります dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)srcSyurui]; } else { // そのままです。 dstSyurui = srcSyurui; } // 1手を、データにします。 move = new RO_Starbeam( //foundKoma,//TODO: new RO_Star( pside, Conv_MasuHandle.ToMasu(srcMasuHandle1), srcSyurui ), new RO_Star( pside, dstMasu,//符号は将棋盤の升目です。 dstSyurui ), PieceType.None // 符号からは、取った駒の種類は分からないんだぜ☆ だがバグではない☆ あとで調べる☆ ); }
/// <summary> /// CSAの指し手を、SFENの指し手に変換します。 /// </summary> /// <param name="csa"></param> /// <param name="ittemae_Sky">1手前の局面。ルート局面などの理由で1手前の局面がない場合はヌル。</param> /// <returns></returns> public static string ToSfen(CsaKifuMove csa, SkyConst ittemae_Sky_orNull) { StringBuilder sb = new StringBuilder(); int dstSuji; int.TryParse(csa.DestinationMasu[0].ToString(), out dstSuji); string dstDan = Conv_Suji.ToAlphabet(csa.DestinationMasu[1]); // 元位置の筋と段は、あとで必ず使う。(成りの判定) int srcSuji; int.TryParse(csa.SourceMasu[0].ToString(), out srcSuji); int srcDan; int.TryParse(csa.SourceMasu[1].ToString(), out srcDan); if ("00" == csa.SourceMasu) { // 打 string syurui; switch (csa.Syurui) { case Word_Csa.FU_FU_____: syurui = SfenWord.P_PAWN__; break; case Word_Csa.KY_KYO____: syurui = SfenWord.L_LANCE_; break; case Word_Csa.KE_KEI____: syurui = SfenWord.N_KNIGHT; break; case Word_Csa.GI_GIN____: syurui = SfenWord.S_SILVER; break; case Word_Csa.KI_KIN____: syurui = SfenWord.G_GOLD__; break; case Word_Csa.KA_KAKU___: syurui = SfenWord.B_BISHOP; break; case Word_Csa.HI_HISYA__: syurui = SfenWord.R_ROOK__; break; case Word_Csa.OU_OU_____: syurui = SfenWord.K_KING__; break; //おまけ default: syurui = SfenWord.ERROR___; break; //エラー } sb.Append(syurui); sb.Append("*"); } else { string srcDan_alphabet = Conv_Suji.ToAlphabet(csa.SourceMasu[1]); sb.Append(srcSuji); sb.Append(srcDan_alphabet); } sb.Append(dstSuji); sb.Append(dstDan); bool nari = false; switch (csa.Syurui) { case Word_Csa.TO_TOKIN__: nari = true; break; case Word_Csa.NY_NARIKYO: nari = true; break; case Word_Csa.NK_NARIKEI: nari = true; break; case Word_Csa.NG_NARIGIN: nari = true; break; case Word_Csa.UM_UMA____: nari = true; break; case Word_Csa.RY_RYU____: nari = true; break; } // // 「成り」をしたのかどうかを、調べます。 // { if (null != ittemae_Sky_orNull && "00" != csa.SourceMasu) { // ルート局面ではなく、かつ、打ではないとき。 //ittemae_Sky_orNull.Foreach_Starlights((Finger finger, Starlight light, ref bool toBreak) => //{ // RO_Star_Koma koma = Util_Starlightable.AsKoma(light.Now); // Logger.Trace($"[{finger}] {koma.Masu.Word}" "{koma.Pside}" "{KomaSyurui14Array.Ichimoji[(int)koma.Syurui]}"); //}); SyElement srcMasu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan); RO_Star srcKoma = Util_Sky_KomaQuery.InMasuNow(ittemae_Sky_orNull, srcMasu); Debug.Assert(null != srcKoma, "元位置の駒を取得できなかった。1"); if (!Util_Komasyurui14.IsNari(srcKoma.Komasyurui) && nari)//移動元で「成り」でなかった駒が、移動後に「成駒」になっていた場合。 { sb.Append("+"); } } } return(sb.ToString()); }