public Mova(bool pcolo, Pieco pfigo, int pif, int pit, MovoTypo pmt) { coala = pcolo; figo = pfigo; fromo = pif; tomo = pit; typo = pmt; shorto = null; }
/// <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; }
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; }
/// <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; }
/// <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; }
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; }