private void compressTiles(Tile[] tiles) {
        for (int i = 0; i < tiles.length - 1; i++) {
            if(tiles[i].isEmpty()) {
                if(!tiles[i+1].isEmpty()) {
                    changeValues(tiles[i], tiles[i+1]);
                } else if(i + 2 <= tiles.length) {
                    if(!tiles[i+2].isEmpty()) {
                        changeValues(tiles[i], tiles[i+2]);
                    } else if(i + 3 <= tiles.length) {
                        if(!tiles[i+3].isEmpty()) {
                            changeValues(tiles[i], tiles[i+3]);
                        }
                    }
                }
            }
        }
        mergeTiles(tiles);
    }

    private void changeValues(Tile a, Tile b) {
        a.value = b.value;
        b.value = 0;
    }

    private void mergeTiles(Tile[] tiles) {
        for (int i = 0; i < tiles.length - 1; i++) {
            if(tiles[i].value == tiles[i+1].value) {
                tiles[i].value += tiles[i+1].value;
                tiles[i+1].value = 0;
                score += tiles[i].value;
                if(tiles[i].value > maxTile) {
                    maxTile = tiles[i].value;
                }
                compressTiles(tiles);
            }
        }
    }