2048 (4)

  • 36
  • Недоступна
Игра 2048 начинается на поле, где две плитки уже имеют какие-то начальные значения. А наше поле пока пусто :(. Прежде чем бросаться писать код, давай подумаем как это можно было бы реализовать. Предлагаю создать приватный метод addTile, который будет смотреть какие плитки пустуют и менять вес одной
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (81)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
tremb 31 уровень, Москва
14 февраля, 19:43
2773
alex_us 41 уровень, Симферополь
30 декабря 2020, 17:08
Как мне нравится эта задача после отвратительного HTML редактора... слов нет)
barracuda 35 уровень, Санкт-Петербург Expert
16 декабря 2020, 20:46
6 попыток, чтобы угадать, что же хотят постановщики задачи. Вот что они хотят, как я понял: 1. в конструкторе только это resetGameTiles(); 2. метод void resetGameTiles(){...} - с модификатором доступа package-private 3. Приводить к int нужно вс1ё выражение, а не только результат вычислений метода Math.random(): int randomIndex = (int)(list.size() * Math.random()); 4. Метод addTile(): Так как в классе Tile поле value с модификатором доступа package-private, меняем у существующей плитки значение через точку, без сеттеров/геттеров, и уж точно не создаем на месте этой плитки новую плитку. То есть в addTile() делаем так: Tile tile = list.get(randomIndex); tile.value = newValue; 5. Так же в методе addTile(): List<Tile> list = ... - именно List. А не одна из его реализаций. 6. Так же в методе addTile(): Проверка на пустой list: если он пустой, то ничего не делать, просто return из метода.
GBRTANK WARBOT 31 уровень, Самара
23 февраля, 12:56
Я вообще сделал возврат массива с [x, y] пустого Tile, и адресовал этот тайл через координаты, а оказалось можно сразу объекты Tile выдать в getEmptyTiles(). Ну и конечно никаких новых тайлов.
Alukard Vampire hunter в The HellsingExpert
6 декабря 2020, 00:10
А это нормально что я полез всё делать не в модели а в классе Tile? =\
Дмитрий Чесноков 31 уровень, Санкт-Петербург
10 января, 19:25
я тоже полез в Tile, потом прочел ваш коммент и с facepalm-ом переключился на Model))
Mike Starman 39 уровень, Киев
25 ноября 2020, 09:04
Не прошло по второму пункту. Делал так:
if (emptyTiles.size() > 0) {
     emptyTiles.set((int) (Math.random() * emptyTiles.size()),
                    new Tile(Math.random() < 0.9 ? 2 : 4));
}
Оказалось, что не надо умничать и создавать новый тайл, а просто взять случайный из списка и полю value присвоить требуемое значение:
emptyTiles.get((int) (Math.random() * emptyTiles.size())).value =
                                                    (Math.random() < 0.9 ? 2 : 4);
В общем, урок усвоил - не плоди новые сущности, а меняй поля имеющимся
NikeMirum 36 уровень, Великий Новгород
3 сентября 2020, 08:19
Я привык такие переборчики, которые нужны в методе getEmptyTiles() через "iter" + Tab в IDEA писать за считанные секунды, имхо они хорошо читабельны и не требуют привлечения ни Arrays, ни стримов, ни Collections:
private List<Tile> getEmptyTiles() {
    List<Tile> emptyTiles = new ArrayList<>();
    for (Tile[] gameTile : gameTiles) {
        for (Tile tile : gameTile) {
            if (tile.isEmpty()){
                emptyTiles.add(tile);
            }
        }
    }
    return emptyTiles;
}
Кто-нибудь может объяснить почему код выше хуже чем вот этот, который Валя принимает:
private List<Tile> getEmptyTiles() {
    return Arrays.stream(gameTiles).flatMap(Arrays::stream)
            .filter(Tile::isEmpty).collect(Collectors.toList());
}
, если результат тот же?
Тот кто в танке 41 уровень, Ярославль
10 сентября 2020, 11:52
странно, конечно. Но я сам делал перебором - код заработал только после выставления модификатора доступа по умолчанию.
Артём Уколов 31 уровень, Москва
2 января, 14:35
я тоже этого прикола не понял.
Anatolf Android Developer в Видеонаблюдение и об
7 июля 2020, 21:18
ох уж эти формулировки задания.. вообщем в методе addTile() нужно просто получить лист пустых Tile из getEmptyTiles(), и потом, в Этот же самый список, прямо в методе, добавить через setter класса Tile в "рандомную ячейку" "рандомный вес (2/4)" P.S. setter, который проставляет поле value, похоже нужно было догадаться создать)
Евгений 41 уровень, Санкт-Петербург
25 июля 2020, 08:48
Сеттер не обязательно, при создании поля value говорили ставить доступ по умолчанию, а значит видно всем классам в пакете.
Павел Дудров 35 уровень, Санкт-Петербург
30 июня 2020, 14:13
Попробовал выбирать случайную ячейку через Collections.shuffle и get(0) но валя не пропустил :(
Kex 38 уровень, Тольятти Expert
18 июня 2020, 13:18
Так неправильно: (int) Math.random() * emptyTiles.size(); Так правильно: (int) (Math.random() * emptyTiles.size()); Спас меня один комент от чертовски глупой ошибки!
Leonid Java Developer в ProgForceExpert
3 июня 2020, 12:00
Попался на методе getEmptyTiles. В таком виде он не прошел:
private List<Tile> getEmptyTiles() {
    List<Tile> emptyTiles = new ArrayList<>();
    for (int i = 0; i < FIELD_WIDTH; i++) {
        for (int j = 0; j < FIELD_WIDTH ; j++) {
            if (gameTiles[j][i].isEmpty()) {
                emptyTiles.add(gameTiles[j][i]);
            }
        }
    }
    return emptyTiles;
}
А в таком прошел
private List<Tile> getEmptyTiles() {
    return Arrays.stream(gameTiles).flatMap(Arrays::stream)
            .filter(Tile::isEmpty).collect(Collectors.toList());
}
Может кто обьяснить, чем первый вариант не угодил? i и j менять местами не пробовал, но это и не логично вроде, учитывая что в конструкторе все заполняется так
for (int i = 0; i < FIELD_WIDTH; i++) {
    for (int j = 0; j < FIELD_WIDTH ; j++) {
        gameTiles[j][i] = new Tile();
    }
}
Константин 35 уровень, Челябинск
30 июня 2020, 18:02
Тоже не понимаю, что тут неправильно в первом варианте.