public pozo() { pBoard = new Pieco[64]; qava = -1; pzu = null; controllomova = null; }
/// <summary> /// Модификация от 29 июля 2015 года /// Заложен 29 июля 2015 года /// </summary> /// <param name="ppb"></param> /// <param name="coloro"></param> /// <param name="prok"></param> /// <param name="penp"></param> /// <param name="penf"></param> /// <param name="ppmv"></param> /// <param name="pnum"></param> public pozo(Pieco[] ppb, bool coloro, Caslo prok, bool penp, int penf, int ppmv, int pnum) { pBoard = new Pieco[64]; for (int i = 0; i < 64; i++) { pBoard[i] = ppb[i]; } whitomv = coloro; rokko = prok; enpasso = penp; enfield = penf; pustomv = ppmv; numbero = pnum; qava = -1; pzu = null; controllomova = null; }
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; }
/// <summary> /// Модификация от 22 июля 2015 года /// Заложен май 2015 года /// </summary> private void AvailableFill() { pzu = new PozoUtils(pBoard, whitomv, rokko, enpasso, enfield); limov = pzu.MovaFill(); }
/// <summary> /// Модификация от 30 июля 2015 года /// Заложен 29 июля 2015 года /// </summary> /// <returns></returns> public pozo GetPozoAfterControlMove() { pozo reto = null; PozoUtils tmp = new PozoUtils(pBoard, !whitomv, controllomova.FromField, controllomova.ToField, controllomova.Figura, controllomova.MvType, false); Caslo cafmv = tmp.RokkoChangeAfterMove(rokko, controllomova); int zenpass = tmp.CanEnpasso(controllomova); bool benpass = (zenpass >= 0); if (benpass) { //Превращение из нормального целого поля в специальное короткое для позиции zenpass -= (zenpass < 24) ? 16 : 40; } int ppustomv = pustomv + 1; if( (controllomova.Figura & Pieco.PieceMask) == Pieco.Pawn || (controllomova.MvType & MovoTypo.PieceEaten) > 0 ) { ppustomv = 0; } reto = new pozo(tmp.Boardo, tmp.Coloro, cafmv, benpass, zenpass, ppustomv, numbero + (tmp.Coloro ? 1 : 0)); return reto; }
/// <summary> /// Модификация от 24 июля 2015 года /// Заложен 24 июля 2015 года /// </summary> /// <param name="aa"></param> /// <returns></returns> public bool ContraMov(string aa) { //AvailableFill(); if (null == pzu) { pzu = new PozoUtils(pBoard, whitomv, rokko, enpasso, enfield); } controllomova = pzu.MovaProverka(aa); bool reto = false; if( null != controllomova ) { reto = true; } return reto; }
/// <summary> /// Модификация от 26 августа 2015 года /// Заложен 27 июля 2015 года /// </summary> /// <param name="pp"></param> public void FormShortoString(PozoUtils pp) { StringBuilder fremo = new StringBuilder(4); if (typo == MovoTypo.Castle) { if (tomo == 1 || tomo == 57) { fremo.Append("O-O"); } else if (tomo == 5 || tomo == 61) { fremo.Append("O-O-O"); } else { fremo.Append("?????"); throw new VisualisatorException("Mova, рокировка неизвестного типа"); } } else { switch (figo & Pieco.PieceMask) { case Pieco.Pawn: if ((typo & MovoTypo.PieceEaten) > 0) { fremo.Append(Convert.ToChar((int)'h' - (fromo % 8))); } break; case Pieco.Knight: fremo.Append('N'); break; case Pieco.Bishop: fremo.Append('B'); break; case Pieco.Rook: fremo.Append('R'); break; case Pieco.Queen: fremo.Append('Q'); break; case Pieco.King: fremo.Append('K'); break; default: fremo.Append('?'); break; } List<int> lifi = pp.ListFieldsFromAttackedThisField(figo, tomo, typo); if (lifi.Count > 1 && lifi.Count < 3) { if( lifi[0] % 8 == lifi[1] % 8 ) { //Совпадение колонок fremo.Append( Convert.ToChar((int) '1' + (fromo / 8))); } else { //На совпадение строк не проверяем, главное что не совпадают колонки if (!((figo & Pieco.PieceMask) == Pieco.Pawn && (typo & MovoTypo.PieceEaten) > 0)) { fremo.Append(Convert.ToChar((int)'h' - (fromo % 8))); } } } else if( lifi.Count >= 3 || lifi.Count < 1) { throw new VisualisatorException(string.Format("Mova, Количество стартовых полей превышает разумные пределы --{0}--", lifi.Count)); } if ((typo & MovoTypo.PieceEaten) > 0) { fremo.Append('x'); } fremo.Append(Convert.ToChar((int)'h' - (tomo % 8))); fremo.Append(Convert.ToChar((int)'1' + (tomo / 8))); } if ((typo & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToQueen) { fremo.Append("=Q"); } else if ((typo & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToRook) { fremo.Append("=R"); } else if ((typo & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToKnight) { fremo.Append("=N"); } else if ((typo & MovoTypo.MoveTypeMask) == MovoTypo.PawnPromotionToBishop) { fremo.Append("=B"); } //мат и шах в хвост PozoUtils testo = new PozoUtils(pp.Boardo, !pp.Coloro, fromo, tomo, figo, typo, false); if(testo.IsCheckmated()) { fremo.Append('#'); } else if (!testo.IsNoCheck()) { fremo.Append('+'); } shorto = fremo.ToString(); }