Exemple #1
0
 /// <summary>
 /// 段
 /// </summary>
 /// <param name="isSfen"></param>
 /// <param name="suji"></param>
 /// <returns></returns>
 public static int FenDan_Int(bool isSfen, string dan)
 {
     if (isSfen)
     {
         return(Conv_Kihon.AlphabetToInt(dan));
     }
     else
     {
         if (!int.TryParse(dan, out int iDan))
         {
             throw new Exception($"パース失敗 dan=[{ dan }]");
         }
         return(iDan);
     }
 }
Exemple #2
0
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="out_restString"></param>
        ///// <param name="commandline">B3といった文字列☆</param>
        ///// <returns></returns>
        //public static bool TryParseMs(
        //    string commandline,
        //    Kyokumen ky,
        //    ref int caret,
        //    out Masu result
        //)
        //{
        //    //「B4」形式と想定
        //    // テキスト形式の符号「A4 …」の最初の1要素を、切り取ってトークンに分解します。

        //    //------------------------------------------------------------
        //    // リスト作成
        //    //------------------------------------------------------------

        //    Match m = Itiran_FenParser.GetMasuMovePattern(Option_Application.Optionlist.USI).Match(commandline, caret);
        //    if (m.Success)
        //    {
        //        Util_String.SkipMatch(commandline, ref caret, m);

        //        // 符号1「B4」を元に、Masu を作ります。

        //        // 盤上の駒を動かしたぜ☆
        //        result = Med_Parser.FenSujiDan_Masu(
        //            Option_Application.Optionlist.USI,
        //            m.Groups[1].Value, //ABCabc か、 ZKH
        //            m.Groups[2].Value //1234   か、 *
        //            );
        //        return true;
        //    }

        //    // 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆
        //    result = ky.MASU_ERROR;
        //    return false;
        //}

        /// <summary>
        /// 筋
        /// </summary>
        /// <param name="isSfen"></param>
        /// <param name="suji"></param>
        /// <returns></returns>
        public static int FenSuji_Int(bool isSfen, string suji)
        {
            if (isSfen)
            {
                if (!int.TryParse(suji, out int iSuji))
                {
                    throw new Exception($"パース失敗 suji=[{suji}]");
                }
                return(Option_Application.Optionlist.BanYokoHaba + 1 - iSuji);
            }
            else
            {
                return(Conv_Kihon.AlphabetToInt(suji));
            }
        }
Exemple #3
0
        //private static Option<T> Option<T>(T white)
        //{
        //    throw new NotImplementedException();
        //}

        /// <summary>
        /// 将棋盤をコンソールへ出力するぜ☆(^▽^)
        /// コンソールでゲームするのに向いた表示☆
        /// </summary>
        /// <returns></returns>
        public static void Setumei_NingenGameYo(Kyokumen ky, StringBuilder syuturyoku)
        {
            // 1行目
            {
                // 千日手
                int sennitite = ky.Konoteme.GetSennititeCount();
                if (Const_Game.SENNITITE_COUNT == sennitite)
                {
                    Conv_Taikyokusya.Setumei_Name(Conv_Taikyokusya.Reverse(ky.CurrentOptionalPhase), syuturyoku);
                    syuturyoku.Append("の着手にて 千日手");
                    syuturyoku.AppendLine();
                }
                else if (1 < sennitite)
                {
                    syuturyoku.Append("同一局面反復 ");
                    syuturyoku.Append(sennitite.ToString());
                    syuturyoku.AppendLine(" 回目");
                }
                else
                {
                    syuturyoku.AppendLine();
                }
            }

            // 2行目
            {
                // 何手目
                syuturyoku.Append("図は");
                syuturyoku.Append(string.Format("{0,3}", ky.Konoteme.ScanNantemadeBango()));
                syuturyoku.Append("手まで ");

                // 手番
                Conv_Taikyokusya.Setumei_Name(ky.CurrentOptionalPhase, syuturyoku);
                syuturyoku.Append("の番");

                // #仲ルール
                if (Option_Application.Optionlist.SagareruHiyoko)
                {
                    syuturyoku.Append(" #仲");
                }

                syuturyoku.AppendLine();
            }

            // 3行目 後手の持ち駒の数
            {
                foreach (MotiKomasyurui mks in Conv_MotiKomasyurui.Itiran)
                {
                    MotiKoma mk = Med_Koma.MotiKomasyuruiAndPhaseToMotiKoma(mks, OptionalPhase.White);
                    if (ky.MotiKomas.HasMotiKoma(mk))
                    {
                        syuturyoku.Append(Conv_MotiKomasyurui.GetHyojiName(mks)); syuturyoku.Append(ky.MotiKomas.Get(mk).ToString());
                    }
                }
                syuturyoku.AppendLine();
            }

            // 4行目
            {
                syuturyoku.Append("  ");
                AppendLine_SujiFugo_Kyokumen(syuturyoku);
                //syuturyoku.AppendLine("   A   B   C  ");
            }

            // 5行目~13行目
            // 盤上
            {
                // 5行目
                syuturyoku.Append("  ");
                Util_Information.AppendLine_Top_Kyokumen(1, syuturyoku); // ┌──┬──┬──┐

                for (int dan = 0; dan < Option_Application.Optionlist.BanTateHaba; dan++)
                {
                    // 6,8,10,12行目
                    syuturyoku.Append(Conv_Kihon.ToZenkakuInteger(dan + 1));
                    AppendLine_Data_Kyokumen(ky, dan, syuturyoku);

                    if (dan + 1 < Option_Application.Optionlist.BanTateHaba)
                    {
                        // 7,9,11行目
                        syuturyoku.Append("  ");
                        AppendLine_Middle(1, syuturyoku);//├──┼──┼──┤
                    }
                }

                // 13行目
                syuturyoku.Append("  ");
                AppendLine_Bottom(1, syuturyoku);//└──┴──┴──┘
            }

            // 14行目
            {
                // 先手の持ち駒の数
                foreach (MotiKomasyurui mks in Conv_MotiKomasyurui.Itiran)
                {
                    MotiKoma mk = Med_Koma.MotiKomasyuruiAndPhaseToMotiKoma(mks, OptionalPhase.Black);
                    if (ky.MotiKomas.HasMotiKoma(mk))
                    {
                        syuturyoku.Append(Conv_MotiKomasyurui.GetHyojiName(mks)); syuturyoku.Append(ky.MotiKomas.Get(mk).ToString());
                    }
                }
                syuturyoku.AppendLine();
            }
        }
Exemple #4
0
 public static void Setumei(Masu ms, Kyokumen ky, StringBuilder syuturyoku)
 {
     syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(ky.ToSuji_WithError(ms)));
     syuturyoku.Append(ky.ToDan_WithError(ms).ToString());
 }
Exemple #5
0
        /// <summary>
        /// 改造FEN符号表記
        /// </summary>
        /// <returns></returns>
        public static void AppendFenTo(bool isSfen, Move ss, StringBuilder syuturyoku)
        {
            if (Move.Toryo == ss)
            {
                syuturyoku.Append(Itiran_FenParser.GetToryo(isSfen)); return;
            }

            int v = (int)ss;//バリュー(ビットフィールド)

            // 打った駒の種類(取り出すのは難しいので関数を使う☆)
            MotiKomasyurui mksUtta = GetUttaKomasyurui(ss);

            if (MotiKomasyurui.Yososu != mksUtta)//指定があれば
            {
                // 打でした。

                // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。
                Conv_MotiKomasyurui.AppendFenTo(isSfen, mksUtta, syuturyoku);
                syuturyoku.Append("*");
            }
            else
            {
                //------------------------------------------------------------
                // (自)筋
                //------------------------------------------------------------
                if (Option_Application.Optionlist.USI)
                {
                    syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetSrcSuji_WithoutErrorCheck(v));
                }
                else
                {
                    syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetSrcSuji_WithoutErrorCheck(v)));
                }

                //------------------------------------------------------------
                // (自)段
                //------------------------------------------------------------
                if (Option_Application.Optionlist.USI)
                {
                    syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetSrcDan_WithoutErrorCheck(v)));
                }
                else
                {
                    syuturyoku.Append(GetSrcDan_WithoutErrorCheck(v).ToString());
                }
            }

            //------------------------------------------------------------
            // (至)筋
            //------------------------------------------------------------
            if (Option_Application.Optionlist.USI)
            {
                syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetDstSuji_WithoutErrorCheck(v));
            }
            else
            {
                syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetDstSuji_WithoutErrorCheck(v)));
            }

            //------------------------------------------------------------
            // (至)段
            //------------------------------------------------------------
            if (Option_Application.Optionlist.USI)
            {
                syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetDstDan_WithoutErrorCheck(v)));
            }
            else
            {
                syuturyoku.Append(GetDstDan_WithoutErrorCheck(v).ToString());
            }

            //------------------------------------------------------------
            // 成
            //------------------------------------------------------------
            int natta;

            {
                // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト
                natta = (v & (int)MoveMask.Natta) >> (int)MoveShift.Natta;
            }
            if (1 == natta)
            {
                syuturyoku.Append("+");
            }
        }