Пример #1
0
        /// <summary>
        /// 用途例:持ち駒を確認するために使います。
        /// </summary>
        /// <param name="hkomas_gen_MOTI"></param>
        /// <returns></returns>
        public static string JsonElements_KomaHandles(bool enableLog, SkyConst src_Sky, List <int> hKomas, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

            //sb.AppendLine("            [");
            sb.AppendLine("                { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },");


            foreach (int hKoma in hKomas)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(hKoma).Now);


                string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky, hKoma, "");
                sb.AppendLine("                { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい?
            }



            sb.AppendLine("                { act:\"drawText\", text:\"" + comment + "\"  , x:0, y:20 },");

            //sb.AppendLine("            ],");

gt_EndMethod:
            return(sb.ToString());
        }
Пример #2
0
        public static Dictionary <ShootingStarlightable, KyokumenWrapper> KomabetuMasusToMovebetuSky(
            List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky, Playerside pside)
        {
            Dictionary <ShootingStarlightable, KyokumenWrapper> result = new Dictionary <ShootingStarlightable, KyokumenWrapper>();


            sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                foreach (SyElement dstMasu in value.Elements)
                {
                    ShootingStarlightable move = Util_Sky.New(
                        //key,
                        new RO_Star_Koma(pside, koma.Masu, koma.Haiyaku),
                        new RO_Star_Koma(pside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。
                        PieceType.None
                        );

                    result.Add(move, new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, key, dstMasu, pside)));
                }
            });


            return(result);
        }
Пример #3
0
        /// <summary>
        /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        ///
        /// TODO: 打ち歩詰めチェック
        ///
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static List_OneAndMulti <Finger, SySet <SyElement> > Get_PotentialMove_Motikoma(
            SkyConst src_Sky,
            Fingers fingers,
            SySet <SyElement> okenaiMasus
            )
        {
            // 「どの持ち駒を」「どこに置いたとき」「どこに利きがある」のコレクション。
            List_OneAndMulti <Finger, SySet <SyElement> > resultOmm = new List_OneAndMulti <Finger, SySet <SyElement> >();

            foreach (Finger donoKoma in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。

                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(donoKoma).Now);


                PieceType syurui = Haiyaku184Array.Syurui(koma.Haiyaku);

                // 置ける升
                SySet <SyElement> okeruMasus = Util_Sky.KomaKidou_Potential(donoKoma, src_Sky);

                // 置けない升を引きます。
                okeruMasus = okeruMasus.Minus_Closed(okenaiMasus);

                if (syurui == PieceType.P)
                {
                    // 二歩チェック

                    int suji;
                    Util_MasuNum.MasuToSuji(koma.Masu, out suji);

                    Fingers sujiKomas = Util_Sky.Fingers_InSuji(src_Sky, suji);

                    Starlight fu      = src_Sky.StarlightIndexOf(donoKoma);
                    Fingers   existFu = Util_Sky.Matches(fu, src_Sky, sujiKomas);

                    if (0 < existFu.Count)
                    {
                        // 二歩だ☆!
                        goto gt_Next;
                    }

                    // TODO:打ち歩詰めチェック
                }


                if (!okeruMasus.IsEmptySet())
                {
                    // 空でないなら
                    resultOmm.AddNew(donoKoma, okeruMasus);
                }

gt_Next:
                ;
            }

            return(resultOmm);
        }
Пример #4
0
        public void Log3(
            SkyConst src_Sky,
            Playerside tebanKurau,       //手番(喰らう側)
            Playerside tebanSeme,        //手番(利きを調べる側)
            Fingers fingers_kurau_IKUSA, //戦駒(喰らう側)
            Fingers fingers_kurau_MOTI,  // 持駒(喰らう側)
            Fingers fingers_seme_IKUSA,  //戦駒(利きを調べる側)
            Fingers fingers_seme_MOTI    // 持駒(利きを調べる側)
            )
        {
            // 攻め手の駒の位置
            GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove);

            foreach (Finger finger in fingers_seme_IKUSA.Items)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                Gkl_KomaMasu km = new Gkl_KomaMasu(
                    Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                    Util_Masu.AsMasuNumber(koma.Masu)
                    );
                boardLog_clone.KomaMasu1.Add(km);
            }

            foreach (Finger finger in fingers_kurau_IKUSA.Items)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                this.BrdMove.KomaMasu2.Add(new Gkl_KomaMasu(
                                               Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                                               Util_Masu.AsMasuNumber(koma.Masu)
                                               ));
            }

            foreach (Finger finger in fingers_seme_MOTI.Items)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                Gkl_KomaMasu km = new Gkl_KomaMasu(
                    Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                    Util_Masu.AsMasuNumber(koma.Masu)
                    );
                this.BrdMove.KomaMasu3.Add(km);
            }

            foreach (Finger finger in fingers_kurau_MOTI.Items)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                this.BrdMove.KomaMasu4.Add(new Gkl_KomaMasu(
                                               Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                                               Util_Masu.AsMasuNumber(koma.Masu)
                                               ));
            }
            this.BrdMove = boardLog_clone;
        }
Пример #5
0
        public static string MoveToStringForLog(ShootingStarlightable move)
        {
            string moveInfo;

            RO_Star_Koma koma = Util_Koma.AsKoma(move.Now);

            moveInfo = KomaSyurui14Array.ToIchimoji(Haiyaku184Array.Syurui(koma.Haiyaku));

            return(moveInfo);
        }
Пример #6
0
        /// <summary>
        /// スプライト→駒
        /// </summary>
        /// <param name="fingers"></param>
        /// <param name="src_Sky"></param>
        /// <returns></returns>
        public static SySet <SyElement> Fingers_ToMasus(Fingers fingers, SkyConst src_Sky)
        {
            SySet <SyElement> masus = new SySet_Default <SyElement>("何かの升");

            foreach (Finger finger in fingers.Items)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                masus.AddElement(koma.Masu);
            }

            return(masus);
        }
Пример #7
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 棋譜用の符号テキスト(*1)を作ります。
        /// ************************************************************************************************************************
        ///
        ///         *1…「▲5五銀上」など。
        ///
        ///         “同”表記に「置き換えない」バージョンです。
        ///
        /// </summary>
        /// <param name="move"></param>
        /// <param name="previousKomaP"></param>
        /// <returns></returns>
        public string ToText_NoUseDou(
            RO_ShootingStarlight move
            )
        {
            StringBuilder sb = new StringBuilder();

            RO_Star_Koma koma = Util_Koma.AsKoma(move.Now);

            sb.Append(Converter04.Pside_ToStr(koma.Pside));

            //------------------------------
            // “同”に変換せず、“筋・段”をそのまま出します。
            //------------------------------
            int suji;
            int dan;

            Util_MasuNum.MasuToSuji(koma.Masu, out suji);
            Util_MasuNum.MasuToDan(koma.Masu, out dan);

            sb.Append(ConverterKnSh.Int_ToArabiaSuji(suji));
            sb.Append(ConverterKnSh.Int_ToKanSuji(dan));

            //------------------------------
            // “歩”とか。“全”ではなく“成銀”    <符号用>
            //------------------------------
            sb.Append(KomaSyurui14Array.Fugo[(int)this.Syurui]);

            //------------------------------
            // “右”とか
            //------------------------------
            sb.Append(Converter04.MigiHidari_ToStr(this.MigiHidari));

            //------------------------------
            // “寄”とか
            //------------------------------
            sb.Append(Converter04.AgaruHiku_ToStr(this.AgaruHiku));

            //------------------------------
            // “成”とか
            //------------------------------
            sb.Append(Converter04.Nari_ToStr(this.Nari));

            //------------------------------
            // “打”とか
            //------------------------------
            sb.Append(Converter04.Bool_ToDa(this.DaHyoji));

            return(sb.ToString());
        }
Пример #8
0
        private static void Log1(
            MoveGenGenjo genjo,
            Node <ShootingStarlightable, KyokumenWrapper> node_yomiCur,
            GraphicalLog_Board logBrd_move1
            )
        {
            logBrd_move1.moveOrNull = ((KifuNode)node_yomiCur).Key;


            RO_Star_Koma srcKoma = Util_Koma.AsKoma(logBrd_move1.moveOrNull.LongTimeAgo);
            RO_Star_Koma dstKoma = Util_Koma.AsKoma(logBrd_move1.moveOrNull.Now);


            // ログ試し
            logBrd_move1.Arrow.Add(new Gkl_Arrow(Util_Masu.AsMasuNumber(srcKoma.Masu), Util_Masu.AsMasuNumber(dstKoma.Masu)));
            genjo.Args.LogF_moveKiki.boards.Add(logBrd_move1);
        }
Пример #9
0
        /// <summary>
        /// 変換「自駒が動ける升」→「自駒が動ける手」
        /// </summary>
        /// <param name="kmDic_Self"></param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, ShootingStarlightable> KomabetuMasusToKomabetuMove(
            Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self,
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode_genzai
            )
        {
            Maps_OneAndMulti <Finger, ShootingStarlightable> komaTe = new Maps_OneAndMulti <Finger, ShootingStarlightable>();

            //
            //
            kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                foreach (SyElement masuHandle in value.Elements)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(siteiNode_genzai.Value.ToKyokumenConst.StarlightIndexOf(key).Now);


                    ShootingStarlightable move = new RO_ShootingStarlight(
                        //key,
                        // 元
                        koma,
                        // 先
                        new RO_Star_Koma(
                            koma.Pside,
                            Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(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);
        }
Пример #10
0
        public static string MoveToStringForLog(ShootingStarlightable move, Playerside pside_genTeban)
        {
            string result;

            if (null == move)
            {
                result = "合法手はありません。";
                goto gt_EndMethod;
            }

            RO_Star_Koma koma = Util_Koma.AsKoma(move.Now);

            // 指し手を「△歩」といった形で。
            result = KomaSyurui14Array.ToNimoji(Haiyaku184Array.Syurui(koma.Haiyaku), pside_genTeban);

gt_EndMethod:
            return(result);
        }
Пример #11
0
        /// <summary>
        /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」
        /// </summary>
        /// <param name="komaBETUSusumeruMasus"></param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, ShootingStarlightable> KomaBETUSusumeruMasusToKomaBETUAllMoves(
            List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus,
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode_genzai
            )
        {
            Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove = new Maps_OneAndMulti <Finger, ShootingStarlightable>();

            komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) =>
            {
                RO_Star_Koma srcKoma = Util_Koma.AsKoma(siteiNode_genzai.Value.ToKyokumenConst.StarlightIndexOf(figKoma).Now);

                foreach (SyElement susumuMasu in susumuMasuSet.Elements)
                {
                    // 移動先の駒
                    RO_Star_Koma dstKoma = new RO_Star_Koma(
                        srcKoma.Pside,
                        Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(susumuMasu)],
                        srcKoma.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい
                        );

                    ShootingStarlightable move = new RO_ShootingStarlight(
                        //figKoma,//駒
                        srcKoma,       // 移動元
                        dstKoma,       // 移動先
                        PieceType.None //取った駒不明
                        );
                    komabetuAllMove.AddOverwrite(figKoma, move);

                    // これが通称【水際のいんちきプログラム】なんだぜ☆
                    // 必要により、【成り】の指し手を追加します。
                    Converter04.AddKomaBETUAllNariMoves(
                        komabetuAllMove,
                        figKoma,
                        srcKoma,
                        dstKoma
                        );
                }
            });

            //Converter04.AssertNariMove(komabetuAllMove, "#KomabetuMasus_ToKomabetuAllMove");//ここはOK

            return(komabetuAllMove);
        }
Пример #12
0
        /// <summary>
        /// 指し手一覧を、駒毎に分けます。
        /// </summary>
        /// <param name="hubNode">指し手一覧</param>
        /// <param name="logTag"></param>
        /// <returns>駒毎の、全指し手</returns>
        public Maps_OneAndMulti <Finger, ShootingStarlightable> SplitMoveByKoma(Node <ShootingStarlightable, KyokumenWrapper> hubNode)
        {
            SkyConst src_Sky = this.Value.ToKyokumenConst;


            Maps_OneAndMulti <Finger, ShootingStarlightable> enable_teMap = new Maps_OneAndMulti <Finger, ShootingStarlightable>();


            hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) =>
            {
                ShootingStarlightable nextMove = nextNode.Key;

                Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, Util_Koma.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst();

                enable_teMap.AddOverwrite(figKoma, nextMove);
            });

            return(enable_teMap);
        }
Пример #13
0
        /// <summary>
        /// ハブ・ノードの次ノード・リストをJSON化します。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="src_Sky_base"></param>
        /// <param name="hubNode"></param>
        /// <param name="comment"></param>
        /// <param name="logTag"></param>
        /// <returns></returns>
        public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <ShootingStarlightable, KyokumenWrapper> hubNode, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

            hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> node, ref bool toBreak) =>
            {
                ShootingStarlightable move = node.Key;

                RO_Star_Koma srcKoma1 = Util_Koma.AsKoma(move.LongTimeAgo);
                RO_Star_Koma dstKoma  = Util_Koma.AsKoma(move.Now);


                Finger srcKoma2 = Util_Sky.Fingers_AtMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst();

                // 駒1つ
                PieceType ks14 = Haiyaku184Array.Syurui(dstKoma.Haiyaku);

                sb.AppendLine("            [");

                // マスの色
                sb.AppendLine("                { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },");

                // マス
                sb.AppendLine("                { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");


                string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, srcKoma2, "");
                sb.AppendLine("                { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");//FIXME:おかしい?

                // コメント
                sb.AppendLine("                { act:\"drawText\", text:\"" + comment + "\"  , x:0, y:20 },");

                sb.AppendLine("            ],");
            });

gt_EndMethod:
            return(sb.ToString());
        }
Пример #14
0
        public static SkyConst Sasu(
            SkyConst src_Sky,         //現局面
            Finger finger,            //動かす駒
            SyElement masu,           //移動先マス
            Playerside pside_genTeban //動かす駒がどちらのプレイヤーのものか
            )
        {
            SkyBuffer dst_Sky = new SkyBuffer(src_Sky.Clone()); // 現局面をコピーします。

            // 移動先に相手の駒がないか、確認します。
            Finger tottaKoma = Util_Sky.Fingers_AtMasuNow(new SkyConst(dst_Sky), masu).ToFirst();

            if (tottaKoma != Fingers.Error_1)
            {
                // なにか駒を取ったら
                SyElement akiMasu;

                if (pside_genTeban == Playerside.P1)
                {
                    akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, new SkyConst(dst_Sky));
                }
                else
                {
                    akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, new SkyConst(dst_Sky));
                }


                RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(tottaKoma).Now);

                // FIXME:配役あってるか?
                dst_Sky.AddOverwriteStarlight(tottaKoma, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, akiMasu, koma.Syurui)));//tottaKoma,
            }

            // 駒を1個動かします。
            // FIXME: 取った駒はどうなっている?
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(finger).Now);

                dst_Sky.AddOverwriteStarlight(finger, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, masu, koma.Syurui)));//finger,
            }

            return(new SkyConst(dst_Sky));
        }
Пример #15
0
        private void ToBanObject201(SkyConst src_Sky)
        {
            this.psideIsBlack = src_Sky.PsideIsBlack;// TODO:

            //Util_Sky.Assert_Honshogi(src_Sky);


            // 将棋の駒40個の場所を確認します。
            foreach (Finger finger in src_Sky.Fingers_All().Items)
            {
                Starlightable light  = src_Sky.StarlightIndexOf(finger).Now;
                RO_Star_Koma  komaKs = Util_Koma.AsKoma(light);

                Debug.Assert(Util_MasuNum.OnAll(Util_Masu.AsMasuNumber(komaKs.Masu)), "(int)koma.Masu=[" + Util_Masu.AsMasuNumber(komaKs.Masu) + "]");//升番号

                this.AddKoma(komaKs.Masu,
                             new RO_Star_Koma(komaKs)
                             );
            }
        }
Пример #16
0
        /// <summary>
        /// 次の局面の一覧をもった、入れ物ノードを返します。
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="pside_genTeban"></param>
        /// <returns></returns>
        public static KifuNode ToNextNodes_AsHubNode(
            Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove,
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode,
            Playerside pside_genTeban)
        {
            KifuNode hubNode = new KifuNodeImpl(null, null, Playerside.Empty);//蝶番

#if DEBUG
            string dump = komabetuAllMove.Dump();
#endif

            foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry1 in komabetuAllMove.Items)
            {
                Finger figKoma = entry1.Key;// 駒

                // 駒の動ける升全て
                foreach (ShootingStarlightable move in entry1.Value)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(move.Now);

                    SyElement masu = koma.Masu;

                    SkyConst nextSky = Util_Sasu.Sasu(siteiNode.Value.ToKyokumenConst, figKoma, masu, pside_genTeban);

                    Node <ShootingStarlightable, KyokumenWrapper> nextNode = new KifuNodeImpl(move, new KyokumenWrapper(nextSky), KifuNodeImpl.GetReverseTebanside(pside_genTeban));//次のノード

                    string sfenText = Util_Sky.ToSfenMoveText(move);
                    if (hubNode.ContainsKey_NextNodes(sfenText))
                    {
                        // 既存の指し手なら無視
                        System.Console.WriteLine("既存の指し手なので無視します。sfenText=[" + sfenText + "]");
                    }
                    else
                    {
                        hubNode.Add_NextNode(Util_Sky.ToSfenMoveText(move), nextNode);
                    }
                }
            }

            return(hubNode);
        }
Пример #17
0
        /// <summary>
        /// 駒別マスをJSON化します。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="src_Sky_base"></param>
        /// <param name="km_move"></param>
        /// <param name="comment"></param>
        /// <returns></returns>
        public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment)
        {
            StringBuilder sb = new StringBuilder();

            if (!enableLog)
            {
                goto gt_EndMethod;
            }

            km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                // 駒1つ
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky_base.StarlightIndexOf(key).Now);

                PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku);

                sb.AppendLine("            [");

                // マスの色
                sb.AppendLine("                { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },");

                // 全マス
                foreach (Basho masu in value.Elements)
                {
                    sb.AppendLine("                { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(masu) + " },");
                }


                string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, key, "");
                sb.AppendLine("                { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい?

                // コメント
                sb.AppendLine("                { act:\"drawText\", text:\"" + comment + "\"  , x:0, y:20 },");

                sb.AppendLine("            ],");
            });

gt_EndMethod:
            return(sb.ToString());
        }
Пример #18
0
        public static string Finger_ToString(SkyConst src_Sky, Finger finger, string extentionWithDot)
        {
            string komaImg = "";

            if ((int)finger < Finger_Honshogi.Items_KomaOnly.Length)
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);

                Playerside pside = koma.Pside;
                PieceType  ks14  = Haiyaku184Array.Syurui(koma.Haiyaku);

                komaImg = Util_GraphicalLog.PsideKs14_ToString(pside, ks14, extentionWithDot);
            }
            else
            {
                komaImg = Util_GraphicalLog.PsideKs14_ToString(Playerside.Empty, PieceType.None, extentionWithDot);
            }



            return(komaImg);
        }
Пример #19
0
        public void Log4(
            SkyConst src_Sky,
            Playerside tebanSeme,//手番(利きを調べる側)
            Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA
            )
        {
            // 戦駒の移動可能場所
            GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove);

            kmMove_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now);

                string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), "");

                foreach (Basho masu in value.Elements)
                {
                    boardLog_clone.Masu_theMove.Add((int)masu.MasuNumber);
                }
            });

            this.BrdMove = boardLog_clone;
        }
Пример #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="back"></param>
        /// <returns></returns>
        private static PieceType Kifusasi30_Naru(
            ShootingStarlightable move,
            bool back)
        {
            //------------------------------------------------------------
            // 確定  :  移動先升
            //------------------------------------------------------------
            PieceType syurui2;

            {
                //----------
                // 成るかどうか
                //----------

                RO_Star_Koma koma = Util_Koma.AsKoma(move.Now);


                if (Util_Sky.IsNattaMove(move))
                {
                    if (back)
                    {
                        // 正順で成ったのなら、巻戻しでは「非成」に戻します。
                        syurui2 = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku));
                    }
                    else
                    {
                        syurui2 = Haiyaku184Array.Syurui(koma.Haiyaku);
                    }
                }
                else
                {
                    syurui2 = Haiyaku184Array.Syurui(koma.Haiyaku);
                }
            }

            return(syurui2);
        }
Пример #21
0
        /// <summary>
        /// 駒台の空いている升を返します。
        /// </summary>
        /// <param name="okiba">先手駒台、または後手駒台</param>
        /// <param name="uc_Main">メインパネル</param>
        /// <returns>置ける場所。無ければヌル。</returns>
        public static SyElement GetKomadaiKomabukuroSpace(Okiba okiba, SkyConst src_Sky)
        {
            SyElement akiMasu = Masu_Honshogi.Error;

            // 先手駒台または後手駒台の、各マスの駒がある場所を調べます。
            bool[] exists = new bool[Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH];//駒台スペースは40マスです。


            src_Sky.Foreach_Starlights((Finger finger, Starlight komaP, ref bool toBreak) =>
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(komaP.Now);

                if (Util_Masu.GetOkiba(koma.Masu) == okiba)
                {
                    exists[
                        Util_Masu.AsMasuNumber(koma.Masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))
                    ] = true;
                }
            });


            //駒台スペースは40マスです。
            for (int i = 0; i < Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH; i++)
            {
                if (!exists[i])
                {
                    akiMasu = Masu_Honshogi.Items_All[i + Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))];
                    goto gt_EndMethod;
                }
            }

gt_EndMethod:

            //System.C onsole.WriteLine("ゲット駒台駒袋スペース=" + akiMasu);

            return(akiMasu);
        }
Пример #22
0
        /// <summary>
        /// 将棋盤上での検索
        /// </summary>
        /// <param name="srcAll">候補マス</param>
        /// <param name="komas"></param>
        /// <returns></returns>
        public static bool Hit_JfugoParser(
            Playerside pside, PieceType syurui, SySet <SyElement> srcAll,
            KifuTree kifu,
            out Finger foundKoma)
        {
            SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst;

            bool hit = false;

            foundKoma = Fingers.Error_1;


            foreach (Basho masu1 in srcAll.Elements)//筋・段。(先後、種類は入っていません)
            {
                foreach (Finger koma1 in Finger_Honshogi.Items_KomaOnly)
                {
                    RO_Star_Koma koma2 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma1).Now);


                    if (pside == koma2.Pside &&
                        Okiba.ShogiBan == Util_Masu.GetOkiba(koma2.Masu) &&
                        KomaSyurui14Array.Matches(syurui, Haiyaku184Array.Syurui(koma2.Haiyaku)) &&
                        masu1 == koma2.Masu
                        )
                    {
                        // 候補マスにいた
                        //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                        hit       = true;
                        foundKoma = koma1;
                        break;
                    }
                }
            }

            return(hit);
        }
Пример #23
0
        ///// <summary>
        ///// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』
        ///// </summary>
        //public static List<Couple<Finger,Masu>> MovebetuSky_ToKamList(
        //    SkyConst src_Sky_genzai,
        //    Dictionary<ShootingStarlightable, SkyBuffer> ss,
        //    LarabeLoggerTag logTag
        //    )
        //{
        //    List<Couple<Finger, Masu>> kmList = new List<Couple<Finger, Masu>>();

        //    // TODO:
        //    foreach(KeyValuePair<ShootingStarlightable,SkyBuffer> entry in ss)
        //    {
        //        RO_Star_Koma srcKoma = Util_Koma.AsKoma(entry.Key.LongTimeAgo);
        //        RO_Star_Koma dstKoma = Util_Koma.AsKoma(entry.Key.Now);


        //            Masu srcMasu = srcKoma.Masu;
        //            Masu dstMasu = dstKoma.Masu;

        //            Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai,srcMasu).ToFirst();

        //            kmList.Add(new Couple<Finger, Masu>(figKoma, dstMasu));
        //    }

        //    return kmList;
        //}

        /// <summary>
        /// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』
        /// </summary>
        public static List <Couple <Finger, SyElement> > NextNodes_ToKamList(
            SkyConst src_Sky_genzai,
            Node <ShootingStarlightable, KyokumenWrapper> hubNode
            )
        {
            List <Couple <Finger, SyElement> > kmList = new List <Couple <Finger, SyElement> >();

            // TODO:
            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);


                SyElement srcMasu = srcKoma.Masu;
                SyElement dstMasu = dstKoma.Masu;

                Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai, srcMasu).ToFirst();

                kmList.Add(new Couple <Finger, SyElement>(figKoma, dstMasu));
            });

            return(kmList);
        }
Пример #24
0
        /// <summary>
        /// 指定された局面で、指定された手番の駒の、利きマスを算出します。
        /// 持ち駒は盤上にないので、利きを調べる必要はありません。
        ///
        /// 「手目」は判定できません。
        ///
        /// </summary>
        /// <param name="kouho"></param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logger"></param>
        public static List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect(
            bool enableLog,
            bool isHonshogi,
            SkyConst src_Sky,
            Playerside pside_genTeban3,
            bool isAiteban,
            GraphicalLog_File logF_kiki,
            string logBrd_caption,
            int yomuDeep_forLog,//脳内読み手数
            int tesumi_yomiCur_forLog,
            ShootingStarlightable move_forLog
            )
        {
            GraphicalLog_Board logBrd_kiki = new GraphicalLog_Board();

            logBrd_kiki.Caption        = logBrd_caption;// "利き_"
            logBrd_kiki.Tesumi         = tesumi_yomiCur_forLog;
            logBrd_kiki.NounaiYomiDeep = yomuDeep_forLog;
            //logBrd_kiki.Score = 0.0d;
            logBrd_kiki.GenTeban = pside_genTeban3;// 現手番
            logF_kiki.boards.Add(logBrd_kiki);

            // 《1》
            List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き

            {
                // 《1.1》
                Playerside tebanSeme;  //手番(利きを調べる側)
                Playerside tebanKurau; //手番(喰らう側)
                {
                    if (isAiteban)
                    {
                        tebanSeme  = Converter04.AlternatePside(pside_genTeban3);
                        tebanKurau = pside_genTeban3;
                    }
                    else
                    {
                        tebanSeme  = pside_genTeban3;
                        tebanKurau = Converter04.AlternatePside(pside_genTeban3);
                    }

                    if (Playerside.P1 == tebanSeme)
                    {
                        logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente;
                    }
                    else if (Playerside.P2 == tebanSeme)
                    {
                        logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote;
                    }
                }


                // 《1.2》
                Fingers fingers_seme_IKUSA;  //戦駒(利きを調べる側)
                Fingers fingers_kurau_IKUSA; //戦駒(喰らう側)
                Fingers dust1;
                Fingers dust2;

                Util_Things.AAABAAAA_SplitGroup(
                    out fingers_seme_IKUSA,
                    out fingers_kurau_IKUSA,
                    out dust1,
                    out dust2,
                    src_Sky,
                    tebanSeme,
                    tebanKurau
                    );


                // 攻め手の駒の位置
                GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(logBrd_kiki);
                foreach (Finger finger in fingers_seme_IKUSA.Items)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                    Gkl_KomaMasu km = new Gkl_KomaMasu(
                        Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                        Util_Masu.AsMasuNumber(koma.Masu)
                        );
                    boardLog_clone.KomaMasu1.Add(km);
                }

                foreach (Finger finger in fingers_kurau_IKUSA.Items)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                    logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu(
                                                  Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                                                  Util_Masu.AsMasuNumber(koma.Masu)
                                                  ));
                }

                logBrd_kiki = boardLog_clone;



                // 《1.3》
                SySet <SyElement> masus_seme_IKUSA  = Converter04.Fingers_ToMasus(fingers_seme_IKUSA, src_Sky);  // 盤上のマス(利きを調べる側の駒)
                SySet <SyElement> masus_kurau_IKUSA = Converter04.Fingers_ToMasus(fingers_kurau_IKUSA, src_Sky); // 盤上のマス(喰らう側の駒)

                // 駒のマスの位置は、特にログに取らない。

                // 《1.4》
                Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA(
                    fingers_seme_IKUSA,//この中身がおかしい。
                    masus_seme_IKUSA,
                    masus_kurau_IKUSA,
                    src_Sky,
                    enableLog,
                    Converter04.MoveToStringForLog(move_forLog, pside_genTeban3)
                    );// 利きを調べる側の利き(戦駒)

                // 戦駒の利き
                logBrd_kiki = new GraphicalLog_Board(logBrd_kiki);
                kmEffect_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                    string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), "");

                    foreach (Basho masu in value.Elements)
                    {
                        boardLog_clone.Masu_theEffect.Add((int)masu.MasuNumber);
                    }
                });

                logBrd_kiki = boardLog_clone;


                // 《1》 = 《1.4》の戦駒+持駒
                sMs_effect.AddRange_New(kmEffect_seme_IKUSA);
            }

            return(sMs_effect);
        }
Пример #25
0
        /// <summary>
        /// 指定された手の中から、王手局面を除外します。
        ///
        /// 王手回避漏れを防ぎたいんだぜ☆
        /// </summary>
        /// <param name="km_available">自軍の各駒の移動できる升セット</param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logTag"></param>
        public static KifuNode LA_RemoveMate(
            bool isHonshogi,
            Maps_OneAndMulti <Finger, ShootingStarlightable> genTeban_komabetuAllMove1, // 現手番の、どの駒が、どんな手を指すことができるか
            int yomuDeep,                                                               //脳内読み手数
            int tesumi_yomiGenTeban,
            Playerside pside_yomiGenTeban,
            KifuNode siteiNode_yomiGenTeban,
            bool enableLog,
            GraphicalLog_File logF_kiki,
            string hint)
        {
            Node <ShootingStarlightable, KyokumenWrapper> hubNode = UtilKomabetuMove.ToNextNodes_AsHubNode(
                genTeban_komabetuAllMove1, siteiNode_yomiGenTeban, pside_yomiGenTeban
                );                                                    // ハブ・ノード自身はダミーノードなんだが、子ノードに、次のノードが入っている。

            Converter04.AssertNariMove(hubNode, "#LA_RemoveMate(1)"); //ここはok
            Util_LegalMove.Log1(hubNode, enableLog, tesumi_yomiGenTeban, hint);


            if (isHonshogi)
            {
                // 王手が掛かっている局面を除きます。

                Util_LegalMove.LAA_RemoveNextNode_IfMate(
                    hubNode,
                    enableLog,
                    yomuDeep,
                    tesumi_yomiGenTeban,
                    pside_yomiGenTeban,
                    logF_kiki);
            }
            Converter04.AssertNariMove(hubNode, "#LA_RemoveMate(2)王手局面削除直後");//ここはok


            // 「指し手一覧」を、「駒別の全指し手」に分けます。
            Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMoves2 = siteiNode_yomiGenTeban.SplitMoveByKoma(hubNode);

            Converter04.AssertNariMove(komabetuAllMoves2, "#LA_RemoveMate(3)更に変換後");//ここはok

            //
            // 「駒別の指し手一覧」を、「駒別の進むマス一覧」になるよう、データ構造を変換します。
            //
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry in komabetuAllMoves2.Items)
            {
                Finger finger = entry.Key;
                List <ShootingStarlightable> teList = entry.Value;

                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> masus_PotentialMove = new SySet_Default <SyElement>("ポテンシャルムーブ");
                foreach (ShootingStarlightable te in teList)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(te.Now);

                    masus_PotentialMove.AddElement(koma.Masu);
                }

                if (!masus_PotentialMove.IsEmptySet())
                {
                    // 空でないなら
                    Util_KomabetuMasus.AddOverwrite(komabetuSusumuMasus, finger, masus_PotentialMove);
                }
            }

            // まず、ディクショナリー構造へ変換。
            Dictionary <ShootingStarlightable, KyokumenWrapper> movebetuSky = Converter04.KomabetuMasus_ToMovebetuSky(
                komabetuSusumuMasus, siteiNode_yomiGenTeban.Value.ToKyokumenConst, pside_yomiGenTeban);

            // 棋譜ノード構造へ変換。
            return(Converter04.MovebetuSky_ToHubNode(movebetuSky, KifuNodeImpl.GetReverseTebanside(pside_yomiGenTeban)));
        }
Пример #26
0
        /// <summary>
        /// 利きに飛び込んでいないか(王手されていないか)、調べます。
        ///
        /// GetAvailableMove()の中では使わないでください。循環してしまいます。
        /// </summary>
        public static bool LAAA_KingSuicide(
            bool enableLog,
            SkyConst src_Sky,          //調べたい局面
            int yomuDeep,              //脳内読み手数
            int tesumi_yomiCur_forLog, //読み進めている現在の手目
            Playerside pside_genTeban, //現手番側
            GraphicalLog_File logF_kiki,
            ShootingStarlightable move_forLog
            )
        {
            bool isHonshogi = true;

            System.Diagnostics.Debug.Assert(src_Sky.Count == Masu_Honshogi.HONSHOGI_KOMAS);

            // 「相手の駒を動かしたときの利き」リスト
            // 持ち駒はどう考える?「駒を置けば、思い出王手だってある」
            List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect_aiTeban = Util_LegalMove.LAAAA_GetEffect(
                enableLog,
                isHonshogi,
                src_Sky,
                pside_genTeban,
                true,// 相手盤の利きを調べます。
                logF_kiki,
                "玉自殺チェック",
                yomuDeep,
                tesumi_yomiCur_forLog,
                move_forLog);


            // 現手番側が受け手に回ったとします。現手番の、王の座標
            SyElement genTeban_kingMasu;

            if (Playerside.P2 == pside_genTeban)
            {
                // 現手番は、後手

                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now);

                genTeban_kingMasu = koma.Masu;
            }
            else
            {
                // 現手番は、先手
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now);

                genTeban_kingMasu = koma.Masu;
            }


            // 相手の利きに、自分の王がいるかどうか確認します。
            bool mate = false;

            sMs_effect_aiTeban.Foreach_Entry((Finger koma, SySet <SyElement> kikis, ref bool toBreak) =>
            {
                foreach (Basho kiki in kikis.Elements)
                {
                    if (Util_Masu.AsMasuNumber(genTeban_kingMasu) == (int)kiki.MasuNumber)
                    {
                        mate    = true;
                        toBreak = true;
                    }
                }
            });

            return(mate);
        }
Пример #27
0
        /// <summary>
        /// 次の1手データを作ります(*1)
        ///
        ///         *1…符号1「▲68銀上」を元に、「7968」を作ります。
        ///
        /// <[再生]、[コマ送り]で呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void ExecuteJfugo_FromTextSub(
            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 ShootingStarlightable move,
            KifuTree kifu
            )
        {
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode;
            SkyConst src_Sky = siteiNode.Value.ToKyokumenConst;

            //------------------------------
            // 符号確定
            //------------------------------
            MigiHidari migiHidari = Converter04.Str_ToMigiHidari(strMigiHidari);
            AgaruHiku  agaruHiku  = Converter04.Str_ToAgaruHiku(strAgaruHiku); // 上|引
            NariNarazu nariNarazu = Converter04.Nari_ToBool(strNariNarazu);    //成
            DaHyoji    daHyoji    = Converter04.Str_ToDaHyoji(strDaHyoji);     //打

            PieceType srcSyurui = Converter04.Str_ToSyurui(strSrcSyurui);


            //------------------------------
            //
            //------------------------------
            Playerside pside = Converter04.Pside_ToEnum(strPside);


            SyElement dstMasu;

            if ("同" == strDou)
            {
                // 1手前の筋、段を求めるのに使います。

                RO_Star_Koma koma = Util_Koma.AsKoma(siteiNode.Key.Now);

                dstMasu = koma.Masu;
            }
            else
            {
                dstMasu = Util_Masu.OkibaSujiDanToMasu(
                    Okiba.ShogiBan,
                    ConverterKnSh.Suji_ToInt(strSuji),
                    ConverterKnSh.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)
            {
                //************************************************************
                // 歩
                //************************************************************

                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│  │  │  │
                //├─┼─┼─┤
                //│  │至│  │
                //├─┼─┼─┤
                //│  │E│  │
                //└─┴─┴─┘
                bool isE = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }

                if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
            }
            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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, 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 (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else
            {
                #region エラー
                //************************************************************
                // エラー
                //************************************************************

                #endregion
            }

gt_EndShogiban:

            if (Fingers.Error_1 == foundKoma && utsu)
            {
                // 駒台の駒を(明示的に)打ちます。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


                Fingers komas = Util_Sky.Fingers_ByOkibaPsideSyuruiNow(
                    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 koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(foundKoma).Now);

                srcMasuHandle1 = Util_Masu.AsMasuNumber(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.ToKyokumenConst.Count, "星の光が 1個未満。");

                // 駒台から、該当する駒を探します。
                Fingers daiKomaFgs = Util_Sky.Fingers_ByOkibaPsideSyuruiNow(
                    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 koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(hitKoma).Now);

                srcMasuHandle1 = Util_Masu.AsMasuNumber(koma.Masu);
            }


            PieceType dstSyurui;
            if (NariNarazu.Nari == nariNarazu)
            {
                // 成ります
                dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)srcSyurui];
            }
            else
            {
                // そのままです。
                dstSyurui = srcSyurui;
            }


            // 1手を、データにします。
            move = new RO_ShootingStarlight(
                //foundKoma,//TODO:

                new RO_Star_Koma(
                    pside,
                    Util_Masu.HandleToMasu(srcMasuHandle1),
                    srcSyurui
                    ),

                new RO_Star_Koma(
                    pside,
                    dstMasu,//符号は将棋盤の升目です。
                    dstSyurui
                    ),

                PieceType.None // 符号からは、取った駒の種類は分からないんだぜ☆ だがバグではない☆ あとで調べる☆
                );
        }
Пример #28
0
        /// <summary>
        /// 符号1「7g7f」を元に、move を作ります。
        ///
        /// <[再生]、[コマ送り]で呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void ExecuteSfenMoves_FromTextSub(
            bool isHonshogi,
            string str1,    //123456789 か、 PLNSGKRB
            string str2,    //abcdefghi か、 *
            string str3,    //123456789
            string str4,    //abcdefghi
            string strNari, //+
            out ShootingStarlightable move,
            KifuTree kifu,
            string hint,
            int tesumi_yomiGenTeban//読み進めている現在の手目済
            )
        {
            move = Util_Sky.NullObjectMove;

            SkyConst src_Sky = kifu.NodeAt(tesumi_yomiGenTeban).Value.ToKyokumenConst;

            Debug.Assert(!Util_MasuNum.OnKomabukuro(Util_Masu.AsMasuNumber(((RO_Star_Koma)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), "[" + tesumi_yomiGenTeban + "]手目、駒が駒袋にあった。");

            try
            {
                PieceType uttaSyurui; // 打った駒の種類

                int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI;
                int srcDan  = Util_Koma.CTRL_NOTHING_PROPERTY_DAN;

                if ("*" == str2)
                {
                    //>>>>>>>>>> 「打」でした。

                    Converter04.SfenUttaSyurui(str1, out uttaSyurui);
                }
                else
                {
                    //>>>>>>>>>> 指しました。
                    uttaSyurui = PieceType.None;//打った駒はない☆

                    //------------------------------
                    // 1
                    //------------------------------
                    if (!int.TryParse(str1, out srcSuji))
                    {
                    }

                    //------------------------------
                    // 2
                    //------------------------------
                    srcDan = Converter04.Alphabet_ToInt(str2);
                }

                //------------------------------
                // 3
                //------------------------------
                int suji;
                if (!int.TryParse(str3, out suji))
                {
                }

                //------------------------------
                // 4
                //------------------------------
                int dan;
                dan = Converter04.Alphabet_ToInt(str4);

                Finger koma;

                if ("*" == str2)
                {
                    //>>>>> 「打」でした。
                    Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode;

                    // 駒台から、打った種類の駒を取得
                    koma = Util_Sky.FingerNow_BySyuruiIgnoreCase(
                        siteiNode.Value.ToKyokumenConst,
                        Converter04.Pside_ToKomadai(kifu.CountPside(kifu.CurNode)),//Okiba.Sente_Komadai,//FIXME:
                        uttaSyurui);
                    if (Fingers.Error_1 == koma)
                    {
                        throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。");
                    }

                    //// FIXME: 打のとき、srcSuji、srcDan が Int.Min
                }
                else
                {
                    //>>>>> 打ではないとき
                    koma = Util_Sky.Fingers_AtMasuNow(
                        src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan)
                        ).ToFirst();

                    if (Fingers.Error_1 == koma)
                    {
                        //
                        // エラーの理由:
                        // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど
                        //

                        var sky2 = Util_Sky.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3",
                                                      tesumi_yomiGenTeban);

                        throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗: 将棋盤から [{srcSuji}]筋、[{srcDan}]段 にある駒を掴もうとしましたが、駒がありませんでした。
isHonshogi=[{isHonshogi}]
str1=[{str1}]
str2=[{str2}]
str3=[{str3}]
str4=[{str4}]
strNari=[{strNari}]
hint=[{hint}]
tesumi_yomiGenTeban=[{tesumi_yomiGenTeban}]
局面=sfen {Util_SfenStartposWriter.CreateSfenstring(new StartposExporter(src_Sky), true)}
{sky2}");
                    }
                }


                PieceType dstSyurui;
                PieceType srcSyurui;
                Okiba     srcOkiba;
                SyElement srcMasu;


                if ("*" == str2)
                {
                    //>>>>> 打った駒の場合

                    dstSyurui = uttaSyurui;
                    srcSyurui = uttaSyurui;
                    switch (kifu.CountPside(kifu.CurNode))
                    {
                    case Playerside.P2:
                        srcOkiba = Okiba.Gote_Komadai;
                        break;

                    case Playerside.P1:
                        srcOkiba = Okiba.Sente_Komadai;
                        break;

                    default:
                        srcOkiba = Okiba.Empty;
                        break;
                    }

                    int lastTesumi = kifu.CountTesumi(kifu.CurNode);
                    Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.NodeAt(lastTesumi);

                    Finger srcKoma = Util_Sky.FingerNow_BySyuruiIgnoreCase(siteiNode.Value.ToKyokumenConst, srcOkiba, srcSyurui);

                    RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now);

                    srcMasu = dstKoma.Masu;
                }
                else
                {
                    //>>>>> 盤上の駒を指した場合

                    RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma).Now);


                    dstSyurui = Haiyaku184Array.Syurui(dstKoma.Haiyaku);
                    srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。
                    srcOkiba  = Okiba.ShogiBan;
                    srcMasu   = Util_Masu.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan);
                }


                //------------------------------
                // 5
                //------------------------------
                if ("+" == strNari)
                {
                    // 成りました
                    dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)dstSyurui];
                }


                //------------------------------
                // 結果
                //------------------------------
                // 棋譜
                move = new RO_ShootingStarlight(
                    //koma,//TODO:

                    new RO_Star_Koma(
                        kifu.CountPside(kifu.CurNode),
                        srcMasu,//FIXME:升ハンドルにしたい
                        srcSyurui
                        ),

                    new RO_Star_Koma(
                        kifu.CountPside(kifu.CurNode),
                        Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい
                        dstSyurui
                        ),

                    PieceType.None//符号からは、取った駒は分からない
                    );
            }
            catch (Exception ex)
            {
                //>>>>> エラーが起こりました。

                // どうにもできないので 経路と情報を付け足して 更に外側に投げます。
                throw new Exception($"{ex.GetType().Name}:{ex.Message} in TuginoItte_Sfen.GetData_FromTextSub(A) str1=「{str1}」 str2=「{str2}」 str3=「{str3}」 str4=「{str4}」 strNari=「{strNari}」 ");
            }
        }
Пример #29
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());
        }
Пример #30
0
        /// <summary>
        /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。
        /// </summary>
        /// <param name="input_node"></param>
        /// <param name="playerInfo"></param>
        /// <returns></returns>
        public override void Keisan(out KyHyokaItem kyokumenScore, KyHandanArgs args)
        {
            double   score;
            SkyConst src_Sky = args.Node.Value.ToKyokumenConst;

            //
            // 「紐が付いていない駒の少なさ」による加点。
            //
            int mikataHimoduki = 0; // 味方の駒に、味方の駒の利きが1つ被っていれば+1。
            int mikataNeraware = 0; // 味方の駒に、相手の駒の利きが1つ被っていれば+1。
            int aiteHimoduki   = 0; // 相手の駒に、相手の駒の利きが1つ被っていれば+1。
            int aiteNeraware   = 0; // 相手の駒に、味方の駒の利きが1つ被っていれば+1。


            List <string> mikataYaburareMasu = new List <string>();
            int           aiteWin            = 0; // 利きの枚数で相手が勝っていた件数。

            List <string> aiteYaburareMasu = new List <string>();
            int           mikataWin        = 0; // 利きの枚数で味方が勝っていた件数。



            //
            // 駒の利きの計算。
            //
            KomanoKiki komanoKiki = KomanoKikiImpl.MasuBETUKikisu(src_Sky, args.Node.Tebanside);



            //
            // 味方の駒があるマスの得点は、マイナスなら集計。(減点法)
            // 敵の駒があるマスの得点は、プラスなら集計。(減点法)
            //
            // 駒は40枚あり、貫通して加点するのもある。
            //
            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                if (Okiba.ShogiBan != Util_Masu.Masu_ToOkiba(koma.Masu))
                {
                    goto gt_Next2;
                }

                if (args.PlayerInfo.Playerside == koma.Pside)
                {
                    // 味方の駒

                    // その升に利いている味方の利きの数。
                    int mikataKiki = komanoKiki.Kikisu_AtMasu_Mikata[Util_Masu.AsMasuNumber(koma.Masu)];

                    // その升に利いている相手の利きの数。
                    int aiteKiki = komanoKiki.Kikisu_AtMasu_Teki[Util_Masu.AsMasuNumber(koma.Masu)];

                    mikataHimoduki += mikataKiki;
                    mikataNeraware += aiteKiki;

                    // 破られる場合
                    if (mikataKiki < aiteKiki)
                    {
                        aiteWin++;
                        mikataYaburareMasu.Add(Converter04.Masu_ToKanji(koma.Masu));
                    }
                }
                else
                {
                    // 相手の駒

                    // その升に利いている相手の利きの数。
                    int aiteKiki = komanoKiki.Kikisu_AtMasu_Mikata[Util_Masu.AsMasuNumber(koma.Masu)];

                    // その升に利いている味方の利きの数。
                    int mikataKiki = komanoKiki.Kikisu_AtMasu_Teki[Util_Masu.AsMasuNumber(koma.Masu)];

                    aiteHimoduki = aiteKiki;
                    aiteNeraware = mikataKiki;

                    // 破られる場合
                    if (aiteKiki < mikataKiki)
                    {
                        mikataWin++;
                        aiteYaburareMasu.Add(Converter04.Masu_ToKanji(koma.Masu));
                    }
                }

gt_Next2:
                ;
            }


            // 集計。
            score = (double)(mikataWin - aiteWin) * 1.0 + 50.0d;

            string meisai = "";

#if DEBUG
            // 明細
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(" " + score);
                sb.Append("点    ");
                sb.Append(" 衝突箇所勝ち数=" + (mikataWin - aiteWin));
                sb.Append(" 味方が破られる" + aiteWin + "箇所");
                foreach (string s in mikataYaburareMasu)
                {
                    sb.Append("[");
                    sb.Append(s);
                    sb.Append("]");
                }

                sb.Append(" 相手が破られる" + mikataWin + "箇所");
                foreach (string s in aiteYaburareMasu)
                {
                    sb.Append("[");
                    sb.Append(s);
                    sb.Append("]");
                }
                meisai = sb.ToString();
            }
#endif

            kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai);
        }