Ejemplo n.º 1
0
        /// <summary>
        /// 距離の近さ
        /// </summary>
        /// <returns></returns>
        public static int GetKyori(SyElement mokuhyo, SyElement genzai)
        {
            //
            // とりあえず おおざっぱに計算します。
            //

            int mokuhyoDan;

            Util_MasuNum.MasuToDan(mokuhyo, out mokuhyoDan);

            int mokuhyoSuji;

            Util_MasuNum.MasuToSuji(mokuhyo, out mokuhyoSuji);

            int genzaiDan;

            Util_MasuNum.MasuToDan(genzai, out genzaiDan);

            int genzaiSuji;

            Util_MasuNum.MasuToSuji(genzai, out genzaiSuji);

            int kyori = Math.Abs(mokuhyoDan - genzaiDan) + Math.Abs(mokuhyoSuji - genzaiSuji);

            return(kyori);
        }
Ejemplo n.º 2
0
 public void AddKoma(Basho masu, RO_Star_Koma koma)// Ks14 komaSyurui
 {
     if (Util_MasuNum.OnShogiban((int)masu.MasuNumber))
     {
         this.ban81.Add(masu, koma);
     }
     else if (Util_MasuNum.OnSenteKomadai((int)masu.MasuNumber))
     {
         if (this.motiBlack.ContainsKey(koma.Syurui))
         {
             this.motiBlack[koma.Syurui] = this.motiBlack[koma.Syurui];
         }
         else
         {
             this.motiBlack.Add(koma.Syurui, 0);
         }
     }
     else if (Util_MasuNum.OnGoteKomadai((int)masu.MasuNumber))
     {
         if (this.motiWhite.ContainsKey(koma.Syurui))
         {
             this.motiWhite[koma.Syurui] = this.motiWhite[koma.Syurui];
         }
         else
         {
             this.motiWhite.Add(koma.Syurui, 0);
         }
     }
 }
Ejemplo n.º 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);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 相手陣に入っていれば真。
        /// ************************************************************************************************************************
        ///
        ///         後手は 7,8,9 段。
        ///         先手は 1,2,3 段。
        /// </summary>
        /// <returns></returns>
        public static bool InAitejin(SyElement masu, Playerside pside)
        {
            int dan;

            Util_MasuNum.MasuToDan(masu, out dan);

            return((Playerside.P2 == pside && 7 <= dan) ||
                   (Playerside.P1 == pside && dan <= 3));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 1マス上、のように指定して、マスを取得します。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="offsetSuji"></param>
        /// <param name="offsetDan"></param>
        /// <returns></returns>
        public static SyElement Offset(Okiba okiba, SyElement masu, int offsetSuji, int offsetDan)
        {
            int suji;
            int dan;

            Util_MasuNum.MasuToSuji(masu, out suji);
            Util_MasuNum.MasuToDan(masu, out dan);

            return(Util_Masu.OkibaSujiDanToMasu(
                       okiba,
                       suji + offsetSuji,
                       dan + offsetDan
                       ));
        }
Ejemplo n.º 6
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());
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 「2八」といった表記にして返します。
        /// </summary>
        /// <param name="masu"></param>
        /// <returns></returns>
        public static string Masu_ToKanji(SyElement masu)
        {
            StringBuilder sb = new StringBuilder();

            int suji;
            int dan;

            Util_MasuNum.MasuToSuji(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masu)], out suji);
            Util_MasuNum.MasuToDan(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masu)], out dan);

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

            return(sb.ToString());
        }
Ejemplo n.º 8
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 1マス上、のように指定して、マスを取得します。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="offsetSuji"></param>
        /// <param name="offsetDan"></param>
        /// <returns></returns>
        public static SyElement Offset(Okiba okiba, SyElement masu, Playerside pside, Hogaku muki)
        {
            int offsetSuji;
            int offsetDan;

            Util_Muki.MukiToOffsetSujiDan(muki, pside, out offsetSuji, out offsetDan);

            int suji;
            int dan;

            Util_MasuNum.MasuToSuji(masu, out suji);
            Util_MasuNum.MasuToDan(masu, out dan);

            return(Util_Masu.OkibaSujiDanToMasu(
                       okiba,
                       suji + offsetSuji,
                       dan + offsetDan));
        }
Ejemplo n.º 9
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)
                             );
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 棋譜用の符号テキスト(*1)を作ります。
        /// ************************************************************************************************************************
        ///
        ///         *1…「▲5五銀上」など。
        ///
        /// </summary>
        /// <param name="douExpr">“同”表記に置き換えるなら真。</param>
        /// <param name="previousKomaP"></param>
        /// <returns></returns>
        public string ToText_UseDou(
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode
            )
        {
            StringBuilder sb = new StringBuilder();


            ShootingStarlightable curMove = siteiNode.Key;
            ShootingStarlightable preMove = siteiNode.PreviousNode.Key;

            RO_Star_Koma curSrcKoma = Util_Koma.AsKoma(curMove.LongTimeAgo);
            RO_Star_Koma curDstKoma = Util_Koma.AsKoma(curMove.Now);
            RO_Star_Koma preSrcKoma = Util_Koma.AsKoma(preMove.LongTimeAgo);
            RO_Star_Koma preDstKoma = Util_Koma.AsKoma(preMove.Now);


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

            //------------------------------
            // “同”で表記できるところは、“同”で表記します。それ以外は“筋・段”で表記します。
            //------------------------------
            if (
                null != preMove &&
                Util_Masu.MatchSujiDan(Util_Masu.AsMasuNumber(preDstKoma.Masu), Util_Masu.AsMasuNumber(curDstKoma.Masu))
                )
            {
                // “同”
                sb.Append("同");
            }
            else
            {
                // “筋・段”
                int suji;
                int dan;
                Util_MasuNum.MasuToSuji(curDstKoma.Masu, out suji);
                Util_MasuNum.MasuToDan(curDstKoma.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());
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 筋も残し、全件網羅
        /// </summary>
        /// <returns></returns>
        public static string LogString_Concrete(
            SySet <SyElement> masus
            )
        {
            StringBuilder sb = new StringBuilder();

            if (masus is SySet_Default <SyElement> )
            {
                // まず自分の要素
                foreach (SyElement hMasu1 in ((SySet_Default <SyElement>)masus).Elements_)
                {
                    int suji;
                    int dan;
                    Util_MasuNum.MasuToSuji(hMasu1, out suji);
                    Util_MasuNum.MasuToDan(hMasu1, out dan);

                    sb.Append("["
                              + suji.ToString()
                              + dan.ToString()
                              + "]");
                }

                // 次に親集合
                foreach (SySet <SyElement> superset in ((SySet_Default <SyElement>)masus).Supersets)
                {
                    sb.Append(Util_Masus <SyElement> .LogString_Concrete(superset));
                }
            }
            else if (masus is SySet_Ordered <SyElement> )
            {
                // まず自分の要素
                foreach (SyElement hMasu1 in ((SySet_Ordered <SyElement>)masus).Elements_)
                {
                    int suji;
                    int dan;
                    Util_MasuNum.MasuToSuji(hMasu1, out suji);
                    Util_MasuNum.MasuToDan(hMasu1, out dan);

                    sb.Append("["
                              + suji.ToString()
                              + dan.ToString()
                              + "]");
                }

                // 次に親集合
                foreach (SySet <SyElement> superset in ((SySet_Ordered <SyElement>)masus).Supersets)
                {
                    sb.Append(Util_Masus <SyElement> .LogString_Concrete(superset));
                }
            }
            else if (masus is SySet_DirectedSegment <SyElement> )
            {
                sb.Append("[");

                foreach (T1 hMasu1 in ((SySet_DirectedSegment <SyElement>)masus).Elements)
                {
                    int suji;
                    int dan;
                    Util_MasuNum.MasuToSuji(hMasu1, out suji);
                    Util_MasuNum.MasuToDan(hMasu1, out dan);

                    sb.Append(
                        suji.ToString()
                        + dan.ToString()
                        + "→");
                }

                // 最後の矢印は削除します。
                if ("[".Length < sb.Length)
                {
                    sb.Remove(sb.Length - 1, 1);
                }

                sb.Append("]");
            }
            else
            {
            }

            return(sb.ToString());
        }
Ejemplo n.º 12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="syurui"></param>
        /// <param name="masu_shogiban">0~80</param>
        /// <returns></returns>
        public static Kh185 ToHaiyaku(PieceType syurui, SyElement masu_shogiban, Playerside pside)
        {
            Kh185 result;

            int masuHandle = Util_Masu.AsMasuNumber(Util_Masu.BothSenteView(masu_shogiban, pside));

            if (Util_MasuNum.OnShogiban(masuHandle))
            {
                result = Data_HaiyakuTransition.Map[syurui][(int)masuHandle];
            }
            else if (Util_MasuNum.OnKomadai(masuHandle))
            {
                switch (syurui)
                {
                case PieceType.P: result = Kh185.n164_歩打; break;

                case PieceType.L: result = Kh185.n165_香打; break;

                case PieceType.N: result = Kh185.n166_桂打; break;

                case PieceType.S: result = Kh185.n167_銀打; break;

                case PieceType.G: result = Kh185.n168_金打; break;

                case PieceType.K: result = Kh185.n169_王打; break;

                case PieceType.R: result = Kh185.n170_飛打; break;

                case PieceType.B: result = Kh185.n171_角打; break;

                case PieceType.PR: result = Kh185.n170_飛打; break;

                case PieceType.PB: result = Kh185.n171_角打; break;

                case PieceType.PP: result = Kh185.n164_歩打; break;

                case PieceType.PL: result = Kh185.n165_香打; break;

                case PieceType.PN: result = Kh185.n166_桂打; break;

                case PieceType.PS: result = Kh185.n167_銀打; break;

                default: result = Kh185.n000_未設定; break;
                }
            }
            else if (Util_MasuNum.OnKomabukuro(masuHandle))
            {
                switch (syurui)
                {
                case PieceType.P: result = Kh185.n172_駒袋歩; break;

                case PieceType.L: result = Kh185.n173_駒袋香; break;

                case PieceType.N: result = Kh185.n174_駒袋桂; break;

                case PieceType.S: result = Kh185.n175_駒袋銀; break;

                case PieceType.G: result = Kh185.n176_駒袋金; break;

                case PieceType.K: result = Kh185.n177_駒袋王; break;

                case PieceType.R: result = Kh185.n178_駒袋飛; break;

                case PieceType.B: result = Kh185.n179_駒袋角; break;

                case PieceType.PR: result = Kh185.n180_駒袋竜; break;

                case PieceType.PB: result = Kh185.n181_駒袋馬; break;

                case PieceType.PP: result = Kh185.n182_駒袋と金; break;

                case PieceType.PL: result = Kh185.n183_駒袋杏; break;

                case PieceType.PN: result = Kh185.n184_駒袋圭; break;

                case PieceType.PS: result = Kh185.n185_駒袋全; break;

                default: result = Kh185.n000_未設定; break;
                }
            }
            else
            {
                result = Kh185.n000_未設定;
            }

            return(result);
        }
Ejemplo n.º 13
0
        private void AddKoma(SyElement masu, RO_Star_Koma koma)// Ks14 komaSyurui
        {
            Debug.Assert(!this.BanObject201.ContainsKey(Util_Masu.AsMasuNumber(masu)), "既に駒がある枡に、駒を置こうとしています。[" + Util_Masu.AsMasuNumber(masu) + "]");


            this.BanObject201.Add(Util_Masu.AsMasuNumber(masu), koma);

            if (Util_MasuNum.OnShogiban(Util_Masu.AsMasuNumber(masu)))
            {
                // 盤上

                // 特にカウントはなし
            }
            else if (Util_MasuNum.OnSenteKomadai(Util_Masu.AsMasuNumber(masu)))
            {
                // 先手駒台
                switch (koma.Syurui)
                {
                case PieceType.P:
                    this.moti1P++;
                    break;

                case PieceType.L:
                    this.moti1L++;
                    break;

                case PieceType.N:
                    this.moti1N++;
                    break;

                case PieceType.S:
                    this.moti1S++;
                    break;

                case PieceType.G:
                    this.moti1G++;
                    break;

                case PieceType.K:
                    this.moti1K++;
                    break;

                case PieceType.R:
                    this.moti1R++;
                    break;

                case PieceType.B:
                    this.moti1B++;
                    break;
                }
            }
            else if (Util_MasuNum.OnGoteKomadai(Util_Masu.AsMasuNumber(masu)))
            {
                // 後手駒台
                switch (koma.Syurui)
                {
                case PieceType.P:
                    this.moti2p++;
                    break;

                case PieceType.L:
                    this.moti2l++;
                    break;

                case PieceType.N:
                    this.moti2n++;
                    break;

                case PieceType.S:
                    this.moti2s++;
                    break;

                case PieceType.G:
                    this.moti2g++;
                    break;

                case PieceType.K:
                    this.moti2k++;
                    break;

                case PieceType.R:
                    this.moti2r++;
                    break;

                case PieceType.B:
                    this.moti2b++;
                    break;
                }
            }
            else
            {
                // 駒袋
                switch (koma.Syurui)
                {
                case PieceType.P:
                    this.fukuroP++;
                    break;

                case PieceType.L:
                    this.fukuroL++;
                    break;

                case PieceType.N:
                    this.fukuroN++;
                    break;

                case PieceType.S:
                    this.fukuroS++;
                    break;

                case PieceType.G:
                    this.fukuroG++;
                    break;

                case PieceType.K:
                    this.fukuroK++;
                    break;

                case PieceType.R:
                    this.fukuroR++;
                    break;

                case PieceType.B:
                    this.fukuroB++;
                    break;
                }
            }
        }
Ejemplo n.º 14
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   = 0.0d;
            SkyConst src_Sky = args.Node.Value.ToKyokumenConst;

            //
            // 自玉
            //
            RO_Star_Koma jiGyoku = null;

            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                if (koma.Pside == args.PlayerInfo.Playerside && koma.Syurui == PieceType.K)
                {
                    jiGyoku = koma;
                    break;
                }
            }

            if (null == jiGyoku)
            {
                goto gt_EndMethod;
            }

            int jiGyoku_Suji;

            Util_MasuNum.MasuToSuji(jiGyoku.Masu, out jiGyoku_Suji);
            int jiGyoku_Dan;

            Util_MasuNum.MasuToDan(jiGyoku.Masu, out jiGyoku_Dan);

            int[] sujis = new int[25];
            int[] dans  = new int[25];
            {
                //
                // 25近傍。12の位置に、視点の中心となる駒があるとします。
                //
                //    -2  -1   0  +1  +2
                //  ┌─┬─┬─┬─┬─┐
                //-2│ 0│ 1│ 2│ 3│ 4│
                //  ├─┼─┼─┼─┼─┤
                //-1│ 5│ 6│ 7│ 8│ 9│
                //  ├─┼─┼─┼─┼─┤
                // 0│10│11│12│13│14│
                //  ├─┼─┼─┼─┼─┤
                //+1│15│16│17│18│19│
                //  ├─┼─┼─┼─┼─┤
                //+2│20│21│22│23│24│
                //  └─┴─┴─┴─┴─┘
                //
                int index = 0;
                for (int dDan = -2; dDan < 3; dDan++)
                {
                    for (int dSuji = -2; dSuji < 3; dSuji++)
                    {
                        sujis[index] = jiGyoku_Suji + dSuji;
                        dans[index]  = jiGyoku_Dan + dDan;
                        index++;
                    }
                }
            }

            // 25近傍に、得点の重みを付けます。
            double aa = 0.0d;
            double bb = 100.0d;
            double cc = 100.0d / 3.0d;
            double dd = 100.0d / 3.0d / 3.0d;
            double ee = 100.0d / 3.0d / 3.0d / 3.0d;
            double ff = 100.0d / 3.0d / 3.0d / 3.0d / 3.0d;

            double[] omomi = new double[] {
                ff, ee, dd, ee, ff,
                ee, cc, bb, cc, ee,
                dd, bb, aa, bb, dd,
                ee, cc, bb, cc, ee,
                ff, ee, dd, ee, ff,
            };

            // 25近傍のマス番号を取得しておきます。該当がなければ Masu_Honshogi.Error。
            Dictionary <SyElement, double> masuOmomi = new Dictionary <SyElement, double>();
            {
                for (int index = 0; index < 25; index++)
                {
                    SyElement masu = Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, sujis[index], dans[index]);
                    if (masu != Masu_Honshogi.Error)
                    {
                        masuOmomi.Add(masu, omomi[index]);
                    }
                }
            }

            //
            // 味方の金、銀について。
            //
            int countKanagoma = 0;                                     // カナゴマ

            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) // 全駒
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                if (koma.Pside == args.PlayerInfo.Playerside &&
                    koma.Syurui == PieceType.S &&
                    koma.Syurui == PieceType.G
                    )
                {
                    if (masuOmomi.ContainsKey(koma.Masu))
                    {
                        score += masuOmomi[koma.Masu];
                        countKanagoma++;
                        if (3 <= countKanagoma)
                        {
                            break;
                        }
                    }
                }
            }


gt_EndMethod:
            string meisai = "";

#if DEBUG
            // 明細の作成
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("略");
                meisai = sb.ToString();
            }
#endif
            kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 「成り」ができるなら真。
        /// </summary>
        /// <returns></returns>
        private static bool IsPromotionable(
            out bool isPromotionable,
            RO_Star_Koma srcKoma,
            RO_Star_Koma dstKoma
            )
        {
            bool successful = true;

            isPromotionable = false;

            if (Okiba.ShogiBan != Util_Masu.Masu_ToOkiba(srcKoma.Masu))
            {
                successful = false;
                goto gt_EndMethod;
            }

            if (KomaSyurui14Array.IsNari(srcKoma.Syurui))
            {
                // 既に成っている駒は、「成り」の指し手を追加すると重複エラーになります。
                // 成りになれない、で正常終了します。
                goto gt_EndMethod;
            }

            int srcDan;

            if (!Util_MasuNum.MasuToDan(srcKoma.Masu, out srcDan))
            {
                throw new Exception("段に変換失敗");
            }

            int dstDan;

            if (!Util_MasuNum.MasuToDan(dstKoma.Masu, out dstDan))
            {
                throw new Exception("段に変換失敗");
            }

            // 先手か、後手かで大きく処理を分けます。
            switch (dstKoma.Pside)
            {
            case Playerside.P1:
            {
                if (srcDan <= 3)
                {
                    // 3段目から上にあった駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }

                if (dstDan <= 3)
                {
                    // 3段目から上に駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }
            }
            break;

            case Playerside.P2:
            {
                if (7 <= srcDan)
                {
                    // 7段目から下にあった駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }

                if (7 <= dstDan)
                {
                    // 7段目から下に駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }
            }
            break;

            default: throw new Exception("未定義のプレイヤーサイドです。");
            }
gt_EndMethod:
            ;
            return(successful);
        }
Ejemplo n.º 16
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}」 ");
            }
        }
Ejemplo n.º 17
0
        /// <summary>
        /// 重複をなくした表現
        /// </summary>
        /// <returns></returns>
        public static string LogString_Set(
            SySet <SyElement> masus
            )
        {
            StringBuilder sb = new StringBuilder();

            if (masus is SySet_Default <SyElement> )
            {
                HashSet <T1> set = new HashSet <T1>();

                // まず自分の要素
                foreach (T1 hMasu1 in ((SySet_Default <SyElement>)masus).Elements_)
                {
                    set.Add(hMasu1);
                }

                // 次に親集合
                foreach (SySet <T1> superset in ((SySet_Default <SyElement>)masus).Supersets)
                {
                    foreach (T1 hMasu2 in superset.Elements)
                    {
                        set.Add(hMasu2);
                    }
                }

                T1[] array = set.ToArray();
                Array.Sort(array);

                int fieldCount = 0;
                foreach (T1 masuHandle in array)
                {
                    sb.Append("[");
                    sb.Append(masuHandle);
                    sb.Append("]");

                    fieldCount++;

                    if (fieldCount % 20 == 19)
                    {
                        sb.AppendLine();
                    }
                }
            }
            else if (masus is SySet_Ordered <SyElement> )
            {
                // まず自分の要素
                foreach (T1 hMasu1 in ((SySet_Ordered <SyElement>)masus).Elements_)
                {
                    int suji;
                    int dan;
                    Util_MasuNum.MasuToSuji(hMasu1, out suji);
                    Util_MasuNum.MasuToDan(hMasu1, out dan);

                    sb.Append("["
                              + suji.ToString()
                              + dan.ToString()
                              + "]");
                }

                // 次に親集合
                foreach (SySet <SyElement> superset in ((SySet_Ordered <SyElement>)masus).Supersets)
                {
                    sb.Append(Util_Masus <Basho> .LogString_Concrete(superset));
                }
            }
            else if (masus is SySet_DirectedSegment <SyElement> )
            {
                sb.Append("[");

                foreach (T1 hMasu1 in ((SySet_DirectedSegment <SyElement>)masus).Elements)
                {
                    int suji;
                    int dan;
                    Util_MasuNum.MasuToSuji(hMasu1, out suji);
                    Util_MasuNum.MasuToDan(hMasu1, out dan);

                    sb.Append(
                        suji.ToString()
                        + dan.ToString()
                        + "→");
                }

                // 最後の矢印は削除します。
                if ("[".Length < sb.Length)
                {
                    sb.Remove(sb.Length - 1, 1);
                }

                sb.Append("]");
            }
            else
            {
            }

            return(sb.ToString());
        }