Разработка программы для игры в морской бой с игровым полем 10х10 позиций, страница 2

Первый ход противника осуществляется по случайно выбранным координатам в пределах поля, если в эту клетку уже ходили, то координаты генерируются еще раз. Если корабль оказывается  раненым, то информации о соответствующей  клетке добавляется в базу данных. Если в базе данных нет подобной информации, то ход оказывается опять случайным. Если на нашем поле есть раненые корабли, то последующие ходы противника происходят по следующей схеме: (X+1,Y),  (X-1,Y),  (X,Y+1), (X,Y-1). Если в какую-то  из этих клеток уже сходили, или ход в нее невозможен (она лежит вне поля), то осуществляется ход в другую клетку. Эта схема работает, если ранена одна клетка, Если ранено две и более клеток, то сначала определяется расположение корабля (горизонтальное или вертикальное), далее выбираются границы корабля для этого направления, и ходы осуществляются сначала в клетку с ниже или правее максимальной грани, а затем в клетку выше или левее минимальной границы .

Если ход оказался успешным, то противник ходит еще раз. Этот механизм реализуется с помощью отдельного предиката, если в качестве формальных параметров передается 1, то вызывается функция хода противника. Значение этого параметра определяется раннее. Если для очередного хода значение состояния клетки равнялось 0, то параметр будет равен 0,  если было равно отрицательному числу – значение параметра становится  равным 1.

После каждого хода происходит проверка, убит ли очередной корабль или нет. Корабль определенной величины считается убитым, если подряд на одной вертикали или горизонтали расположено соответствующее число клеток с состояниями 1, 2, 3 или 4. Если корабля оказывается убитым, то значения соответствующих ему клеток заменяются на  6, 7, 8, 9 в зависимости от величины корабля. Значения соседних ему клеток устанавливаются равными 5 (они «открываются»).

Реализация наших ходов полностью аналогична, исключение составляет то, что координаты очередной клетки считываются с клавиатуры.

Конец игры наступает, когда в одной из баз данных не остается фактов с отрицательными состояниями клеток. Это условие – является условием возврата из рекурсии, на каждом шаге которой выполнялись поочередно ход противника и наш ход.

Описание программы

Предикаты работы с полем противника

print                                                    -  вывод поля противника

sim(integer,char)                               -  какой символ выводить?

build                                                   - заполнение поля противника

firstrand(integer,integer,integer,integer,integer,integer) – генерация координат

change(integer,integer,type)              - изменение значения клетки

build_empty1(integer)                      -  первоначальное рекурсивное заполнение

build_empty2(integer,integer)

add_one                                               -  добавление однопалубного

add_two(integer)                               -  добавление двухпалубного

add_three(integer)                             -  добавление трехпалубного

add_four(integer)                              -  добавление четырехпалубного 

add_nil                                               -  добавление пустых клеток

add_empty1(integer)                         -  рекурсивное заполнение оставшихся пустых клеток

add_empty2(integer,integer)    

evmhod                                               -  ход противника

hod_rand                                            -  случайный ход

hod_think                                           -  обдуманный ход

hod(integer,integer,integer)              -  ход по заданным координатам

still(integer)                                      -  запуск еще одного хода при предыдущем удачном

kill(integer,integer,type)                   - проверка возможной гибели корабля                           

Предикаты работы с полем игрока

myprint                                              -  вывод нашего поля                                              

mysim(integer,char)                          -  какой символ выводить?