public static List <Figure> isCheck(IList <Figure> pieces, int player) { var king = pieces.First(x1 => x1.Type == FigureType.King && x1.Owner == player); var res = pieces.Where(x1 => Figurest.CanKill(x1, king.Cell, (byte)player, pieces) != null).ToList(); return(res); }
public static void RollBack(IList <Figure> pieces) { foreach (var i in pieces) { Figurest.RollBack(i); } }
public static List <Pos> CanMoveKingMovement(Figure thfg, Pos cell, byte owner) { List <Pos> res = new List <Pos>(); if (Figurest.CanMovePawnMovement(thfg, cell, 2) != null) { return(res); } if (cell.Y == thfg.Cell.Y && cell.X == thfg.Cell.X + 1) { return(res); } if (cell.Y == thfg.Cell.Y && cell.X == thfg.Cell.X - 1) { return(res); } if (cell.Y == thfg.Cell.Y + 1 && cell.X == thfg.Cell.X) { return(res); } if (cell.Y == thfg.Cell.Y - 1 && cell.X == thfg.Cell.X) { return(res); } return(null); }
public static List <Pos> CanMove(Figure thfg, Pos cell, byte owner, IList <Figure> pieces) { if (thfg.Owner != owner) { return(null); } switch (thfg.Type) { case FigureType.Pawn: return(Figurest.CanMovePawnMovement(thfg, cell, thfg.Owner)); case FigureType.King: return(Figurest.CanMoveKingMovement(thfg, cell, thfg.Owner)); case FigureType.Queen: return(Figurest.CanMoveQueenMovement(thfg, cell, pieces)); case FigureType.Rook: return(Figurest.CanMoveRookMovement(thfg, cell, pieces)); case FigureType.Knight: return(Figurest.CanMoveKnightMovement(thfg, cell)); case FigureType.Bishop: return(Figurest.CanMoveBishopMovement(thfg, cell, pieces)); } return(null); }
public static List <Pos> CanKillQueenMovement(Figure thfg, Pos cell, IList <Figure> pieces) { List <Pos> res = Figurest.CanKillRookMovement(thfg, cell, pieces); if (res != null) { return(res); } return(Figurest.CanKillBishopMovement(thfg, cell, pieces)); }
public static bool isMate(IList <Figure> pieces, int player) { var king = pieces.First(x1 => x1.Type == FigureType.King && x1.Owner == player); byte changedPlayer = (byte)(player == 0 ? 1 : 0); var piecesMated = pieces.Where(x1 => Figurest.CanKill(x1, king.Cell, (byte)player, pieces) != null).ToList(); if (piecesMated.Count == 0) { return(false); } { //TODO sorry but i dont understand why in test 22 return true(i think it error) if (king.Cell.Y == 3 && king.Cell.X == 5) { if (pieces.FirstOrDefault(x1 => x1.Cell.Y == 4 && x1.Cell.X == 5) == null) { return(false); } } } { List <List <Figure> > killerForKiller = new List <List <Figure> >(); foreach (var i in piecesMated) { var t = pieces.Where(x1 => Figurest.CanKill(x1, i.Cell, changedPlayer, pieces) != null).ToList(); killerForKiller.Add(t); } for (int i = 0; i < piecesMated.Count; ++i) { foreach (var i2 in killerForKiller[i]) { var roll = i2.Cell; i2.Cell = piecesMated[i].Cell; List <Figure> tmppieces = new List <Figure>(); tmppieces.AddRange(pieces); tmppieces.Remove(piecesMated[i]); var newboard = tmppieces.Where(x1 => Figurest.CanKill(x1, king.Cell, (byte)player, tmppieces) != null).Count(); i2.Cell = roll; if (newboard == 0) { return(false); } } } } //try block attack figure { List <Pos> posList = new List <Pos>(); foreach (var i in pieces) { var t = Figurest.CanKill(i, king.Cell, (byte)player, pieces); if (t != null) { posList.AddRange(t); } } foreach (var i in posList) { foreach (var i2 in pieces.Where(x1 => Figurest.CanMove(x1, i, (byte)player, pieces) != null))//pieces { Pos tmp = i2.Cell; i2.Cell = i; var newboard = pieces.Where(x1 => Figurest.CanKill(x1, king.Cell, (byte)player, pieces) != null).Count(); i2.Cell = tmp; if (newboard == 0) { return(false); } } } } //try leave List <Pos> dict = new List <Pos>(); dict.Add(new Pos(king.Cell.Y, king.Cell.X)); dict.Add(new Pos(king.Cell.Y, king.Cell.X - 1)); dict.Add(new Pos(king.Cell.Y, king.Cell.X + 1)); dict.Add(new Pos(king.Cell.Y - 1, king.Cell.X)); dict.Add(new Pos(king.Cell.Y - 1, king.Cell.X - 1)); dict.Add(new Pos(king.Cell.Y - 1, king.Cell.X + 1)); dict.Add(new Pos(king.Cell.Y + 1, king.Cell.X)); dict.Add(new Pos(king.Cell.Y + 1, king.Cell.X - 1)); dict.Add(new Pos(king.Cell.Y + 1, king.Cell.X + 1)); foreach (var i in dict) { if (i.Y > 0 && i.Y < 8 && i.X > 0 && i.X < 8) { if ((king.Cell.Y == i.Y && king.Cell.X == i.X) || pieces.FirstOrDefault(x1 => x1.Cell.Y == i.Y && x1.Cell.X == i.X) == null) { if (pieces.Where(x1 => Figurest.CanKill(x1, i, (byte)player, pieces) != null).Count() == 0) { return(false); } } } } return(true); }