/// <summary> /// 指したあとの、次の局面を作るだけ☆ /// </summary> /// <param name="src_Sky"></param> /// <param name="finger"></param> /// <param name="masu"></param> /// <param name="pside_genTeban"></param> /// <param name="logTag"></param> /// <returns></returns> public static SkyConst Sasu( SkyConst src_Sky, //指定局面 Finger finger, //動かす駒 SyElement masu, //移動先マス bool toNaru //成るなら真 ) { SkyBuffer sky_buf = new SkyBuffer(src_Sky); // 現局面を元に、新規局面を書き換えます。 sky_buf.SetKaisiPside(Conv_Playerside.Reverse(src_Sky.KaisiPside)); // 開始先後を逆転させます。 sky_buf.SetTemezumi(sky_buf.Temezumi + 1); // 1手進めます。 SkyConst src_Sky2 = SkyConst.NewInstance(sky_buf, -1 //sky_bufでもう変えてあるので、そのまま。 ); // 移動先に相手の駒がないか、確認します。 Finger tottaKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky2, masu).ToFirst(); if (tottaKoma != Fingers.Error_1) { // なにか駒を取ったら SyElement akiMasu; if (src_Sky.KaisiPside == Playerside.P1) { akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, src_Sky2); } else { akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, src_Sky2); } RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(tottaKoma).Now); // FIXME:配役あってるか? sky_buf.PutOverwriteOrAdd_Starlight(tottaKoma, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, akiMasu, koma.Komasyurui)));//tottaKoma, } // 駒を1個動かします。 // FIXME: 取った駒はどうなっている? { RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(finger).Now); PieceType komaSyurui = koma.Komasyurui; if (toNaru) { komaSyurui = Util_Komasyurui14.ToNariCase(komaSyurui); } sky_buf.PutOverwriteOrAdd_Starlight(finger, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, masu, komaSyurui))); } return(SkyConst.NewInstance(sky_buf, -1//sky_bufでもう進めてあるので、そのまま。 )); }
/// <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); }