Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

10.9. Гетерархия. Задание на игру "Торпедная атака"

При создании мультфильма в разделе 10.2 мы придерживались стиля программирования "сверху вниз", когда процедуры образовывали подчинение, иерархию: все "основные" процедуры вызывались из раздела операторов основной программы. Второстепенные процедуры вызывались из "основных" и т. д.

Однако для многих задач, особенно связанных с моделированием сложных объектов и искусственного интеллекта, такой метод неестественен. Процедуры здесь часто получаются равноправными и вызываются не из раздела операторов основной программы, а согласно логике задачи вызывают друг друга по мере необходимости. Такая организация общения процедур называется гетерархией.

Задание 100

Наверху экрана слева направо плывет вражеский корабль. Внизу притаился ваш торпедный аппарат. В подходящий момент вы нажимаете клавишу - и торпеда плывет вверх. Если вы попали, то видна вспышка от взрыва, - может быть, на мгновение виден и сам взрыв; раздается коротенькая радостная мелодия, на экране - коротенький поздравительный текст; показание счетчика подбитых кораблей на экране увеличивается на единицу. Если не попали, то зрительные и звуковые эффекты совсем другие. В любом случае увеличивается на единицу показание счетчика выпущенных торпед. Когда торпеды у вас кончатся (скажем, их было 10), игра заканчивается. Программа анализирует ваши успехи и в зависимости от них выдает на экран текст, скажем "Мазила!", если вы не попали ни разу из 10, или "Профессионал!", если вы попали 8 раз. Затем спрашивает, будете ли вы играть еще.

Схема программы:

USES CRT, Graph;

VAR все переменные опишем именно здесь, а не внутри процедур

ОПЕРЕЖАЮЩИЕ ОПИСАНИЯ процедур

PROCEDURE ZAVERSHENIE_IGRI; Здесь анализируем, насколько успешно стрелял игрок, отмечаем мелодией, цветом и текстом его достижения, затем спрашиваем, будет ли игрок играть еще. Если да, то вызываем процедуру NACHALO, иначе закрываем графический режим и - Halt.

PROCEDURE NE_PORA_LI; Здесь увеличиваем показание счетчика торпед. Если оно>10, то вызываем процедуру ZAVERSHENIE_IGRI, иначе - процедуру RISUNOK.

PROCEDURE NEPOPAL; Здесь программируем все эффекты в случае промаха, после чего вызываем процедуру NE_PORA_LI.

PROCEDURE POPAL; Здесь программируем все эффекты в случае попадания, после чего вызываем процедуру NE_PORA_LI.

PROCEDURE АТАКА; Здесь плывут одновременно корабль и торпеда. Затем в зависимости от ситуации вызываются процедуры POPAL или NEPOPAL. Учтите также ситуацию, когда вы просто забыли выстрелить.

PROCEDURE KORABL; Здесь плывет корабль до выстрела, который вызывает процедуру АТАКА.

PROCEDURE RISUNOK; Здесь рисуем береговую линию, указываем на экране имя игрока, показания счетчиков торпед и подбитых кораблей. Затем вызываем процедуру KORABL.

PROCEDURE NACHALO; Здесь устанавливаем в нуль показания счетчиков торпед и подбитых кораблей, спрашиваем имя игрока и делаем все прочее, что нужно делать один раз за всю игру в самом ее начале Затем прямо из процедуры NACHALO вызываем процедуру RISUNOK

BEGIN

инициализация графического режима,

DirectVideo:=false; {Чтобы работал WriteLn}

NACHALO {Вот такой короткий раздел операторов}

END.

Помощь: Когда вы выстрелите, вы заметите, что корабль стал плыть медленнее. Это происходит потому, что теперь компьютер за каждый шаг корабля должен еще просчитать и изобразить на экране торпеду, а на это нужно время. Увеличьте шаг движения корабля после выстрела или уменьшите паузу Delay так, чтобы скорость осталась примерно той же.

Как компьютер определит, попал или не попал? Нужно в тот момент, когда торпеда доплывет до линии движения корабля, сравнить горизонтальные координаты корабля и торпеды, и если они достаточно близки, считать, что попал.

Улучшение. Если у всех кораблей будет одинаковая скорость, то попадать будет слишком просто, а значит, и играть неинтересно. Сделайте скорость кораблей случайной. Конечно, не совсем уж (скажем, в условных единицах скорости диапазон от 0 до 10 - это слишком), а в пределах разумного (скажем, от 4 до 8 - это нормально). Причем не нужно менять скорость одного и того же корабля в процессе движения. Пусть она остается постоянной, а то все будет зависеть не от мастерства, а от везения. Различаются скорости только разных кораблей.

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

Задание 101

"Графический редактор". Создайте программу, которая бы, повинуясь нажатию разных клавиш клавиатуры, рисовала бы, расширяла, сжимала, перемещала по экрану, заливала разными цветами прямоугольники (а если вам понравилось, то и эллипсы, и линии, и прочее). В качестве "печки, от которой танцевать", можете взять решение задания 98.

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