Exemple #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);
        }
Exemple #2
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);
        }
Exemple #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
                       ));
        }
Exemple #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());
        }
Exemple #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());
        }
Exemple #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));
        }
Exemple #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());
        }
Exemple #8
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);
        }
Exemple #9
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());
        }
Exemple #10
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());
        }