Игра сапер (10/16)

  • 3
  • Недоступна
Теперь давай займемся реализацией метода, который отвечает за маркировку ячейки флажком. Метод назовем markTile. Он должен: - отмечать ячейку на игровом поле флагом или снимать флаг; - следить за количеством флагов; - заниматься отрисовкой и стиранием флагов на игровом поле; - менять цвет ячейки по
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (32)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Алексей
Уровень 16
1 августа, 09:52
Во время тестирования обнаружил у своей программы такое поведение: Если я поставил флаг, а затем кликнул по пустой ячейке, у которой нет заминированных соседей, то отрабатывает в рекурсии метод openTile и в том числе открывает и мою ячейку с флагом. Так вот для этого случая надо добавить логику снятия флага и инкрементации счётчика флагов обратно.
Мясо
Уровень 19
25 июля, 17:35
Хм, посзволяте ставить ровно столько флагов, сколько мин, если убираю флаг после достижения кол-ва мин, то обратно уже поставить не могу. Это на этом этапе просто норма или что-то пошло не по плану? ) моск сломал уже. даже в решение заглянул, но всё равно не дает переставить флаги в новые места, если поставил уже. На пример, на скрине: 11 мин, 11 флагов. снимаю фалги и обратно уже не ставятся ни где.. з.ы. цвета немного изменил чтобы видеть где что было или мины
Мясо
Уровень 19
25 июля, 17:39
И пока писал первое сообщение, возник второй вопрос. А разве у нас максимум не 10 мин? откуда 11 О_о
boolean isMine = getRandomNumber(10) < 1;
Мясо
Уровень 19
25 июля, 17:48
Пока камментил код, понял что не написал счетчикФлага++, чтобы возвращало флаги) вопрос отпал)
MineJavaAcc
Уровень 39
31 июля, 08:12
Нет, так реализована вероятность 10%, вот цитата из постановки той задачи,когда мы раскидывали мины: Кроме того, при создании ячеек матрицы добавь генерацию мин с вероятностью 10%. Самый простой способ это сделать - использовать метод getRandomNumber(int n) класса Game, который возвращает случайное число от 0 до n-1 включительно. Следовательно, вероятность генерации определенного числа равна 1/n.
Евгений
Уровень 28
16 декабря 2021, 16:35
Когда под qt писал сапера, соседей пустых клеток каждый раз в цикле просчитывал, а тут элегантно отдельным методом с получением списка.
2DaMoon
Уровень 41
14 ноября 2021, 20:17
Советую перед созданием игр ознакомиться с лямбдами и стримами. Мини-игры - идеальное место для практики. Нужно постоянно что-то удалять, сортировать, узнавать максимальное значение и тд
Антон
Уровень 23
26 ноября 2021, 14:12
что то попытался заменить
private void countMineNeighbors() {
    for (int y = 0; y < SIDE; y++) {
        for (int x = 0; x < SIDE; x++) {
            if (!gameField[y][x].isMine) {//для каждой ячейки не мины
                for (GameObject go : getNeighbors(gameField[y][x])) //переберем список соседей
                    if (go.isMine) gameField[y][x].countMineNeighbors++;//и подсчитаем мины
            }
        }
    }
}
на
private void countMineNeighbors() {
    Arrays.stream(gameField)
            .flatMap(Arrays::stream)
            .filter(gameObject -> !gameObject.isMine)
            .map(this::getNeighbors)
            .flatMap(Collection::stream)
            .filter(gameObject -> gameObject.isMine)
            .forEach(gameObject -> gameObject.countMineNeighbors++);
}
не взлетает???
Artur Khristoforov
Уровень 20
7 октября 2021, 15:43
Можете ещё раз объяснить, зачем мы делаем проверку ( отдельным if) и возвращаем return ?
if (gameObject.isOpen || (countFlags == 0 && !gameObject.isFlag)) {
           return;
       }
Konstantin Medical Interpreter в Hospital
21 декабря 2021, 07:31
Это описывает первые 2 строчки задания, что метод нечего не должен делать.
Sergey Chuchmanov
Уровень 33
24 марта, 09:03
можно было еще чтобы метод ничего не делал, сделать так, просто вынести его в else, а точнее ничего в else писать не нужно, это и характеризует что при не совпадении условия ничего не даем, первый if был таким if (gameObject.isOpen == false && countFlags > 0 && gameObject.isFlag == false){ ставим флаг красим ячейку устанавливаем флагу тру минусуем количество флагов далее следующий else if (gameObject.isFlag == true){ тут обратно ставим флаг ложь плюсуем количество и красим в оранжевый и рисуем пустую клетку и вот потом закрываем } и тут то else не пишем но это и подразумевает что если совпадений нет, то ничего не происходит, валидацию прошел все хорошо
Дима
Уровень 16
15 сентября 2021, 19:19
return тут применять нельзя) Просто оставляйте пустую строку)) И если Вы невнимательны как и я, то не путайте в условии "или" и "и" когда будете писать условия, при которых метод ничего не должен делать.
Oleg73
Уровень 4
27 июля 2021, 04:54
Я не понимаю как можно запустить приложение в плагине. На сайте да, все работает, а в IDE?
Илья Соколов
Уровень 23
16 декабря 2020, 11:33
флаг - "\u2691" Во всех методах движка и игры - X, Y! даже gameObject(x, y)! НО если обращаетесь к матрице gameField,ТО Y, X! gameField[y][x]!
Виталий Питель
Уровень 25
3 августа 2020, 07:41
Валидацию прошел, но работает не корректно. В некоторых ячейках флаги не ставит. Это только у меня так? Не могу понять почему... private void markTile(int x, int y){ if (!gameField[x][y].isFlag && !gameField[x][y].isOpen && countFlags != 0){ gameField[x][y].isFlag = true; countFlags --; setCellValue(x, y, FLAG); setCellColor(x, y, Color.YELLOW); System.out.println(countFlags); } else if (gameField[x][y].isFlag && !gameField[x][y].isOpen) { setCellValue(x, y, ""); countFlags ++; gameField[x][y].isFlag = false; setCellColor(x, y, Color.ORANGE); } }
Wally Dator
Уровень 26
7 октября 2020, 18:17
Разобрался?
Виталий Питель
Уровень 25
18 октября 2020, 12:46
Да, спасибо.
Никита
Уровень 10
25 октября 2020, 10:58
у меня был такой же код и я долго и искренне "не врубался" почему он работает неправильно.... Оказалось это опять старая проблема связанная с тем что "X" и "Y" зачем-то поменяли местами в начальном методе createGame. Соответственно, к gameField нужно обращаться по индексу [y][x]...
Константин
Уровень 41
6 мая 2020, 14:08
Я не могу понять: "Убедись, что метод markTile(int, int) устанавливает значение поля isFlag ячейки в true, если он помечает ее флагом." if (!gameField[y][x].isFlag){ gameField[y][x].isFlag=true; countFlags--; setCellValue(x,y,FLAG); setCellColor(x,y, Color.YELLOW); } Где я не прав?
Константин
Уровень 41
6 мая 2020, 14:19
Понял! Поля IsFlag неопределены (у них значение null).
Danil Timoshevskiy
Уровень 11
19 мая 2020, 22:04
Аналогичный вопрос, я проинициализировал в геймобджект но все равно не работает . как ты исправил?
Константин
Уровень 41
20 мая 2020, 14:55
У меня в этом методе сперва идут различные if проверки tile с return по окончании проверок. После этих проверок идет код gameField[y][x].isFlag=true; countFlags--; setCellValue(x,y,FLAG); setCellColor(x,y, Color.YELLOW); То есть после различных проверок и действий, идет маркировка плитки безусловно. При этом инициализировать поля isFlag не нужно. Они остаются в null. isGameStopped - игра остановлена? gameField[y][x].isOpen - открыта ли плитка? countFlags==0 & !gameField[y][x].isFlag - а флаги закончились? Если нет, то isFlag=true.