private void openTile(int x, int y) { //Метод "Ячека открыта".
if (gameField[y][x].isOpen || gameField[y][x].isFlag || isGameStopped == true) {
return;
}
//gameField[y][x].isOpen = true;
countClosedTiles--;
if (gameField[y][x].isMine) { //если gameObject по текущим координатам является миной, отрисовывать MINE
//setCellColor(x, y, Color.RED);
setCellValue(x, y, MINE);
setCellValueEx(x, y, Color.RED, MINE); //если объект является миной, должна отрисовываться мина на красном фоне (используй метод setCellValueEx(int, int, Color, String)) и вызываться метод gameOver().
gameOver();
}
else if (!gameField[y][x].isMine) {
setCellNumber(x, y, gameField[y][x].countMineNeighbors); //отрисовывать количество соседей-мин, если gameObject по текущим координатам не является миной.
gameField[y][x].isOpen = true;
setCellColor(x, y, Color.GRAY);
score += 5; //При открытии ячейки без мины счет увеличивается на 5 очков.
setScore(score); // Отобразить счет на игровом поле.
}
if (!gameField[y][x].isMine && gameField[y][x].countMineNeighbors == 0) { //В методе openTile(int, int), если элемент не является миной и количество соседей-мин равно нулю, для каждого не открытого соседа должен рекурсивно вызываться метод openTile(int, int).
setCellValue(x, y, ""); //openTile(int, int) не должен ничего выводить, если элемент не является миной и количество соседей мин равно нулю.
List<GameObject> neighbors = getNeighbors(gameField[y][x]); //вызывать метод getNeighbors(GameObject), если элемент не является миной и количество соседей-мин равно нулю.
for (GameObject gameObject : neighbors) {
if (!gameObject.isOpen) { //для каждого неоткрытого соседа
setCellColor(x, y, Color.ORANGE);
gameField[y][x].isOpen = true;
openTile(gameObject.x, gameObject.y); //рекурсия
}
}
}
else if (!gameField[y][x].isMine && gameField[y][x].countMineNeighbors != 0) { //В методе openTile(int, int), если элемент не является миной и количество соседей мин не равняется нулю, на игровое поле должно выводиться количество заминированных соседей. Используй метод setCellNumber(int, int, int).
if (!gameField[y][x].isOpen) {
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
}
}
if (countClosedTiles == countMinesOnField && !gameField[y][x].isMine) {
win();
}
setScore(score);
}
Валихан
33 уровень
Коллеги, помогите разобраться, пожалуйста. Где ошибка в openTile()?
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
2 октября 2019, 14:30
Очень все напутано и много лишнего.
Если клетка - мина, то для нее будет срабатывать по 2 блока if c повторяющимися действиями...
0
ВалиханExpert
2 октября 2019, 15:23
А что лишнее?
0
Ksenia VolkovaJava Developer в DXCMaster
2 октября 2019, 17:21
Вот допустим у нас клетка - не мина.
Сначала сработает этот блок:
Если у нее есть соседи с минами, мы зачем-то проверяем isOpen.
Но ведь в предыдущем куске мы как раз установили isOpen = true. То есть этот if в принципе не может сработать. А если бы сработал - то зачем-то повторно вызвал бы метод setCellNumber.
Если же у этой не-мины нет соседей-мин, то будет происходить нечто странное:
Мы будем перебирать всех соседей, и на каждой итерации будем (опять!) устанавливать isOpen = true и (снова и снова!) устанавливать цвет нашей исходной клетке (gameField[y][x])
В общем, на мой взгляд этот метод проще переписать заново.
+1
ВалиханExpert
2 октября 2019, 19:08
Да, надо написать его заново.
0