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

  • 3
  • Недоступна
Теперь давай займемся подсчетом мин в соседних ячейках. Для этого каждой ячейке матрицы добавим параметр (поле класса), который отвечает за количество "заминированных" соседей. Для начала найдем всех соседей, а потом посчитаем, сколько из них "заминированы". Для этого создадим метод getNeighbors, в
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (132)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
normalosos Java Developer
21 января, 09:07
3 условие: "Метод countMineNeighbors() должен для каждой ячейки "не мины" из матрицы gameField подсчитать количество соседних ячеек "мин" и установить это значение в поле countMineNeighbors." Сделал увеличение countMineNeighbors в цикле инкрементом, валидатор не хочет принимать. В подсказке пишет: возможно, вы проверяете на соседей ячейку с миной. в итоге оказалось, что количество соседей нужно именно "установить в поле countMineNeighbors", посчитав в отдельном счетчике
Romper Stomper
Уровень 20
5 января, 11:57
Задача пятого уровня? Серьёзно? Пока не посмотрел ответ вообще не вкуривал. Авторы курса, вы большие молодцы(нет).
Nastya beautybaybox
Уровень 12
21 октября 2022, 21:34
блин почему нельзя вернуться на прошлый этап?я не помню за что отвечает isMine?скажите пожалуйста
Yury Boyko
Уровень 17
11 ноября 2022, 03:44
Возвращаться можно. Если в браузере то измени в адресе страницы .part06 скажем на part05. А вообще isMine отвечает за наличие мины. Соответственно тру - есть, ложно - нету.
Nastya beautybaybox
Уровень 12
3 декабря 2022, 12:54
спасибо
John Wick
Уровень 20
17 сентября 2022, 21:16
Блин можно же все сделать гораздо проще без этих "соседей"...
Nekonyakami
Уровень 2
3 сентября 2022, 16:09
Ничего непонятно из-за того, что названия одинаковые
Lyokha Blagodatskikh
Уровень 48
31 мая 2022, 16:38
я только щас не выдержал писать в веб форме и пошел в Идею, и чот застопорился... а как запустить игру, ведь у нас нет public static void Main метода?
Aleksandr Klyuchko Software Developer в Сбер
13 июня 2022, 03:36
Нажать на зелёный треугольник в строчке с кодом "public class MinesweeperGame extends Game {" Либо нажать Ctrl+Shift+F10 находясь в этом же файле класса MinesweeperGame
Lyokha Blagodatskikh
Уровень 48
13 июня 2022, 04:30
Да уже давно разобрался) не актуально, не помню почему треугольник был не активен ) видать другой надо было нажать )
Денис
Уровень 29
16 мая 2022, 09:29
Может кто-то детально объяснить (расписать) как работает метод getNeighbors(GameObject gameObject)?
Pavel Palekhov
Уровень 55
Expert
24 мая 2022, 09:04
1)Метод getNeighbors(GameObject gameObject) принимает в качестве аргумента объект типа GameObject
private List<GameObject> getNeighbors(GameObject gameObject) { }
2)Далее мы создаем List, который хранит в себе объекты типа GameObject. Туда мы будем заносить "соседей"
List<GameObject> result = new ArrayList<>();
3)Теперь нам необходимо обойти все соседние клетки объекта gameObject, который мы передавали в метод (см. 1 пункт). Для этого воспользуемся координатами (поля класса GameObject x и y, которые у каждого объекта свои). Стоит помнить, что координаты в нашем случае совпадают с индексами "строки-столбца" в двумерном массиве. Возьмем для примера элемент с координатами y = 0; x = 1 (отметил красным кружком см. Фото). Соседние для него клетки помечены зеленым. Отсюда делаем вывод: для x = 1, соседние элементы имеют значения (x - 1) и (x + 1). Т. е. (x - 2) или (x + 2) уже будут не соседними клетками, что видно на фото. Аналогично для координаты y
Pavel Palekhov
Уровень 55
Expert
24 мая 2022, 09:32
4)Запишем это в цикл:
for (int y = gameObject.y - 1; y <= gameObject.y + 1; y++) { //берем "верхнего соседа" и идем до "нижнего"
            for (int x = gameObject.x - 1; x <= gameObject.x + 1; x++) { //берем "левого соседа" и идем до "правого"
            }
}
Возникает проблема. Если мы берем элементы из первой строки (y = 0), то у него соседей сверху быть не может. А согласно нашему циклу мы начнем с (y - 1). Аналогично мы не можем учитывать "нижних соседей" для нижней строки нашего двумерного массива. Поэтому вводим условия:
if (y < 0 || y >= SIDE) {   // если y = SIDE, то значит мы дошли до последней строки массива
                    continue;
                }
                if (x < 0 || x >= SIDE) { // если x = SIDE, то значит мы дошли до последнего столбца массива
                    continue;
                }
5)Ну и последнее: наш элемент не может быть соседом сам себе. Поэтому вводим условие:
if (gameField[y][x] == gameObject) { //если объект при переборе совпадает с объектом, переданным в метод (см. п.1), то мы пропускаем этот случай
                    continue;
                }
6)Таким образом, если все условия мы успешно прошли, то мы добавляем этот элемент в список result. Так, после перебора цикла (внешнего и вложенного) мы получаем всех соседей и возвращаем его
result.add(gameField[y][x]);
return result;
Boriss
Уровень 26
28 декабря 2021, 20:26
Вот так пишешь свой код, стараешься, а потом - "обновить файлы задания?" 😂
Мясо
Уровень 19
23 июля 2022, 15:47
Тож не понял. нафига так сделано. вжух и заменили твой код. вжух и добавли ещё кучу строк кода. Со своим то разобраться бы. а ту с неба свалился кусок кода и теперь надо его курить... И какого опять цвет оранж.... я не хотеть оранж
Константин
Уровень 34
30 ноября 2021, 12:12
1. Как уже было заявлено - зачем список соседей, если можно при нахождении рядом мины увеличивать счетчик в центральной ячейке. Будет намного проще. 2. Каунт для мин должен быть статическим. Для кол-ва мин динамическим, но его не обязательно объявлять на уровне класса. 3. Условие задачи было бы неплохо все же на русский перевести, чтобы не приходилось 10 раз читать, чтобы тайный смысл уловить.
Lealar
Уровень 27
24 июля 2021, 10:45
Зачем возвращать список соседей? когда можно в этом же цикле посчитать мины? и выводить сразу количества мин, те передаешь координаты и функция бы смотрела выход за пределы поля и наличие мины и сразу проставлять значение, только подсмотрев готовое решение понял их логику, возможно я не прав