Example #1
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);
        }
Example #2
0
 /// <summary>
 /// 改造Fen用の文字列を返すぜ☆(^▽^)
 /// </summary>
 /// <param name="ks"></param>
 /// <returns></returns>
 public static void AppendFenTo(bool isSfen, MotiKomasyurui mks, StringBuilder syuturyoku)
 {
     if (isSfen)
     {
         syuturyoku.Append(Conv_MotiKomasyurui.m_sfen_[(int)mks]);
     }
     else
     {
         syuturyoku.Append(Conv_MotiKomasyurui.m_dfen_[(int)mks]);
     }
 }
Example #3
0
        /// <summary>
        /// 局面に点数を付けるぜ☆(^▽^)
        ///
        /// どちらの対局者でも、自分に有利と思っていれば正の数の方向に点数が付くぜ☆(^▽^)
        /// </summary>
        /// <param name="ky_base"></param>
        /// <returns></returns>
        public void Tukurinaosi(Kyokumen.Sindanyo kys)
        {
            Hyokati[] hyokati = new Hyokati[] { Hyokati.Hyokati_Rei, Hyokati.Hyokati_Rei
                                                , Hyokati.Hyokati_Rei // 空白は手番なしで ここに入れるぜ☆(^~^)
            };

            // 盤上
            Bitboard komaBB = new Bitboard();

            for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++)
            {
                var optionalPhase = Conv_Taikyokusya.AllOptionalPhaseList[iTai];
                for (int iKs = 0; iKs < Conv_Komasyurui.Itiran.Length; iKs++)
                {
                    Komasyurui ks = Conv_Komasyurui.Itiran[iKs];

                    kys.ToSetIbasho(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase), komaBB);
                    while (komaBB.Ref_PopNTZ(out Masu ms_jissai))
                    {
                        hyokati[iTai] += Conv_Koma.BanjoKomaHyokatiNumber[(int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase)];
                    }
                }
            }

            // 持ち駒
            foreach (MotiKoma mk in Conv_MotiKoma.Itiran)
            {
                var            optionalPhase = Med_Koma.MotiKomaToPhase(mk);
                var            phaseIndex    = OptionalPhase.IndexOf(optionalPhase);
                MotiKomasyurui mks           = Med_Koma.MotiKomaToMotiKomasyrui(mk);
                Hyokati        komaHyokati   = Conv_Hyokati.KomaHyokati[(int)Med_Koma.MotiKomasyuruiAndPhaseToKoma(mks, optionalPhase)];

                hyokati[phaseIndex] += (int)komaHyokati * kys.CountMotikoma(mk);
            }

            // 手番 - 相手番
            Hyokati hyokatiP1 = hyokati[(int)Phase.Black];

            hyokati[(int)Phase.Black] -= hyokati[(int)Phase.White];
            hyokati[(int)Phase.White] -= hyokatiP1;
            KomawariHyokati_Sabun      = hyokati;
        }
Example #4
0
        /// <summary>
        /// 現局面の盤上、駒台に置いてある駒を 駒の種類別に数え、
        /// 片方の対局者の駒台に全部乗れるよう、拡張する。
        /// </summary>
        public static void Tukurinaosi(Kyokumen.Sindanyo kys)
        {
            // 盤上
            m_banjoKeys_ = new ulong[kys.MASU_YOSOSU, Conv_Koma.Itiran.Length];
            for (int iMs = 0; iMs < kys.MASU_YOSOSU; iMs++)
            {
                foreach (Komasyurui ks in Conv_Komasyurui.Itiran)
                {
                    // 対局者1
                    m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.Black)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
                    // 対局者2
                    m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.White)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
                }
            }

            // 持ち駒
            {
                m_motiKeys_ = new ulong[Conv_MotiKoma.Itiran.Length][];

                int[] counts = kys.CountMotikomaHashSize();
                foreach (MotiKoma mk in Conv_MotiKoma.Itiran)
                {
                    MotiKomasyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk);
                    m_motiKeys_[(int)mk] = new ulong[counts[(int)mks]];
                    for (int iCount = 0; iCount < counts[(int)mks]; iCount++)
                    {
                        m_motiKeys_[(int)mk][iCount] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
                    }
                }
            }

            // 手番
            m_tbTaikyokusya_ = new ulong[Conv_Taikyokusya.AllOptionalPhaseList.Length];
            foreach (var optionalPhase78 in Conv_Taikyokusya.AllOptionalPhaseList)
            {
                m_tbTaikyokusya_[OptionalPhase.IndexOf(optionalPhase78)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
            }

            Dirty = false;
        }
Example #5
0
 public static bool IsOk(MotiKomasyurui mks)
 {
     return(MotiKomasyurui.Z <= mks && mks < MotiKomasyurui.Yososu);
 }
Example #6
0
 public static string GetHyojiName(MotiKomasyurui mks)
 {
     return(m_hyojiName_[(int)mks]);
 }
Example #7
0
 public static Koma MotiKomasyuruiAndPhaseToKoma(MotiKomasyurui mks, Option <Phase> optionalPhase)
 {
     return(Med_Koma.m_MotiKomasyuruiAndPhaseToKoma_[(int)mks, OptionalPhase.IndexOf(optionalPhase)]);
 }
Example #8
0
 public static MotiKoma MotiKomasyuruiAndPhaseToMotiKoma(MotiKomasyurui mks, Option <Phase> phase)
 {
     return(m_MotiKomasyuruiAndPhaseToMotiKoma_[(int)mks, OptionalPhase.IndexOf(phase)]);
 }
Example #9
0
 public static Komasyurui MotiKomasyuruiToKomasyrui(MotiKomasyurui mks)
 {
     return(Med_Koma.m_MotiKomasyuruiToKomasyurui_[(int)mks]);
 }
Example #10
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("+");
            }
        }