Функциональная модель решения задачи




Функциональная модель решения задачи представлены на рисунке 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 – Расстрелянное поле кораблей

 

 


Заключение

 

Приведенный пример анализа игры «Морской бой» показывает возможность использования логических игр для углубленного изучения таких разделов математики, как комбинаторика, теория множеств и теория вероятностей. Заметим, что изучение даже простейших игровых ситуаций позволяет сформулировать проблемы, которые представляют интерес для современной информатики и теории поиска.

Итогом работы можно считать созданную функциональную модель реализации стратегии игры «Морской бой». Созданная функциональная модель и ее программная реализация могут служить органической частью решения более сложных задач.

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: