Все работает правильно, перепробовал все комбинации... и не проходит по 5 и 6 пунктам... помогите плиз!
package com.javarush.task.task35.task3513;

import java.util.*;
import java.util.stream.IntStream;


public class Model {

    private static final int FIELD_WIDTH = 4;
    private static Tile[][] gameTiles;
    protected int score = 0;
    protected int maxTile = 2;

    public Model() {
        resetGameTiles();

    }

    public void resetGameTiles() {
        gameTiles = new Tile[FIELD_WIDTH][FIELD_WIDTH];
        for (int i = 0; i < gameTiles.length; i++) {
            for (int j = 0; j < gameTiles[0].length; j++) {
                gameTiles[i][j] = new Tile();
            }
        }


        /*IntStream.range(0, FIELD_WIDTH).forEach(
                i-> {
                    IntStream.range(0, FIELD_WIDTH).forEach(
                            j-> gameTiles[j][i] = new Tile()
                    );
                }
        );*/
        addTile();
        addTile();
    }

    private void addTile() {
        List<Tile> emptyTiles = getEmptyTiles();
        if(emptyTiles.size()>0) {
            emptyTiles.get((int) (Math.random() * emptyTiles.size())).value = (Math.random() < 0.9) ? 2 : 4;
        }

    }

    private List< Tile> getEmptyTiles() {
        List<Tile> tiles = new ArrayList<>();
        IntStream.range(0, FIELD_WIDTH).forEach((i) -> {
            Arrays.stream(gameTiles[i])
                    .filter(Tile::isEmpty)
                    .forEach(tiles::add);
        });

        /*for (int i = 0; i <gameTiles.length ; i++) {
            for (int j = 0; j <gameTiles[0].length ; j++) {
                if(gameTiles[j][i].isEmpty()){
                    tiles.add(gameTiles[j][i]);
                }
            }
        }*/
        return tiles;
    }

    private boolean compressTiles(Tile[] tiles) {
        boolean x = false;
        for (int j = tiles.length - 1; j > 0; j--) {
            for (int i = 0; i < j; i++) {
                if (tiles[i].isEmpty()&& !tiles[i+1].isEmpty()) {
                    tiles[i].value = tiles[i + 1].value;
                    tiles[i + 1].value = 0;
                    //tiles[i+1] = new Tile();
                    x = true;
                }
            }
        }
        //mergeTiles(tiles);
        return x;
    }

    private boolean mergeTiles(Tile[] tiles) {
        boolean x = false;
        for (int i = 1; i < tiles.length; i++) {
            if (tiles[i - 1].value == tiles[i].value && !tiles[i-1].isEmpty() && !tiles[i].isEmpty()) {
                tiles[i - 1].value *= 2;
                tiles[i].value = 0;
                //tiles[i] = new Tile();
                if (tiles[i - 1].value > maxTile) {
                    maxTile = tiles[i - 1].value;
                }
                score += tiles[i - 1].value;
                x = true;

                /*i+=1;
                for (; i <tiles.length-1 ; i++) {
                    tiles[i].value = tiles[i+1].value;
                }
                tiles[tiles.length-1].value = 0;*/
            }
        }
        //boolean y = compressTiles(tiles);
        return x;
    }

    public void left() {

        boolean isChanged = false;
        for (int i = 0; i < FIELD_WIDTH; i++) {
            if ( mergeTiles(gameTiles[i]) | compressTiles(gameTiles[i])) {
                isChanged = true;
            }
        }
        if (isChanged) {
            addTile();
        }
    }

    /*public static void print(Tile[][] tiles) {
        for (int i = 0; i < tiles.length; i++) {
            for (int j = 0; j < tiles[i].length; j++) {
                System.out.print(tiles[i][j].value + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        gameTiles = new Tile[][]{{new Tile(4), new Tile(2), new Tile(8), new Tile(4)},
                {new Tile(4), new Tile(8), new Tile(2), new Tile(4)},
                {new Tile(16), new Tile(16), new Tile(4), new Tile(2)},
                {new Tile(2), new Tile(4), new Tile(8), new Tile(2)}};
        print(gameTiles);

        Model model = new Model();
        //model.compressTiles(tiles);
        //model.mergeTiles(tiles);
        model.left();
        print(gameTiles);
        //model.compressTiles(tiles);
        //print(tiles);

        //model.mergeTiles(tiles);
        //print(tiles);
        //model.mergeTiles(tiles);
        //print(tiles);
    }*/