public void Checkmate3() { var field = new VirtualField(VirtualFieldUtils.CreateEmptyField()); var factory = new PieceMasterFactory(); field[0, 0] = ChessPiece.WhiteKing; field[1, 2] = ChessPiece.BlackKing; field[7, 0] = ChessPiece.BlackQueen; bool isCheck; Assert.IsTrue(CheckMateLogic.IsCheckMate(PlayerColor.Black, field, factory, out isCheck)); Assert.IsTrue(isCheck); }
public void NoCheckmate3() { var field = new VirtualField(VirtualFieldUtils.CreateEmptyField()); var factory = new PieceMasterFactory(); field[7, 0] = ChessPiece.WhiteRook; field[6, 4] = ChessPiece.WhiteRook; field[1, 1] = ChessPiece.BlackKing; field[6, 7] = ChessPiece.WhiteKing; bool isCheck; Assert.IsFalse(CheckMateLogic.IsCheckMate(PlayerColor.White, field, factory, out isCheck)); Assert.IsFalse(isCheck); }
public void NoCheckmate2() { var field = new VirtualField(VirtualFieldUtils.CreateEmptyField()); var factory = new PieceMasterFactory(); field[1, 1] = ChessPiece.WhiteKing; field[5, 6] = ChessPiece.BlackKing; field[7, 0] = ChessPiece.BlackRook; field[0, 7] = ChessPiece.BlackRook; // Eat for no checkmate field[2, 2] = ChessPiece.BlackQueen; bool isCheck; Assert.IsFalse(CheckMateLogic.IsCheckMate(PlayerColor.Black, field, factory, out isCheck)); Assert.IsTrue(isCheck); }
/// <inheritdoc/> protected override IEnumerable <ChessPoint> GetAvailableMovements(bool onlySteps = false) { /******************* * (-1,-1)(0,-1)(1,-1) * (-1,0) (King) (1,0) * (-1,1) (0,1) (1,1) *******************/ // АЛГОРИТМ // Выясняем куда ВСЕ фигуры могу ходить, затем создаём поле где проставляем все движения всех фигур и выясняем куда можно куда нельзя ходить. НЕ ЗАБЫВАЕМ что // Стоит не забывать что фигура достающая до союзной - защищает НО НАМ ЭТО НЕ НАДО // Check cells around var movements = new[] { new ChessVector(-1, -1), new ChessVector(0, -1), new ChessVector(1, -1), new ChessVector(-1, 0), new ChessVector(1, 0), new ChessVector(-1, 1), new ChessVector(0, 1), new ChessVector(1, 1), }; var avaliableMovements = movements.Select(vector => ChessPoint.Add(Position, vector)) .Where(CanMove); if (onlySteps) { return(avaliableMovements); } var piecePlayerColor = Field[Position].GetPlayerColor().Value; var opponentColorInitiator = piecePlayerColor.Invert(); var underAttackPoints = CheckMateLogic.UnderAttackPoints(opponentColorInitiator, Field, new PieceMasterFactory()); var r = avaliableMovements.Where(point => !underAttackPoints.Contains(point)); var d = r.ToArray(); return(d); }
/// <inheritdoc/> public void Move(string sessionId, ChessPoint from, ChessPoint to) { if (!_isInitialized) { throw new InvalidOperationException("Game isn't initialized"); } // Who makes a movement var initiator = GetPlayer(sessionId); // His opponent var opponent = Player1 == initiator ? Player2 : Player1; var piece = _virtualField[from.X, from.Y]; // Check for hacker movements CheaterCheck(initiator, from, to); ThreadPool.QueueUserWorkItem( obj => { _virtualField[to.X, to.Y] = piece; _virtualField[from.X, from.Y] = ChessPiece.Empty; bool isCheck; var isCheckMate = CheckMateLogic.IsCheckMate( initiator.PlayerColor, _virtualField, _masterFactory, out isCheck); _checkedPlayer = isCheck ? opponent.PlayerColor : (PlayerColor?)null; if (isCheckMate) { NotifyAboutCheckMate(initiator, opponent, from, to); } else { NotifyFieldChanged(initiator, opponent, from, to); } }); }