@Override
    protected boolean isValidNonDropMove(GameState state, int x, int y) {
        /* Begins by verifying if a move is within the range of the board.
         * Then verifies if a move is on one of the diagonals (the change in x equals the change in y).
         * Then it checks to see if all tile on the way to the target tile is empty.
         * Finally, it check whether the target tile can be landed on.
         */
        int dx = x - this.x; 
        int dy = y - this.y;
        boolean validMove = !(x < 0 || x > 8) && !(y < 0 || y > 8);
        if (validMove && Math.abs(dx) == Math.abs(dy) && dy != 0) {
            for (int i = 1; validMove && i < Math.abs(dy); i++) {
                validMove = state.getPieceAt(this.x+i*((int)Math.signum(dx)), this.y+i*((int)Math.signum(dy))) instanceof EmptyPiece;
            }
            if (validMove) {
                validMove = state.getPieceAt(x, y).getAllegiance() != this.allegiance;
            }
        } else {
            validMove = false;
        }
        return validMove;
    }