Сломанный рандомизатор в гамаке?
Пока я осваиваю неспеша Godot, решила накидать прототип сапера в Game Maker 2 (а че бы и нет) и сильно удивилась от того, что при каждом запуске рандом выдает одни и те же координаты для мин в ячейках.
Похоже, алгоритм рандома привязан не ко счетчику реального времени на ПК, а к своему внутреннему таймеру, стартующему при запуске проекта. В моем случае все процессы срабатывают сразу же без задержек, а потому каждый раз точно совпадают с этим внутренним таймером при каждой операции.
Конечно, будь это полноценной игрой, сюда вмешался бы момент, когда игрок нажмет кнопку СТАРТ, что и вносило бы элемент рандома, но неприятный осадочек все равно остался.
У себя я исправила этот эффект тем, что зарандомила задержку между всеми стадиями построения игрового поля: стартом проекта, заполнением массивов и размещением мин. Этого уже достаточно, чтобы создать 900 (30 * 30) различных вариаций заполнения.
Вот только и этот рандом, по логике тоже должен из раза в раз повторяться, но он как раз не повторяется.
Кроме того, после запуска и построения первого поля, второе начинает строиться после перезапуска комнаты ручным нажатием кнопки. Что как раз должно иметь несовпадения по внутреннему таймеру. Но оно как раз совпадает.
Можно подумать, что повторяются рандомы внутри циклов FOR, но они перестали повторяться, после правки.
До этого мне казалось, что все рандомизаторы более рандомны и базируются на системном времени ПК.
Кому интересно, почему после заполнения поля минами я обрезаю его по краям, это костыль, чтобы упростить код. Мины я размещаю на поле рандомно, а после проверяю каждую ячейку на ее наличие и сообщаю всем окружающим, что рядом с ними на одну мину больше. Чтобы потом эту циферку выводить на экран.
Если мина окажется на краю поля, то мне нужно это учесть в написании кода, чтобы не ссылаться на несуществующие ячейки за его пределами (и, соответственно, массива). Можно, конечно, нагородить уйму проверок краев или в принципе не размещать мины по краям, но тогда об этом быстро прознает игрок и будет спокойно прожмякивать безопасные края.
Но я именно так и сделал, просто в конце удалила эти крайние ячейки. Или правильнее сказать, добавила дополнительные изначально сверх заданных параметров размера поля.
И конечно, это прототип, нужно будет учесть заполненность ячеек, чтобы не спамить несколько мин в одну и ту же ячейку, а может даже снижать вероятность появления мин на соседних ячейках.