public Json_Val ToJsonVal() { Json_Obj obj = new Json_Obj(); KyokumenWrapper kWrap = this.Value as KyokumenWrapper; if (null != kWrap) { // TODO: ログが大きくなるので、1行で出力したあとに改行にします。 Json_Prop prop = new Json_Prop("kyokumen", Util_Sky.ToJsonVal(kWrap.ToKyokumenConst)); obj.Add(prop); } else { Debug.Fail("this.Value as KyokumenWrapper じゃなかった。"); } return(obj); }
/// <summary> /// 棋譜データを元に、符号リスト1(*1)を出力します。 /// /// *1…「▲2六歩△8四歩▲7六歩」といった書き方。 /// /// </summary> /// <param name="fugoList"></param> public static string ToJapaneseKifuText( KifuTree kifu ) { StringBuilder sb = new StringBuilder(); sb.Append("position "); sb.Append(kifu.GetProperty(KifuTreeImpl.PropName_Startpos)); sb.Append(" moves "); // 採譜用に、新しい対局を用意します。 KifuTree saifuKifu; { saifuKifu = new KifuTreeImpl( new KifuNodeImpl( Util_Sky.NullObjectMove, new KyokumenWrapper(new SkyConst(Util_Sky.New_Hirate())), //日本の符号読取時 Playerside.P2 ) ); saifuKifu.Clear();// 棋譜を空っぽにします。 saifuKifu.SetProperty(KifuTreeImpl.PropName_FirstPside, Playerside.P1); saifuKifu.SetProperty(KifuTreeImpl.PropName_Startpos, "startpos");//平手の初期局面 // FIXME:平手とは限らないのでは? } kifu.ForeachHonpu(kifu.CurNode, (int tesumi, KyokumenWrapper kWrap, Node <ShootingStarlightable, KyokumenWrapper> node6, ref bool toBreak) => { if (0 == tesumi) { goto gt_EndLoop; } FugoJ fugo; //------------------------------ // 符号の追加(記録係) //------------------------------ KyokumenWrapper saifu_kWrap = saifuKifu.CurNode.Value; KifuNode newNode = new KifuNodeImpl( node6.Key, new KyokumenWrapper(saifu_kWrap.ToKyokumenConst), KifuNodeImpl.GetReverseTebanside(((KifuNode)saifuKifu.CurNode).Tebanside) ); // TODO: ↓? ((KifuNode)saifuKifu.CurNode).AppendChildA_New(newNode); saifuKifu.CurNode = newNode; RO_Star_Koma koma = Util_Koma.AsKoma(((ShootingStarlightable)node6.Key).LongTimeAgo); fugo = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma.Haiyaku)](node6.Key, saifu_kWrap);//「▲2二角成」なら、馬(dst)ではなくて角(src)。 sb.Append(fugo.ToText_UseDou(node6)); gt_EndLoop: ; }); return(sb.ToString()); }
/// <summary> /// これが通称【水際のいんちきプログラム】なんだぜ☆ /// 必要により、【成り】の指し手を追加します。 /// </summary> public static void AddNariMove( KifuNode node_yomiCur, KifuNode hubNode ) { Dictionary <string, ShootingStarlightable> newMoveList = new Dictionary <string, ShootingStarlightable>(); hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { RO_Star_Koma srcKoma = Util_Koma.AsKoma(nextNode.Key.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(nextNode.Key.Now); bool isPromotionable; if (!Converter04.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { // エラー goto gt_Next1; } if (isPromotionable) { ShootingStarlightable move = new RO_ShootingStarlight( //figKoma,//駒 srcKoma,// 移動元 new RO_Star_Koma( dstKoma.Pside, dstKoma.Masu, KomaSyurui14Array.ToNariCase(dstKoma.Syurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 string moveStr = Util_Sky.ToSfenMoveText(move);//重複防止用のキー if (!newMoveList.ContainsKey(moveStr)) { newMoveList.Add(moveStr, move); } } gt_Next1: ; }); // 新しく作った【成り】の指し手を追加します。 foreach (ShootingStarlightable newMove in newMoveList.Values) { // 指す前の駒 RO_Star_Koma sasumaenoKoma = Util_Koma.AsKoma(newMove.LongTimeAgo); // 指した駒 RO_Star_Koma sasitaKoma = Util_Koma.AsKoma(newMove.Now); // 現局面 SkyConst src_Sky = node_yomiCur.Value.ToKyokumenConst; // 指す前の駒を、盤上のマス目で指定 Finger figSasumaenoKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, sasumaenoKoma.Masu).ToFirst(); // 新たな局面 KyokumenWrapper kyokumenWrapper = new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, figSasumaenoKoma, sasitaKoma.Masu, KifuNodeImpl.GetReverseTebanside(node_yomiCur.Tebanside))); try { string moveStr = Util_Sky.ToSfenMoveText(newMove); if (!hubNode.ContainsKey_NextNodes(moveStr)) { // 指し手が既存でない局面だけを追加します。 hubNode.Add_NextNode( moveStr, new KifuNodeImpl( newMove, kyokumenWrapper,//node_yomiCur.Value,//FIXME: 成りの手を指した局面を作りたい。 KifuNodeImpl.GetReverseTebanside(node_yomiCur.Tebanside) ) ); } } catch (Exception ex) { // 既存の指し手 StringBuilder sb = new StringBuilder(); { hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { sb.Append("「"); sb.Append(Util_Sky.ToSfenMoveText(nextNode.Key)); sb.Append("」"); }); } //>>>>> エラーが起こりました。 // どうにもできないので ログだけ取って、上に投げます。 Logger.Error(ex.GetType().Name + " " + ex.Message + ":新しく作った「成りの指し手」を既存ノードに追加していた時です。:追加したい指し手=「" + Util_Sky.ToSfenMoveText(newMove) + "」既存の手=" + sb.ToString()); throw; } } // gt_EndMethod: // ; }