Pull to refresh

Прохождение сапера на поле 9x9 с 32-мя минами

Reading time 2 min
Views 11K
Вот до чего иногда доводят безобидные развлечения. 2 месяца назад я неожиданно увлекся игрой в сапера. Особенно мне было интересно побить рекорд не по времени, а по количеству мин на поле. На уровне игры «новичок» дается поле 9x9 и 10 мин. Разумеется, это было очень просто, и я стал наращивать количество мин. 12, 15, 20 штук, это была простая разминка. Затем прошел 25 после большого числа попыток. Игра с 27-ю минами (каждая 3-я клетка заминирована) отняла у меня несколько часов. Не остановившись на достигнутом, я выставил сразу 30 штук. Выиграл спустя полторы недели, играя по часу в день.

Более месяца пытался разминировать 32 мины, причем даже в лучших попытках оставалось найти около 10 мин, затем подрывался. А мне очень хотелось победы, и решил, что без радикальных мер могу затратить еще пару лет. Пришла мысль написать программу подсчета вероятности нахождения мины в каждой клетке, в любой момент игры.

Основная сложность в игре заключается в том, куда ткнуть, если полученные числа не дают однозначно определить наличие или отсутствие мины ни в одной клетке. Но, тем не менее, эти вероятности могут очень сильно отличаться. Если мы видим, что в данной клетке мина теоретически может быть, но это будет достигаться, если несколько мин будут располагаться в строго определенных местах, то конечно можно достаточно смело кликать по этой клетке. Но лично я слабо представляю, как можно математически точно рассчитать эти вероятности. Поэтому все эти проблемы пришлось переложить на программу. На написание ушло часа 2, но наконец-то, затратив десяток попыток, я выиграл!

Собственно сама программа:

Алгоритм работает по самому простому способу, что называется «в лоб»: пользователь вводит данные с минного поля, жмет кнопку, затем программа расставляет у себя в массиве недостающие мины случайным образом, но так, чтобы они удовлетворяли введенным данным. Заполнение минами происходит достаточно большое количество раз, при этом подсчитывается, сколько раз в каждой клетке побывала мина, и это количество делится на число итераций. То есть, получаются приблизительные вероятности существования мины в каждой клетке, и затем выводятся на экран (в процентах). (программисты и математики, сильно не ругайте :)

Ввод данных:


Результат:


Если она кого-либо заинтересует, скажу пару слов по поводу работы:
Во время игры в сапера нужно ввести данные о текущем состоянии дел в клетки. Клетка может быть пустой (если о ней ничего неизвестно), число от 0 до 8, или буква «m» если клетка помечена флажком, как заминированная. Все 3 кнопки справа вычисляют вероятности, разница заключается в разном количестве итераций (100, 1000, 10000). Поэтому, во избежание слишком долгого ожидания расчета, рекомендую сначала нажать первую кнопку.
Остальное понятно. Скачать можно здесь (200кб). Сразу извиняюсь за отсутствие какой-либо защиты «от дурака».

Все, с сапером завязал. По крайней мере на пару дней.

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+77
Comments 119
Comments Comments 119

Articles