5.6. САПЕР
Вернемся к "задумчивым" играм. Но на этот раз игра идет, что называется, "не на жизнь, а на смерть", потому что в ней производится разминирование. Во всех предыдущих занятиях играющий имел полную информацию об объекте игры. На этот раз суть игры состоит в том, что необходимо определить положение "мин" на игровом поле по косвенным данным. Изложим правила игры:
• прямоугольное игровое поле состоит из квадратов, в любом из которых может находиться мина;
• перед началом игры программа расставляет мины по квадратам в случайном порядке (точнее в беспорядке), играющему заранее известно количество мин, но неизвестно их расположение;
• играющий может "открыть" любой квадрат по своему выбору, после чего возможны два исхода: если в этом квадрате находится мина, то игра заканчивается проигрышем, в протибном случае игра продолжается и заканчивается выигрышем только тогда, когда играющим открыты все свободные от мин квадраты;
• первоначально на изображениях квадратов не нанесена никакая информация о наличии мин, для увеличения шансов на выигрыш внутри изображения открытого квадрата программа выдает информацию о количестве соседних мин (от 0 до 8), более того, если количество соседних мин равно 0 (вместо нуля выводится символ пробела), то для ускорения игры программа сама производит выбор всех 8 соседних квадратов и этот процесс повторяется автоматически до выбора квадратов, рядом с которыми находятся мины.
Математическая модель игры использует двумерный массив целых чисел. При этом одни и те же ячейки массива используются как для хранения информации об установленных минах, так и для подсчета количества мин в соседних ячейках. Это достигается следующим способом. Первоначально во все ячейки массива заносятся нули. При установке мины в ячейку записывается число 10, а во все соседние ячейки добавляется по 1. В итоге ячейки свободные от мин будут содержать числа от 0 до 8, а в занятых минами ячейках будут содержаться числа от 10 до 18. В качестве примера выбран исходный размер минного поля 10Х10 квадратов, на нем расставляются 20 мин. На дисплее изображения закрытых квадратов помечены вопросительным знаком.
DIM dij (I TO 10) AS INTEGER
DIM fld<l TO 10, 1 TO 10) AS INTEGER
DEFINT I-L
DATA 1, 1, 0, -1, -1, -1, 0, 1, 1, 1
FOR i = I TO 10
READ dij(i) NEXT i CLS
COLOR 15, 7 'построение квадратов ТОР$ = CHR$ (218) : WALL$ = CHR$ (179) SHELF$ = CHR$(195): BOT$ = CHR$(192)