Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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());
        }
Exemplo n.º 3
0
        /// <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:
            // ;
        }