Функциональная модель решения задачи представлены на рисунке 2.
Рисунок 2 – Функциональная модель решения задачи для функции BLOW
Программная реализация решения задачи
; открываем файл для чтения
(setq input_stream (open «d:\\field.txt»:direction:input))
; считываем поле противника
(setq field (read input_stream))
; закрываем файл
(close input_stream)
; количество кораблей
(setq user_ship 10)
; убиваем корабль
(defun set_missing_comp (lst i j ip jp)
(setq k (if (>= (- i 1) 0) (- i 1) i))
(setq l (if (>= (- j 1) 0) (- j 1) j))
(loop
(do
()
((or (> k (+ i 1)) (>= k 10)))
(do
()
((or (> l (+ j 1)) (>= l 10)))
(if (eql (nth l (nth k lst)) 1)
(progn
(setq k 10)
(return t)
)
)
(setq l (+ l 1))
)
(setq k (+ k 1))
)
(return nil)
)
(setq k (if (>= (- i 1) 0) (- i 1) i))
(setq l (if (>= (- j 1) 0) (- j 1) j))
(loop
(do
()
((or (> k (+ i 1)) (>= k 10)))
(do
()
((or (> l (+ j 1)) (>= l 10)))
(if (not (eql (nth l (nth k lst)) ' *)) (setf (nth l (nth k lst)) '~))
(setq l (+ l 1))
)
(setq k (+ k 1))
)
(return nil)
)
t
)
; шагаем по направлению «креста»
(defun set_missing (lst i j ip jp)
(if (>= (- i 1) 0)
(if (and (/= (- i 1) ip) (eql (nth j (nth (- i 1) lst)) 1))
(set_missing lst (- i 1) j i j)
)
)
(if (>= (- j 1) 0)
(if (and (/= (- j 1) jp) (eql (nth (- j 1) (nth i lst)) 1))
(set_missing lst i (- j 1) i j)
)
)
(if (< (+ i 1) 10)
(if (and (/= (+ i 1) ip) (eql (nth j (nth (+ i 1) lst)) 1))
(set_missing lst (+ i 1) j i j)
)
)
(if (< (+ j 1) 10)
(if (and (/= (+ j 1) jp) (eql (nth (+ j 1) (nth i lst)) 1))
(set_missing lst i (+ j 1) i j)
)
)
(if (eql (nth j (nth i lst)) 1) (setf (nth j (nth i lst)) ' *))
)
; функция, реализующая удар по полю
(defun blow (lst)
; выбираем случайную клетку
(setq i (random 10))
(setq j (random 10))
(setq n (nth j (nth i lst)))
(cond
((eql n 1)
(progn
; значение в клетке = 1
; убиваем корабль
(set_missing lst i j i j)
(set_missing_comp lst i j i j)
(setq user_ship (– user_ship 1))
(if (/= user_ship 0) (blow lst))
)
)
((eql n 0)
(progn
; значение в клетке 0
; промахнулись
(setf (nth j (nth i lst)) '~)
(blow lst)
)
)
; уже были в этой клетке – выбираем другую
((or (equal n ' *) (equal n '~)) (blow lst))
)
lst
)
; убиваем противника!!!
(blow field)
; файл для записи
(setq output_stream (open «d:\\destroy_field.txt»:direction:output))
; записываем побитое поле противника
(print field output_stream)
; закрываем файл
(close output_stream)
Пример выполнения программы
Пример 1.
Рисунок 3 – Поле кораблей
Рисунок 4 – Расстрелянное поле кораблей
Пример 2.
Рисунок 5 – Поле кораблей
Рисунок 6 – Расстрелянное поле кораблей
Пример 3.
Рисунок 7 – Поле кораблей
Рисунок 8 – Расстрелянное поле кораблей
Заключение
Приведенный пример анализа игры «Морской бой» показывает возможность использования логических игр для углубленного изучения таких разделов математики, как комбинаторика, теория множеств и теория вероятностей. Заметим, что изучение даже простейших игровых ситуаций позволяет сформулировать проблемы, которые представляют интерес для современной информатики и теории поиска.
Итогом работы можно считать созданную функциональную модель реализации стратегии игры «Морской бой». Созданная функциональная модель и ее программная реализация могут служить органической частью решения более сложных задач.