Esempio 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);
        }
Esempio n. 2
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));
        }
Esempio n. 3
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
                       ));
        }
Esempio n. 4
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());
        }
Esempio n. 5
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());
        }
Esempio n. 6
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));
        }
Esempio n. 7
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());
        }
Esempio n. 8
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);
        }
Esempio n. 9
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);
        }
Esempio n. 10
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());
        }
Esempio n. 11
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());
        }