Ребят, подскажите, как рандомно раскидать мины по 2D массиву?
Тот способ, который нам предлагается в задаче, не гарантирует точное количество мин.(Пилю игру для себя на GUI)
Хочу сделать чтобы можно было самому прописать количество.
Из задумок: заполнить массив объектами, затем подряд заполнить n-ое количество мин, затем просто перетасовать массив каким нибудь способом.
Aku
24 уровень
Вопрос по минам в игре сапер
Решен
Комментарии (24)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
VIKTOR NEZHELSKIYExpert
16 апреля 2019, 18:21
...
0
Сергеев ВикторMaster
16 апреля 2019, 18:24
Если минами надо заполнить все клетки кроме 1 сколько будет работать такой алгоритм? )
0
VIKTOR NEZHELSKIYExpert
16 апреля 2019, 18:26
Если заполнить всё поле минами, то игра потеряет смысл.
0
Сергеев ВикторMaster
16 апреля 2019, 18:36
про все поле речи не идет.
0
VIKTOR NEZHELSKIYExpert
16 апреля 2019, 18:38
А с одним чистым от мин полем есть смысл играть?
0
VIKTOR NEZHELSKIYExpert
16 апреля 2019, 18:57
Протестировал метод в InteliJ IDEA на полях от 32х32 = 1024 клетки до 600х600 = 360000 клеток для countMin = 1000 метод выполняется за доли секунды. Игра с таким или большим количеством мин или меньшим количеством клеток, думаю будет уже не реальной.
0
Сергеев ВикторMaster
16 апреля 2019, 20:35
мы все таки программисты и вопрос тут не в интересности игры или потенциале или прочих неисчеслимых вещах. Давайте оставаться в пределах исчеслимых вещей.
Протестируйте скорость работы при 32х32 = 1024 клетки и 1023 минах + 600х600 = 360000 клеток и 299999 мин. Желательно через JMH и поделитесь результатом + характеристиками jvm, это будет конкретные данные. А реальна игра или нет тут не важно.
0
VIKTOR NEZHELSKIYExpert
17 апреля 2019, 07:05
А сами не хотите протестировать? Код в открытом доступе.
0
Сергеев ВикторMaster
17 апреля 2019, 09:57
Нет, спасибо )
0
Aku
17 апреля 2019, 10:08
Этот способ, бесспорно рабочий, но, как уже сказали, могут возникнуть проблемы. Я стараюсь писать код универсальным, чтобы его можно было переиспользовать в будущем, если Вы не понимаете этого, то спорить не о чем.
0
VIKTOR NEZHELSKIYExpert
17 апреля 2019, 10:16
Вы писали: "Хочу сделать чтобы можно было самому прописать количество. ...
заполнить массив объектами, затем подряд заполнить n-ое количество мин, затем просто перетасовать массив каким нибудь способом." Об универсальном коде не было сказано. Я предложил реальный код, который работает. Если стараетесь писать универсальный код, в чём проблема? Я вас прекрасно понимаю. Желаю успехов.
0
Aku
17 апреля 2019, 10:55
Ниже я ответил, что такой способ ломает программу, отсюда следует, что данный способ не подходит
0
VIKTOR NEZHELSKIYExpert
17 апреля 2019, 18:14
А если конкретнее, что означает "способ ломает программу"? В чём это выражается? Не находит библиотеку Match? Зависает? Долго вычисляет? Какой способ вас бы устроил? Можно просто создать заранее (или в период простоя игры) библиотеку карт размещения мин и выбирать по порядку одну за другой карту из библиотеки. Если всё же надо генерировать карту с использованием генератора случайных чисел, но генерировать случайные числа только по одному для каждой мины из заданного количества мин на заданном размере поля, то можно двумерный массив координат поля присвоить одномерному массиву с тем же числом элементов, вычислить количество свободных полей, поделить это число на количество мин. Получить средний интервал между минами L в одномерном массиве в виде действительного числа с точкой. Затем для каждой мины получить случайное число в интервале от -L/2 до L/2 и изменить интервал для данной мины на полученную случайную величину не превышая величины интервала до предыдущей мины или до края одномерного массива. После чего округлить полученные интервалы до целого значения индекса мины в одномерном массиве и опять присвоить одномерный массив двумерному массиву и получить карту расположения мин. Это если мин меньше чем свободных полей. Если же свободных полей меньше чем мин, то будет быстрее и правильнее проделать то же самое, но не с минами, а со свободными полями.
0
Aku
19 апреля 2019, 06:45решение
ломает программу - означает что цикл заполнения мин становится (почти?)бесконечным.
Буквально вчера решил эту проблему таким способом:
данный вариант дает наиболее "честное" заполнение ячеек минами с наименьшими затратами +2
VIKTOR NEZHELSKIYExpert
19 апреля 2019, 07:17
Отличный вариант для случая когда всё поле надо заполнить минами не имея пустых ячеек! Верно, тогда цикл не будет бесконечным. Всего лишь надо вычислить
line * column * 2
случайных значений Math.random() и получить то же самое поле сплошь заполненное минами. Всё "честно". ;-)
Кстати, отличный алгоритм тасовать карты в колоде по масти и старшинству карты.
0
Сергеев ВикторMaster
15 апреля 2019, 16:57
взять 2 рандомных числа и используя их как координаты установить мину.
0
Aku
15 апреля 2019, 17:07
Если выбрать поле 100*100 и 999 мин, программа скорее всего сломается.
т.е. примерно так же будет выглядеть:
if (поле по координатам рандомных чисел не является миной) {
то делаем поле по этим координатам миной
}
И сколько чисел он будет перебирать пока не попадет в нужное?
0
Aku
15 апреля 2019, 17:15
UPD: ошибочка, поле не 100 на 100, а на 1000 клеток и 999 мин(как бы это детали, но всё же, для точности самого ТЗ)
0
Сергеев ВикторMaster
15 апреля 2019, 17:53
собрать все координаты клеток в массив и рандомно выбирать оттуда, после проставления мины - удалить координаты
0
VIKTOR NEZHELSKIYExpert
16 апреля 2019, 17:44
Разве реально на экране разместить поле 1000х1000 клеток, что бы границы клетки нарисовать, и ещё количество мин на клетке написать или флажок нарисовать? Минимум 8 пикселей для изображения одной клетки поля понадобится, а значит больше чем 600 клеток по вертикали для экрана WHUXGA 7680 x 4800 не разместить. И вряд ли стоит писать игру, которая будет размещаться только на таком экране.
0
Сергеев ВикторMaster
16 апреля 2019, 18:23
почему не стоит? А если заказчик хочет именно так и уже закупил эти экраны? Странное утверждение.
0
VIKTOR NEZHELSKIYExpert
16 апреля 2019, 19:12
А какой игрок согласится играть на поле где надо открыть один миллион клеток за один присест и найти одну тысячу мин кликая на поля размером в 8 пикселей?
0
Сергеев ВикторMaster
16 апреля 2019, 20:35
ну у заказчика может быть очередь таких игроков, он нашел их и решил заказать разработку такой игры, что дальше?
+1
Aku
19 апреля 2019, 06:48
мало ли, может быть Вам пригодится или будет просто интересно, решил проблему таким способом:
+2