Esempio n. 1
0
        /// <summary>
        /// 読み筋を返すぜ☆(^~^)
        /// </summary>
        /// <param name="sentoNantemade">初期局面からのリンクリストなので、どの「図はn手まで」戻すか☆</param>
        /// <returns></returns>
        public void ScanYomisuji(bool isSfen, int sentoNantemade, StringBuilder syuturyoku)
        {
            // 先頭(投了、初期局面、図は0手まで)まで戻るぜ☆
            Nanteme nanteme = this;

            for (; null != nanteme.Ittemae; nanteme = nanteme.Ittemae)
            {
            }

            // 先頭から今までの読み筋をつなげるぜ☆(^▽^)
            int zuhaNantemade = 0; // 図はn手まで

            for (;
                 null != nanteme;// 一番最後まで回すぜ☆(^▽^)
                 nanteme = nanteme.Ittego)
            {
                if (sentoNantemade <= zuhaNantemade)
                {
                    // 「図はn手まで」の数字
                    syuturyoku.Append($"({zuhaNantemade})");
                    ConvMove.AppendFenTo(isSfen, nanteme.Move, syuturyoku);
                    syuturyoku.Append(" ");

                    // おまけ
                    syuturyoku.Append($"{AbstractConvMoveType.Setumei(nanteme.MoveType)} ");
                }
                zuhaNantemade++;
            }
        }
Esempio n. 2
0
        public void Setumei(bool isSfen, StringBuilder syuturyoku)
        {
            // 初期局面を作成
            Kyokumen ky2   = new Kyokumen();
            int      caret = 0;

            ky2.ParsePositionvalue(isSfen, SyokiKyokumenFen, ref caret, false, false, out string moves, syuturyoku);

            // 初期局面を出力
            syuturyoku.AppendLine("初期局面");
            Util_Information.Setumei_NingenGameYo(ky2, syuturyoku);

            int temeMade = 1;

            foreach (Move ss in this.SsList)
            {
                syuturyoku.Append("(");
                syuturyoku.Append(temeMade.ToString());
                syuturyoku.Append(")");
                ConvMove.AppendFenTo(isSfen, ss, syuturyoku);
                syuturyoku.Append(" ");
                temeMade++;
            }
            syuturyoku.AppendLine();
        }
Esempio n. 3
0
        /// <summary>
        /// 駒を打った指し手☆(^▽^)
        /// 空き升に打ち込む前提だぜ☆(^~^)!
        /// </summary>
        /// <param name="ms_dst"></param>
        /// <param name="mkUtta"></param>
        /// <param name="natta"></param>
        /// <returns></returns>
        public static Move ToMove01cUtta(Masu ms_dst, MotiKomasyurui mkUtta)
        {
            Debug.Assert(MotiKomasyurui.Yososu != mkUtta, "");

            // バリュー
            int v = 0;

            // 元筋と元段☆(^▽^)「打」のときは何もしないぜ☆(^▽^)

            // 先筋と先段☆(^▽^)
            ConvMove.SetDstMasu_WithoutErrorCheck(ref v, ms_dst);


            //必ず指定されているはず☆ if (MotiKomasyurui.Yososu != mkUtta)
            {
                // 変換(列挙型→ビット)
                // ぞう 0 → 1
                // きりん 1 → 2
                // ひよこ 2 → 3
                // ~中略~
                // いのしし 6 → 7
                // なし 7 → 0
                // 1 足して 8 で割った余り☆
                v |= (((int)mkUtta + 1) % Conv_MotiKomasyurui.SETS_LENGTH) << (int)MoveShift.UttaKomasyurui;
            }

            // 打ったときは成れないぜ☆(^▽^)

            return((Move)v);
        }
Esempio n. 4
0
 public void AppendMovesTo(bool isSfen, StringBuilder syuturyoku)
 {
     foreach (Move ss in SsList)
     {
         ConvMove.AppendFenTo(isSfen, ss, syuturyoku);
         syuturyoku.Append(" ");
     }
 }
Esempio n. 5
0
        public void Setumei(bool isSfen, StringBuilder syuturyoku)
        {
            for (int i = 0; i < this.Size; i++)
            {
                ConvMove.AppendFenTo(isSfen, this.SasiteItiran[i], syuturyoku);

                if (i + 1 < this.Size)
                {
                    syuturyoku.Append(" ");
                }
            }
        }
Esempio n. 6
0
        public static Move TryFenMove2(
            bool isSfen,
            Kyokumen.Sindanyo kys,
            string str1,
            string str2,
            string str3,
            string str4,
            string str5
            )
        {
            int dstSuji = FenSuji_Int(isSfen, str3); // 至筋
            int dstDan  = FenDan_Int(isSfen, str4);  // 至段

            // 取った駒を調べるぜ☆(^▽^)
            Masu dstMs = Conv_Masu.ToMasu(dstSuji, dstDan);


            //------------------------------
            // 5
            //------------------------------
            bool natta = false;

            if ("+" == str5)
            {
                // 成りました
                natta = true;
            }


            //------------------------------
            // 結果
            //------------------------------
            if ("*" == str2)
            {
                // 駒台から打ったぜ☆
                return(ConvMove.ToMove01cUtta(
                           dstMs,
                           Med_Parser.Moji_MotikomaSyurui(isSfen, str1)//打った駒
                           ));
            }
            else
            {
                // 盤上の駒を動かしたぜ☆
                if (natta)
                {
                    return(ConvMove.ToMove01bNariSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys));
                }
                else
                {
                    return(ConvMove.ToMove01aNarazuSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys));
                }
            }
        }
Esempio n. 7
0
        public static void Setumei(bool isSfen, string header, List <MoveKakucho> sslist, StringBuilder syuturyoku)
        {
            syuturyoku.AppendLine(header);
            syuturyoku.AppendLine("┌──────────┐");
            foreach (MoveKakucho ss in sslist)
            {
                ConvMove.AppendFenTo(isSfen, ss.Move, syuturyoku);
                syuturyoku.AppendLine();
            }
            syuturyoku.AppendLine("└──────────┘");
#if DEBUG
            MoveGenBunseki.Instance.Setumei(syuturyoku);
#endif
        }
Esempio n. 8
0
        /// <summary>
        /// 定跡更新(ゲームセクション内)
        /// </summary>
        public static void Update2_JosekiToroku(Move bestMove, Hyokati bestHyokati, Kyokumen ky, StringBuilder syuturyoku)
        {
            if (Util_Machine.IsEnableBoardSize() && Option_Application.Optionlist.JosekiRec)
            {
                if (!IsJosekiTraced)// 定跡を使った指し手ではない場合に限り
                {
#if DEBUG
                    // 指し手の整合性をチェックしておきたいぜ☆(^▽^)
                    {
                        Kyokumen ky_forAssert = new Kyokumen();
                        int      caret_2      = 0;
                        if (!ky_forAssert.ParsePositionvalue(Option_Application.Optionlist.USI, KyFen_before, ref caret_2, true, false, out string moves, syuturyoku)) // ビットボードを更新したいので、適用する
                        {
                            syuturyoku.AppendLine("パースに失敗だぜ☆(^~^)! #鯰");
                            var msg = syuturyoku.ToString();
                            syuturyoku.Clear();
                            Logger.Flush(msg);
                            throw new Exception(msg);
                        }

                        if (!ky_forAssert.CanDoMove(bestMove, out MoveMatigaiRiyu riyu))
                        {
                            StringBuilder reigai1 = new StringBuilder();
                            reigai1.AppendLine("指せない指し手を定跡に登録しようとしたぜ☆(^~^)!:");
                            // reigai1.Append("理由:"); ConvMove.SetumeiLine(riyu, reigai1);
                            reigai1.Append("指し手:"); ConvMove.SetumeiLine(Option_Application.Optionlist.USI, bestMove, reigai1);
                            reigai1.Append("定跡にする1手前の局面 ("); reigai1.Append(KyFen_before); reigai1.AppendLine(")");
                            Util_Information.Setumei_Lines_Kyokumen(ky_forAssert, reigai1);
                            reigai1.AppendLine();
                            reigai1.Append("1手後は、現局面");
                            Util_Information.Setumei_Lines_Kyokumen(ky, reigai1);
                            syuturyoku.AppendLine(reigai1.ToString());
                            var msg = syuturyoku.ToString();
                            syuturyoku.Clear();
                            Logger.Flush(msg);
                            throw new Exception(msg);
                        }
                    }
#endif

                    Option_Application.Joseki.AddMove(KyFen_before, KyHash_before, OptionalPhaseBeforeMove, bestMove, bestHyokati, Util_Tansaku.NekkoKaranoFukasa, Util_Application.VERSION, syuturyoku);
                }
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 定跡ファイル
        /// </summary>
        /// <returns></returns>
        public void ToContentsLine_NotUnity(bool isSfen, StringBuilder syuturyoku)
        {
            ConvMove.AppendFenTo(isSfen, this.Move, syuturyoku);
            syuturyoku.Append(" ");

            if (this.Ousyu == Move.Toryo)
            {
                syuturyoku.Append("none");// FIXME: toryo と none の区別に未対応
            }
            else
            {
                ConvMove.AppendFenTo(isSfen, this.Ousyu, syuturyoku);
            }
            syuturyoku.Append(" ");
            syuturyoku.Append(((int)this.Hyokati).ToString());// enum型の変数名で出力されないように、int型に変換してから文字列にするぜ☆(^▽^)
            syuturyoku.Append(" ");
            syuturyoku.Append(this.Fukasa.ToString());
            syuturyoku.Append(" ");
            syuturyoku.AppendLine(this.Version.ToString());
        }
Esempio n. 10
0
        public void ToContents_NotUnity(bool isSfen, StringBuilder syuturyoku)
        {
            ConvMove.AppendFenTo(isSfen, Move, syuturyoku);
            syuturyoku.Append(" ");

            if (Ousyu == Move.Toryo)
            {
                syuturyoku.Append("none");// FIXME: toryo と none の区別に未対応
            }
            else
            {
                ConvMove.AppendFenTo(isSfen, Ousyu, syuturyoku);
            }

            syuturyoku.Append(" ");
            syuturyoku.Append(Version.ToString());
            syuturyoku.Append(" ");
            syuturyoku.Append(Kati.ToString());
            syuturyoku.Append(" ");
            syuturyoku.Append(Hikiwake.ToString());
            syuturyoku.Append(" ");
            syuturyoku.AppendLine(Make.ToString());
        }
Esempio n. 11
0
        public void TusinYo(bool isSfen, StringBuilder syuturyoku)
        {
            // 初期局面を作成
            Kyokumen ky2   = new Kyokumen();
            int      caret = 0;

            ky2.ParsePositionvalue(isSfen, SyokiKyokumenFen, ref caret, false, false, out string moves, syuturyoku);

            // 初期局面を出力
            syuturyoku.Append("< kifu, 初期局面, ");
            ky2.TusinYo_Line(isSfen, syuturyoku);

            syuturyoku.Append("< kifu, move = ");
            int temeMade = 1;

            foreach (Move ss in this.SsList)
            {
                ConvMove.AppendFenTo(isSfen, ss, syuturyoku);
                syuturyoku.Append(" ");
                temeMade++;
            }
            syuturyoku.AppendLine();
        }
Esempio n. 12
0
 public void Setumei_Description(bool isSfen, StringBuilder syuturyoku)
 {
     syuturyoku.Append($"key=[{Key}] move=[");
     ConvMove.Setumei(isSfen, Move, syuturyoku);
     syuturyoku.Append($"] sasiteType=[{AbstractConvMoveType.Setumei(MoveType)}] fukasa=[{Fukasa}] hyokati=[{(int)Hyokati}] komawariHyokati_forJoho=[{(int)KomawariHyokati_ForJoho}] nikomaHyokati_forJoho=[{(int)NikomaHyokati_ForJoho}] okimariHyokati_forJoho=[${(int)OkimariHyokati_ForJoho}]");
 }
Esempio n. 13
0
        /// <summary>
        /// 定跡局面の中で、評価値が一番高い指し手を返すぜ☆(^▽^)
        /// </summary>
        /// <param name="ky"></param>
        /// <returns>なければ投了☆</returns>
        public Move GetMove(bool isSfen, Kyokumen ky, out Hyokati out_bestHyokati, StringBuilder syuturyoku
#if DEBUG
                            , out string fen_forTest
#endif
                            )
        {
            Move bestMove = Move.Toryo;

            out_bestHyokati = Hyokati.TumeTesu_GohosyuNasi;
            int bestFukasa = 0;

#if DEBUG
            fen_forTest = "";
#endif

            //Util_Machine.Assert_KyokumenSeigosei_SabunKosin("ゲット指し手 #鯨",true);
            ulong hash = ky.KyokumenHash.Value;
            if (this.KyItems.ContainsKey(hash))
            {
                JosekiKyokumen josekyKy = this.KyItems[hash];
                // 整合性の確認用だぜ☆(^~^)
#if DEBUG
                fen_forTest = josekyKy.Fen;
#endif
                foreach (KeyValuePair <Move, JosekiMove> entry in josekyKy.SsItems)
                {
                    if (out_bestHyokati < entry.Value.Hyokati)// 評価値が高い指し手を選ぶぜ☆(^▽^)
                    {
                        bestMove        = entry.Key;
                        out_bestHyokati = entry.Value.Hyokati;
                        bestFukasa      = entry.Value.Fukasa;
                    }
                    else if (out_bestHyokati == entry.Value.Hyokati && //評価値が同じ場合は、
                             bestFukasa < entry.Value.Fukasa           //深く読んでいる指し手を選ぶぜ☆(^▽^)
                             )
                    {
                        bestMove        = entry.Key;
                        out_bestHyokati = entry.Value.Hyokati;
                        bestFukasa      = entry.Value.Fukasa;
                    }
                }
            }

#if DEBUG
            // 指し手の整合性をチェックしておきたいぜ☆(^▽^)
            {
                Kyokumen      ky_forAssert = new Kyokumen();
                int           caret        = 0;
                StringBuilder sindan1      = new StringBuilder();
                ky.AppendFenTo(Option_Application.Optionlist.USI, sindan1);
                //if (!ky2.ParseFen(sindan1.ToString(), ref caret, false, syuturyoku))
                if (!ky_forAssert.ParsePositionvalue(isSfen, sindan1.ToString(), ref caret, true, false, out string moves, syuturyoku))// ビットボードを更新したいので、適用する
                {
                    syuturyoku.AppendLine("取得: パースに失敗だぜ☆(^~^)! #鰯");
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                    throw new Exception(msg);
                }

                if (!ky_forAssert.CanDoMove(bestMove, out MoveMatigaiRiyu riyu))
                {
                    StringBuilder sindan2 = new StringBuilder();
                    sindan2.Append("取得: 指せない指し手を定跡から取り出そうとしたぜ☆(^~^)!:");
                    // sindan2.Append("理由:"); ConvMove.SetumeiLine(riyu,sindan2);
                    sindan2.Append("指し手:"); ConvMove.SetumeiLine(isSfen, bestMove, sindan2);
                    sindan2.Append("定跡局面 ("); ky_forAssert.AppendFenTo(Option_Application.Optionlist.USI, sindan2); sindan2.AppendLine(")");
                    Util_Information.Setumei_Lines_Kyokumen(ky_forAssert, sindan2);

                    //str2.AppendLine("以下、定跡メモリのダンプ");
                    //str2.AppendLine("┌──────────┐");
                    //str2.Append(this.ToString());
                    //str2.AppendLine("└──────────┘");

                    syuturyoku.AppendLine(sindan2.ToString());
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                    throw new Exception(sindan2.ToString());
                }
            }
#endif

            return(bestMove);
        }
Esempio n. 14
0
 public static bool IsUtta(Move ss)
 {
     // 打か☆?
     return(MotiKomasyurui.Yososu != ConvMove.GetUttaKomasyurui(ss));//指定があれば
 }