コード例 #1
0
ファイル: Mova.cs プロジェクト: vyz/myViz
 public Mova(bool pcolo, Pieco pfigo, int pif, int pit, MovoTypo pmt)
 {
     coala = pcolo;
     figo = pfigo;
     fromo = pif;
     tomo = pit;
     typo = pmt;
     shorto = null;
 }
コード例 #2
0
ファイル: Mova.cs プロジェクト: vyz/myViz
 public Mova(bool pcolo, Pieco pfigo, int pif, int pit, MovoTypo pmt)
 {
     coala  = pcolo;
     figo   = pfigo;
     fromo  = pif;
     tomo   = pit;
     typo   = pmt;
     shorto = null;
 }
コード例 #3
0
ファイル: PozoUtils.cs プロジェクト: vyz/myViz
 /// <summary>
 /// Модификация от 21 июля 2015 года
 /// Заложен 2015 год
 /// </summary>
 /// <param name="pif"></param>
 /// <param name="pit"></param>
 /// <param name="addo"></param>
 /// <returns></returns>
 private List<Mova> AddPawnPromotion(int pif, int pit, MovoTypo addo)
 {
     List<Mova> reto = new List<Mova>();
     MovoTypo movtyp = MovoTypo.PawnPromotionToQueen | addo;
     Pieco fipa = whitomv ? Pieco.Queen : (Pieco.Queen | Pieco.Black);
     if (IsAvailableMove(pif, pit, fipa, movtyp))
     {
         Mova aa = new Mova(whitomv, pBoard[pif], pif, pit, movtyp);
         reto.Add(aa);
     }
     movtyp = MovoTypo.PawnPromotionToRook | addo;
     fipa = whitomv ? Pieco.Rook : (Pieco.Rook | Pieco.Black);
     if (IsAvailableMove(pif, pit, fipa, movtyp))
     {
         Mova aa = new Mova(whitomv, pBoard[pif], pif, pit, movtyp);
         reto.Add(aa);
     }
     movtyp = MovoTypo.PawnPromotionToBishop | addo;
     fipa = whitomv ? Pieco.Bishop : (Pieco.Bishop | Pieco.Black);
     if (IsAvailableMove(pif, pit, fipa, movtyp))
     {
         Mova aa = new Mova(whitomv, pBoard[pif], pif, pit, movtyp);
         reto.Add(aa);
     }
     movtyp = MovoTypo.PawnPromotionToKnight | addo;
     fipa = whitomv ? Pieco.Knight : (Pieco.Knight | Pieco.Black);
     if (IsAvailableMove(pif, pit, fipa, movtyp))
     {
         Mova aa = new Mova(whitomv, pBoard[pif], pif, pit, movtyp);
         reto.Add(aa);
     }
     return reto;
 }
コード例 #4
0
ファイル: PozoUtils.cs プロジェクト: vyz/myViz
 private Mova AddMoveIsNotCheck(int pif, int pit, MovoTypo pmt)
 {
     Mova reto = null;
     if (IsAvailableMove(pif, pit, pBoard[pif], pmt))
     {
         reto = new Mova(whitomv, pBoard[pif], pif, pit, pmt);
     }
     return reto;
 }
コード例 #5
0
ファイル: PozoUtils.cs プロジェクト: vyz/myViz
 /// <summary>
 /// Перечень полей, откуда данная фигура может прийти (возможно и со взятием - смотри параметр pmt) на указанное поле
 /// Модификация от 26 августа 2015 года
 /// Заложен 24 июля 2015 года
 /// </summary>
 /// <param name="who">Фигура, для которой составляется список</param>
 /// <param name="fildo">Поле, куда стремится указанная фигура</param>
 /// <param name="pmt">Тип - просто ход или даже взятие</param>
 /// <returns>Список, предполагающий максимум две начальные точки, хотя теоретически никто не отменял три и более. Вопрос реальности этого в жизни!!!</returns>
 public List<int> ListFieldsFromAttackedThisField(Pieco who, int fildo, MovoTypo pmt)
 {
     List<int> reto = new List<int>(2); //Не больше 2
     if (!whitomv) { who |= Pieco.Black; }
     for (int i = 0; i < 64; i++) {
         if (pBoard[i] == who) {
             if( IsCanMove(who, i, fildo, (pmt & (~MovoTypo.MoveTypeMask)) == MovoTypo.PieceEaten) ) {
                 if (IsAvailableMove(i, fildo, who, pmt)) {
                     reto.Add(i);
                     }
                 }
             }
         }
     return reto;
 }
コード例 #6
0
ファイル: PozoUtils.cs プロジェクト: vyz/myViz
        /// <summary>
        /// Модификация от 26 августа 2015 года
        /// Заложен июнь 2015 года
        /// Функция перегружена из-за неоднозначности передаваемого цвета
        /// </summary>
        /// <param name="pp"></param>
        /// <param name="pcolor">Новый цвет - создаваемой уже после хода позиции
        /// Но это не всегда. При вызове из функции IsAvailableMove цвет старый и вся эта позиция нужна только
        /// для проверки на неполучение шаха после сделанного хода</param>
        /// <param name="pif"></param>
        /// <param name="pit"></param>
        /// <param name="fipa"></param>
        /// <param name="pmt"></param>
        /// <param name="SvoyChuzhoy">Цвет свой (true) или чужой для хода</param>
        public PozoUtils(Pieco[] pp, bool pcolor, int pif, int pit, Pieco fipa, MovoTypo pmt, bool SvoyChuzhoy)
        {
            pBoard = new Pieco[64];
            Pieco pkinga = pcolor ? Pieco.King : (Pieco.King | Pieco.Black);
            for (int i = 63; i >= 0; i--) {
                if (pp[i] == pkinga) { kingo = i; }
                pBoard[i] = pp[i];
                }
            if (fipa == pkinga) { kingo = pit; } //Предположительно неразумная вставка.  Условие никогда не может быть выполнено. Ха ха. Цвета разные.
            //так как короли разные у фигуры еще прошлый король, а у pkinga уже новый.
            pBoard[pif] = Pieco.None;
            pBoard[pit] = fipa;
            if ((pmt & MovoTypo.EnPassant) > 0) {
                int oldpawn = 0;
                if (SvoyChuzhoy)
                {
                    oldpawn = pit + (pcolor ? -8 : 8);
                }
                else
                {
                    oldpawn = pit + (pcolor ? 8 : -8);
                }
                pBoard[oldpawn] = Pieco.None;
                }
            if (pmt == MovoTypo.Castle) { //Страшная хардкорщина. Но на самом деле нормально.
                switch (pit) {
                    case 1:
                        pBoard[2] = pBoard[0];
                        pBoard[0] = Pieco.None;
                        break;
                    case 5:
                        pBoard[4] = pBoard[7];
                        pBoard[7] = Pieco.None;
                        break;
                    case 57:
                        pBoard[58] = pBoard[56];
                        pBoard[56] = Pieco.None;
                        break;
                    case 61:
                        pBoard[60] = pBoard[63];
                        pBoard[63] = Pieco.None;
                        break;
                    }
                }
            bool prevrashenye = (SvoyChuzhoy) ? !pcolor : pcolor;
            if ((pmt & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToQueen) { pBoard[pit] = Pieco.Queen | (prevrashenye ? Pieco.Black : Pieco.White); }
            else if ((pmt & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToRook) { pBoard[pit] = Pieco.Rook | (prevrashenye ? Pieco.Black : Pieco.White); }
            else if ((pmt & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToKnight) { pBoard[pit] = Pieco.Knight | (prevrashenye ? Pieco.Black : Pieco.White); }
            else if ((pmt & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToBishop) { pBoard[pit] = Pieco.Bishop | (prevrashenye ? Pieco.Black : Pieco.White); }

            if (fipa == (Pieco.Pawn | Pieco.White) && ((pif - pit) == 16)) {
                if ((pit % 8 > 0 && pBoard[pit - 1] == (Pieco.Pawn | Pieco.Black)) ||
                    (pit % 8 < 7 && pBoard[pit + 1] == (Pieco.Pawn | Pieco.Black))) {
                    enpasso = true;
                    enfield = pit - 24;
                    }
            } else if (fipa == (Pieco.Pawn | Pieco.Black) && (pif - pit == 16)) {
                if ((pit % 8 > 0 && pBoard[pit - 1] == (Pieco.Pawn | Pieco.White)) ||
                    (pit % 8 < 7 && pBoard[pit + 1] == (Pieco.Pawn | Pieco.White))) {
                    enpasso = true;
                    enfield = pit - 24;
                    }
                }
            whitomv = pcolor;
        }
コード例 #7
0
ファイル: PozoUtils.cs プロジェクト: vyz/myViz
        private bool IsAvailableMove(int pif, int pit, Pieco fipa, MovoTypo pmt)
        {
            bool reto = false;

            PozoUtils nnp = new PozoUtils(pBoard, whitomv, pif, pit, fipa, pmt, true);
            reto = nnp.IsNoCheck();
            return reto;
        }