Exemplo n.º 1
0
        /// <summary>
        /// 桂馬跳び左
        /// </summary>
        /// <param name="ms"></param>
        /// <param name="tb"></param>
        /// <returns></returns>
        static void TasuKeimatobiHidari(Piece km, Masu ms)
        {
            Taikyokusya tai = Med_Koma.KomaToTaikyokusya(km);

            if (!BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_UsagigaHidariniToberu(tai, ms))
            {
                switch (tai)
                {
                case Taikyokusya.T1:
                {
                    Masu ms_tmp = ms - 2 * PureSettei.banYokoHaba - 1;
                    if (Conv_Masu.IsBanjo(ms_tmp))
                    {
                        BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp);
                    }
                }
                break;

                case Taikyokusya.T2:
                {
                    Masu ms_tmp = ms + 2 * PureSettei.banYokoHaba + 1;
                    if (Conv_Masu.IsBanjo(ms_tmp))
                    {
                        BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp);
                    }
                }
                break;

                default: break;
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// この左上
        /// </summary>
        /// <param name="ms"></param>
        /// <param name="tb"></param>
        /// <returns></returns>
        static void TasuKonoHidariue(Piece km, Masu ms)
        {
            switch (Med_Koma.KomaToTaikyokusya(km))
            {
            case Taikyokusya.T1:
                if (!BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_UeHajiDan(ms) && !BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_HidariHajiSuji(ms))
                {
                    Masu ms_tmp = ms - PureSettei.banYokoHaba - 1;
                    if (Conv_Masu.IsBanjo(ms_tmp))
                    {
                        BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp);
                    }
                }
                break;

            case Taikyokusya.T2:
                if (!BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_SitaHajiDan(ms) && !BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_MigiHajiSuji(ms))
                {
                    Masu ms_tmp = ms + PureSettei.banYokoHaba + 1;
                    if (Conv_Masu.IsBanjo(ms_tmp))
                    {
                        BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp);
                    }
                }
                break;

            default: break;
            }
        }
Exemplo n.º 3
0
        public static bool CanDoMove(Move ss, out MoveMatigaiRiyu reason)
        {
            if (Move.Toryo == ss)
            {
                reason = MoveMatigaiRiyu.Karappo; return(true);
            }                                                                       // 投了はOKだぜ☆(^~^)

            // 打つ駒調べ
            MotigomaSyurui mksUtta = AbstractConvMove.GetUttaKomasyurui(ss);// 打った駒の種類
            bool           utta    = MotigomaSyurui.Yososu != mksUtta;

            if (utta)
            {
                // 「打」の場合、持ち駒チェック☆
                if (!PureMemory.gky_ky.yomiKy.yomiMotigomaItiran.HasMotigoma(Med_Koma.MotiKomasyuruiAndTaikyokusyaToMotiKoma(mksUtta, PureMemory.kifu_teban)))
                {
                    // 持駒が無いのに打とうとしたぜ☆(>_<)
                    reason = MoveMatigaiRiyu.NaiMotiKomaUti;
                    return(false);
                }
            }

            // 移動先、打つ先 調べ☆
            Masu ms_dst = AbstractConvMove.GetDstMasu_WithoutErrorCheck((int)ss); // 移動先升

            if (!Conv_Masu.IsBanjo(ms_dst))
            {
                // 盤外に移動しようとしたぜ☆(^~^)
                reason = MoveMatigaiRiyu.BangaiIdo;
                return(false);
            }
            Piece       km_dst    = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma(ms_dst);
            Taikyokusya tai_dstKm = Med_Koma.KomaToTaikyokusya(km_dst);

            if (km_dst != Piece.Kuhaku && PureMemory.kifu_teban == tai_dstKm)
            {
                // 自分の駒を取ろうとするのは、イリーガル・ムーブだぜ☆(^▽^)
                reason = MoveMatigaiRiyu.TebanKomaNoTokoroheIdo;
                return(false);
            }
            else if (utta && km_dst != Piece.Kuhaku)
            {
                // 駒があるところに打ち込んではいけないぜ☆(^▽^)
                reason = MoveMatigaiRiyu.KomaGaAruTokoroheUti;
                return(false);
            }


            // 移動元調べ☆
            Piece km_src;

            if (utta)
            {
                // 「打」のときは ここ。
                km_src = Med_Koma.MotiKomasyuruiAndTaikyokusyaToKoma(mksUtta, PureMemory.kifu_teban);
            }
            else
            {
                Masu ms_src = AbstractConvMove.GetSrcMasu_WithoutErrorCheck((int)ss); // 移動先升
                km_src = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma(ms_src);
                Taikyokusya tai_srcKm = Med_Koma.KomaToTaikyokusya(km_src);
                if (km_src == Piece.Kuhaku)
                {
                    // 空き升に駒があると思って動かそうとするのは、イリーガル・ムーブだぜ☆(^▽^)
                    reason = MoveMatigaiRiyu.KuhakuWoIdo;
                    return(false);
                }
                else if (tai_srcKm != PureMemory.kifu_teban)
                {
                    // 相手の駒を動かそうとするのは、イリーガル・ムーブだぜ☆(^▽^)
                    reason = MoveMatigaiRiyu.AiteNoKomaIdo;
                    return(false);
                }


                // 移動方向調べ
                if (!BitboardsOmatome.KomanoUgokikataYk00.IsIntersect(
                        km_src,
                        ms_src, //この2つのマスが交わっているか
                        ms_dst  //この2つのマスが交わっているか
                        ))
                {
                    // その駒の種類からは、ありえない動きをしたぜ☆(^▽^)
//#if DEBUG

//                    throw new Exception($"その駒の種類からは、ありえない動きをしたぜ☆(^▽^) ms1=[{ ms_src }] ms2=[{ ms_dst }]");
//#else
                    reason = MoveMatigaiRiyu.SonoKomasyuruiKarahaArienaiUgoki;
                    return(false);
//#endif
                }
            }


            // 成り調べ
            if (AbstractConvMove.IsNatta(ss))//成りを指示した場合
            {
                switch (PureSettei.gameRule)
                {
                case GameRule.DobutuShogi:
                {
                    if (Med_Koma.KomaToKomasyurui(km_src) != Komasyurui.H)
                    {
                        // ひよこ以外が、にわとりになろうとしました☆
                        reason = MoveMatigaiRiyu.NarenaiNari;
                        return(false);
                    }
                }
                break;

                case GameRule.HonShogi:
                {
                    switch (Med_Koma.KomaToKomasyurui(km_src))
                    {
                    case Komasyurui.H:
                    case Komasyurui.K:
                    case Komasyurui.N:
                    case Komasyurui.S:
                    case Komasyurui.U:
                    case Komasyurui.Z:
                        // セーフ
                        break;

                    case Komasyurui.I:
                    case Komasyurui.PH:
                    case Komasyurui.PK:
                    case Komasyurui.PN:
                    case Komasyurui.PS:
                    case Komasyurui.PU:
                    case Komasyurui.PZ:
                    case Komasyurui.R:
                    case Komasyurui.Yososu:            //FIXME:
                    default:
                    {
                        // 成れる駒以外が、成ろうとしました☆
                        reason = MoveMatigaiRiyu.NarenaiNari;
                        return(false);
                    }
                    }
                }
                break;
                }
            }

            reason = MoveMatigaiRiyu.Karappo;
            return(true);
        }