/// <summary> /// ************************************************************************************************************************ /// 元位置。 /// ************************************************************************************************************************ /// </summary> /// <returns></returns> public static IMove Src(IMove move) { RO_Starbeam result; RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); result = new RO_Starbeam( new RO_Star( dstKoma.Pside, Masu_Honshogi.Query_Basho(Masu_Honshogi.nError), // ソースのソースは未定義。 PieceType.None ), // ソースの目的地はソース new RO_Star( dstKoma.Pside, srcKoma.Masu, srcKoma.Komasyurui ), PieceType.None ); return(result); }
/// <summary> /// 移動前と、移動後の場所が異なっていれば真。 /// </summary> /// <returns></returns> public static bool DoneMove(RO_Starbeam ss) { bool result; RO_Star koma1 = Util_Starlightable.AsKoma(ss.Now); RO_Star koma2 = Util_Starlightable.AsKoma(Util_Sky258A.Src(ss).Now); result = Conv_SyElement.ToMasuNumber(koma1.Masu) != Conv_SyElement.ToMasuNumber(koma2.Masu); return(result); }
/// <summary> /// ************************************************************************************************************************ /// SFEN符号表記。(取った駒付き) /// ************************************************************************************************************************ /// </summary> /// <returns></returns> public static string ToMoveStrSfenWithTottaKomasyurui(RO_Starbeam ss) { StringBuilder sb = new StringBuilder(); sb.Append(ConvMoveStrSfen.ToMoveStrSfen(ss)); if (PieceType.None != (PieceType)ss.FoodKomaSyurui) { sb.Append("("); sb.Append(ss.FoodKomaSyurui); sb.Append(")"); } return(sb.ToString()); }
/// <summary> /// ************************************************************************************************************************ /// 棋譜用の符号テキスト(*1)を作ります。 /// ************************************************************************************************************************ /// /// *1…「▲5五銀上」など。 /// /// “同”表記に「置き換えない」バージョンです。 /// /// </summary> /// <param name="move"></param> /// <param name="previousKomaP"></param> /// <returns></returns> public static string ToString_NoUseDou( JsaFugoImpl jsaFugo, RO_Starbeam move ) { StringBuilder sb = new StringBuilder(); RO_Star koma = Util_Starlightable.AsKoma(move.Now); sb.Append(Conv_Playerside.ToSankaku(koma.Pside)); //------------------------------ // “同”に変換せず、“筋・段”をそのまま出します。 //------------------------------ int suji; int dan; Util_MasuNum.TryMasuToSuji(koma.Masu, out suji); Util_MasuNum.TryMasuToDan(koma.Masu, out dan); sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); //------------------------------ // “歩”とか。“全”ではなく“成銀” <符号用> //------------------------------ sb.Append(Util_Komasyurui14.Fugo[(int)jsaFugo.Syurui]); //------------------------------ // “右”とか //------------------------------ sb.Append(Conv_MigiHidari.ToStr(jsaFugo.MigiHidari)); //------------------------------ // “寄”とか //------------------------------ sb.Append(Conv_AgaruHiku.ToStr(jsaFugo.AgaruHiku)); //------------------------------ // “成”とか //------------------------------ sb.Append(Conv_NariNarazu.Nari_ToStr(jsaFugo.Nari)); //------------------------------ // “打”とか //------------------------------ sb.Append(Conv_DaHyoji.ToBool(jsaFugo.DaHyoji)); return(sb.ToString()); }
/// <summary> /// FIXME: 使ってない? /// /// 変換「自駒が動ける升」→「自駒が動ける手」 /// </summary> /// <param name="kmDic_Self"></param> /// <returns></returns> public static Maps_OneAndMulti <Finger, IMove> ToKomabetuMove( Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self, Node <IMove, KyokumenWrapper> siteiNode_genzai ) { Maps_OneAndMulti <Finger, IMove> komaTe = new Maps_OneAndMulti <Finger, IMove>(); // // kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { foreach (SyElement masuHandle in value.Elements) { RO_Star koma = Util_Starlightable.AsKoma(siteiNode_genzai.Value.KyokumenConst.StarlightIndexOf(key).Now); IMove move = new RO_Starbeam( //key, // 元 koma, // 先 new RO_Star( koma.Pside, Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(masuHandle)], koma.Haiyaku //TODO:成るとか考えたい ), PieceType.None //取った駒不明 ); //sbSfen.Append(sbSfen.ToString()); if (komaTe.ContainsKey(key)) { // すでに登録されている駒 komaTe.AddExists(key, move); } else { // まだ登録されていない駒 komaTe.AddNew(key, move); } } }); return(komaTe); }
/// <summary> /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」 /// </summary> /// <param name="komaBETUSusumeruMasus">駒別の進める升</param> /// <param name="siteiNode">指定ノード</param> /// <returns></returns> public static Maps_OneAndMulti <Finger, IMove> ToKomaBetuAllMoves( List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus, SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> siteiNode ) { Maps_OneAndMulti <Finger, IMove> result_komabetuAllMove = new Maps_OneAndMulti <Finger, IMove>(); komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) => { // 動かす星。 RO_Star srcStar = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); foreach (SyElement susumuMasu in susumuMasuSet.Elements)// 星が進める升。 { // 移動先の星(升の変更) RO_Star dstStar = new RO_Star( srcStar.Pside, susumuMasu, //Masu_Honshogi.Items_All[Util_Masu10.AsMasuNumber(susumuMasu)], srcStar.Komasyurui // srcStar.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい ); IMove move = new RO_Starbeam( srcStar, // 移動元 dstStar, // 移動先 PieceType.None //取った駒不明 ); result_komabetuAllMove.Put_NewOrOverwrite(figKoma, move); //FIXME: 1つの駒に指し手は1つ?? // これが通称【水際のいんちきプログラム】なんだぜ☆ // 必要により、【成り】の指し手を追加します。 Util_Sasu269.Add_KomaBETUAllNariMoves( result_komabetuAllMove, figKoma, //動かす駒 srcStar, //動かす星 dstStar //移動先の星 ); } }); return(result_komabetuAllMove); }
/// <summary> /// これが通称【水際のいんちきプログラム】なんだぜ☆ /// 必要により、【成り】の指し手を追加します。 /// </summary> public static void Add_KomaBETUAllNariMoves( Maps_OneAndMulti <Finger, IMove> komaBETUAllMoves, Finger figKoma, RO_Star srcKoma, RO_Star dstKoma ) { bool isPromotionable; if (!Util_Sasu269.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { goto gt_EndMethod; } // 成りの資格があれば、成りの指し手を作ります。 if (isPromotionable) { //MessageBox.Show($"成りの資格がある駒がありました。 src=[{srcKoma.Masu.Word}][{srcKoma.Syurui}]"); IMove move = new RO_Starbeam( //figKoma,//駒 srcKoma,// 移動元 new RO_Star( dstKoma.Pside, dstKoma.Masu, Util_Komasyurui14.ToNariCase(dstKoma.Komasyurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 komaBETUAllMoves.AddNotOverwrite(figKoma, move); } gt_EndMethod: ; }
/// <summary> /// これが通称【水際のいんちきプログラム】なんだぜ☆ /// 必要により、【成り】の指し手を追加します。 /// </summary> public static Dictionary <string, SasuEntry> CreateNariMove( SkyConst src_Sky, Dictionary <string, SasuEntry> a_moveBetuEntry ) { //---------------------------------------- // 『進める駒』と、『移動先升』 //---------------------------------------- Dictionary <string, SasuEntry> result_komabetuEntry = new Dictionary <string, SasuEntry>(); try { Dictionary <string, IMove> newMoveList = new Dictionary <string, IMove>(); foreach (KeyValuePair <string, SasuEntry> entry in a_moveBetuEntry) { // // ・移動元の駒 // ・移動先の駒 // RO_Star srcKoma = Util_Starlightable.AsKoma(entry.Value.NewMove.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(entry.Value.NewMove.Now); // 成りができる動きなら真。 bool isPromotionable; if (!Util_Sasu269.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { // エラー goto gt_Next1; } if (isPromotionable) { IMove move = new RO_Starbeam( srcKoma,// 移動元 new RO_Star( dstKoma.Pside, dstKoma.Masu, Util_Komasyurui14.ToNariCase(dstKoma.Komasyurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 string moveStr = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー if (!newMoveList.ContainsKey(moveStr)) { newMoveList.Add(moveStr, move); } } gt_Next1: ; } //hubNode.Foreach_ChildNodes((string key, Node<Starbeamable, KyokumenWrapper> nextNode, ref bool toBreak) => //{ //}); // 新しく作った【成り】の指し手を追加します。 foreach (IMove newMove in newMoveList.Values) { // 指す前の駒 RO_Star sasumaenoKoma = Util_Starlightable.AsKoma(newMove.LongTimeAgo); // 指した駒 RO_Star sasitaKoma = Util_Starlightable.AsKoma(newMove.Now); // 指す前の駒を、盤上のマス目で指定 Finger figSasumaenoKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky, sasumaenoKoma.Masu).ToFirst(); string moveStr = ConvMoveStrSfen.ToMoveStrSfen(newMove); if (!result_komabetuEntry.ContainsKey(moveStr)) { // 指し手が既存でない局面だけを追加します。 // 『進める駒』と、『移動先升』 result_komabetuEntry.Add(moveStr, new SasuEntry(newMove, figSasumaenoKoma, sasitaKoma.Masu, true)); } } } catch (Exception ex) { throw new Exception($"Convert04.cs#AddNariMoveでエラー。:{ex.GetType().Name}:{ex.Message}"); } return(result_komabetuEntry); }
/// <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> /// 符号1「7g7f」を元に、move を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ToMove( bool isHonshogi, string str1, //123456789 か、 PLNSGKRB string str2, //abcdefghi か、 * string str3, //123456789 string str4, //abcdefghi string strNari, //+ out IMove move, KifuTree kifu, string hint ) { move = Util_Sky258A.NullObjectMove; Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode; SkyConst src_Sky = siteiNode.Value.KyokumenConst; //kifu.AssertPside(kifu.CurNode, $"str1={str1}"); Playerside pside1 = src_Sky.KaisiPside; #if DEBUG Debug.Assert(!Conv_MasuHandle.OnKomabukuro(Conv_SyElement.ToMasuNumber(((RO_Star)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), $"[{src_Sky.Temezumi}]手目、駒が駒袋にあった。"); #endif PieceType uttaSyurui; // 打った駒の種類 int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI; int srcDan = Util_Koma.CTRL_NOTHING_PROPERTY_DAN; if ("*" == str2) { //>>>>>>>>>> 「打」でした。 Conv_String268.SfenUttaSyurui(str1, out uttaSyurui); } else { //>>>>>>>>>> 指しました。 uttaSyurui = PieceType.None;//打った駒はない☆ //------------------------------ // 1 //------------------------------ if (!int.TryParse(str1, out srcSuji)) { } //------------------------------ // 2 //------------------------------ srcDan = Conv_Alphabet.ToInt(str2); } //------------------------------ // 3 //------------------------------ int suji; if (!int.TryParse(str3, out suji)) { } //------------------------------ // 4 //------------------------------ int dan; dan = Conv_Alphabet.ToInt(str4); Finger koma; if ("*" == str2) { //>>>>> 「打」でした。 // 駒台から、打った種類の駒を取得 koma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase( siteiNode.Value.KyokumenConst, Conv_Playerside.ToKomadai(pside1),//FIXME: uttaSyurui); if (Fingers.Error_1 == koma) { throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。"); } //// FIXME: 打のとき、srcSuji、srcDan が Int.Min } else { //>>>>> 打ではないとき SyElement masu1 = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan); Fingers komas1 = Util_Sky_FingersQuery.InMasuNow(//これが空っぽになるときがある。 src_Sky, masu1 ); koma = komas1.ToFirst(); if (Fingers.Error_1 == koma) { // // エラーの理由: // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど // var sky2 = Util_Sky307.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3", src_Sky.Temezumi); string text2; if (masu1 is New_Basho) { text2 = $@"masu1.masuNumber=[{((New_Basho)masu1).MasuNumber}] komas1.Count=[{komas1.Count}]"; } else { text2 = "masu1.masuNumber=New_Basho型じゃない。"; } StringBuilder sb = new StringBuilder(); throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗:SFENでは [{srcSuji}]筋、[{srcDan}]段 にある駒を掴めと指示がありましたが、 将棋盤データの[{Conv_Sy.Query_Word(masu1.Bitfield)}]マスには、(駒が全て駒袋に入っているのか)駒がありませんでした。 hint=[{hint}] {text2} isHonshogi=[{isHonshogi}] str1=[{str1}] str2=[{str2}] str3=[{str3}] str4=[{str4}] strNari=[{strNari}] src_Sky.Temezumi=[{src_Sky.Temezumi}] 局面 = sfen {Util_StartposExporter.ToSfenstring(new StartposExporterImpl(src_Sky), true)} {sky2} "); } } PieceType dstSyurui; PieceType srcSyurui; Okiba srcOkiba; SyElement srcMasu; if ("*" == str2) { //>>>>> 打った駒の場合 dstSyurui = uttaSyurui; srcSyurui = uttaSyurui; switch (pside1) { case Playerside.P2: srcOkiba = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba = Okiba.Sente_Komadai; break; default: srcOkiba = Okiba.Empty; break; } Finger srcKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(siteiNode.Value.KyokumenConst, srcOkiba, srcSyurui); RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now); srcMasu = dstKoma.Masu; } else { //>>>>> 盤上の駒を指した場合 RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma).Now); dstSyurui = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku); srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。 srcOkiba = Okiba.ShogiBan; srcMasu = Util_Masu10.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan); } //------------------------------ // 5 //------------------------------ if ("+" == strNari) { // 成りました dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)dstSyurui]; } //------------------------------ // 結果 //------------------------------ // 棋譜 move = new RO_Starbeam( //koma,//TODO: new RO_Star( pside1, srcMasu,//FIXME:升ハンドルにしたい srcSyurui ), new RO_Star( pside1, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい dstSyurui ), PieceType.None//符号からは、取った駒は分からない ); }