示例#1
0
 /// <summary>
 /// In the future, I should be passing back all the moves rather than a boolean
 /// that way the engine can have metadata about all the possible moves that
 /// could be taken and maybe offer a suggestion.
 /// </summary>
 /// <param name="attacksOnKing"></param>
 /// <param name="teamAttacks"></param>
 /// <returns></returns>
 private bool interpositionsExist(IEnumerable <AttackedSquare> attacksOnKing, IEnumerable <AttackedSquare> teamAttacks)
 {
     foreach (var attackOnKing in attacksOnKing)
     {
         var attackIsOrthogonal = GeneralEngine.IsOrthogonal(attackOnKing.AttackingSquare.Index, attackOnKing.Index);
         var attackIsDiagonal   = DiagonalEngine.IsDiagonal(attackOnKing.AttackingSquare.Index, attackOnKing.Index);
         var range = new List <Square>();
         if (attackIsOrthogonal)
         {
             var isRankMove = GeneralEngine.GivenOrthogonalMove_IsItARankMove(attackOnKing.AttackingSquare.Index, attackOnKing.Index);
             var oxs        = getEntireOrthogonalLine(isRankMove, attackOnKing, true);
             var ixs        = teamAttacks.Select(a => a.Index).Intersect(oxs);
             if (ixs.Any())
             {
                 return(true);
             }
         }
         else if (attackIsDiagonal)
         {
             var dxs = DiagonalEngine.GetDiagonalLine(attackOnKing.AttackingSquare.Index, attackOnKing.Index);
             //if dxs contains the clearMove.Index, then the king has not moved out of check
             var ixs = teamAttacks.Select(a => a.Index).Intersect(dxs);
             if (ixs.Any())
             {
                 return(true);
             }
         }
         //else it could be a knight attack, but no interpositions would exist
     }
     return(false);
 }
示例#2
0
        private bool mayKingMoveDiagonallyHere(AttackedSquare clearMove, IEnumerable <AttackedSquare> attacksOnKing, List <AttackedSquare> attacks)
        {
            var kingSquare = (Square)attacksOnKing.First();
            //need to detect if we're moving into check
            var anybodyAttackingThisSquare = attacks.Any(a => a.Index == clearMove.Index && a.AttackingSquare.Piece.Color != kingSquare.Piece.Color);

            if (anybodyAttackingThisSquare)
            {
                return(false);
            }
            var diagonalAttacksOnKing = attacksOnKing.Where(a =>
                                                            diagonalAttackers.Contains(a.AttackingSquare.Piece.PieceType) &&
                                                            DiagonalEngine.IsDiagonal(a.Index, a.AttackingSquare.Index)
                                                            );

            if (!diagonalAttacksOnKing.Any())
            {
                return(true);
            }
            foreach (var x in diagonalAttacksOnKing)
            {
                var dxs = DiagonalEngine.GetDiagonalLine(x.Index, x.AttackingSquare.Index);
                //if dxs contains the clearMove.Index, then the king has not moved out of check
                if (dxs.Contains(clearMove.Index))
                {
                    return(false);
                }
            }
            return(true);
        }
示例#3
0
        private void getPieceAttacks(GameState gameState, Square square, List <AttackedSquare> accumulator)
        {
            switch (square.Piece.PieceType)
            {
            case PieceType.Pawn:
                getPawnAttacks(gameState, square, accumulator);
                break;

            case PieceType.Knight:
                getKnightAttacks(gameState, square, accumulator);
                break;

            case PieceType.Bishop:
                DiagonalEngine.GetDiagonals(gameState, square, accumulator);
                break;

            case PieceType.Rook:
                this._orthogonalService.GetOrthogonals(gameState, square, accumulator);
                break;

            case PieceType.Queen:
                this._orthogonalService.GetOrthogonals(gameState, square, accumulator);
                DiagonalEngine.GetDiagonals(gameState, square, accumulator);
                break;

            case PieceType.King:
                getKingAttacks(gameState, square, accumulator);
                break;

            default:
                throw new Exception("Mismatched Enum!");
            }
        }
 public void IsDiagonal()
 {
     Assert.IsTrue(DiagonalEngine.IsDiagonal(9, 27));
     Assert.IsTrue(DiagonalEngine.IsDiagonal(27, 9));
     Assert.IsTrue(DiagonalEngine.IsDiagonal(49, 35));
     Assert.IsTrue(DiagonalEngine.IsDiagonal(35, 49));
     Assert.IsFalse(DiagonalEngine.IsDiagonal(0, 7));
     Assert.IsFalse(DiagonalEngine.IsDiagonal(7, 0));
 }
        public void GetEntireDiagonalByPosition()
        {
            var list     = DiagonalEngine.GetEntireDiagonalByPosition(35);
            var accepted = new List <int> {
                8, 17, 26, 35, 44, 53, 62, 56, 49, 42, 28, 21, 14, 7
            };
            var remaining = accepted.Except(list);

            Assert.IsFalse(remaining.Any());
        }
示例#6
0
        //public bool IsCheckmate(GameState gameState, Square enemyKingPosition, IEnumerable<AttackedSquare> whiteAttacks, IEnumerable<AttackedSquare> blackAttacks) {
        //	var activeColor = gameState.ActiveColor;
        //	var squares = gameState.Squares;
        //	var checkedColor = gameState.ActiveColor == Color.White ? Color.White : Color.Black; //trust me this is right
        //	var kingIsBeingAttacked = whiteAttacks.Any(a => a.Index == enemyKingPosition.Index) || blackAttacks.Any(a => a.Index == enemyKingPosition.Index);
        //	if (!kingIsBeingAttacked) {
        //		return false;
        //	}
        //	//make sure that he cannot move
        //	var kingHasEscape = false;
        public bool IsValidPawnMove(Square currentSquare, List <Square> squares, Color color, int piecePosition, int newPiecePosition, bool isEnPassant)
        {
            var isDiagonalMove = DiagonalEngine.IsDiagonal(currentSquare.Index, newPiecePosition);

            if (!isDiagonalMove)
            {
                return(true);
            }
            var pieceToCapture = squares.GetSquare(newPiecePosition).Piece;
            var isCapture      = pieceToCapture != null;

            return(isCapture || isEnPassant);
        }
示例#7
0
        private void testDiagonalLine(int file, DiagonalDirectionFromFileNumber direction, List <int> squares)
        {
            var diagonalLine = DiagonalEngine.GetEntireDiagonalByFile(_gameState, file, direction);

            TestUtility.ListContainsSquares(diagonalLine, squares);
        }