подпрограммы. Что касается развития информатики в целом, оно шло именно таким путем.
Второй случай более наукообразен, так как порядок разработки основан на построении дерева целей. "Ствол" этого дерева отображает цель программы в целом. Затем необходимо определить посредством выполнения каких задач может быть реализована эта цель. Цель каждой из этих задач отображается "ветвями", отходящими от ствола. Процедура построения таких ветвей продолжается до достижения таких "веточек" (то есть наиболее простых задач), для которых программирование не представляет трудностей. Для начинающих такой подход более труден, но по мере накопления опыта становится все более приемлемым. Но и этот способ не исключает необходимости переделки программ при ошибках или просчетах в построении дерева целей.
Практически ни один из этих способов в "чистом" виде не применяется и программисты работают в соответствии со своими вкусами и исходя из соображений целесообразности.
Автор приносит извинения за то, как он "сотворил" свои примеры игровых программ (строгие судьи могут сказать "состряпал", но "не судите, да не судимы будете"). В них не соблюдены каноны модульного программирования в части использования подпрограмм. По этой причине при чтении примеров иногда будет трудно проследить за взаимодействием вызывающей программы с подпрограммой. В этом смысле приведенные примеры ближе к программам на языке ассемблера, чем к программам на языке высокого уровня. Но следование канонам в некоторой мере увеличило бы объем программ, что в свою очередь также затруднило бы чтение. Плавая по жизненному морю, всегда приходится выбирать между Сциллой и Харибдой.
Игровые программы являются очень удобным средством обучения программированию именно вследствие их наглядности, в частности, как в качестве примеров алгоритмизации игры в целом и ее математической модели, так и в смысле непосредственного отображения состояния математической модели объекта игры на дисплее. Основным индикатором ошибок при отладке приведенных примеров являлось изображение на экране. Несоответствия изображения замыслу позволяли достаточно легко ("Дедукция, Ватсон! Дедукция!") определять источники ошибок. В редчайших случаях (когда приходилось отыскивать более или менее тонкие ошибки в подпрограммах) использовалась "отладочная печать" (вывод на дисплей числовой или строковой информации из подпрограмм).
При программировании примеров использовался (в основном) нисходящий способ. Замечание в скобках означает, что использование этого способа в чистом виде практически невозможно. Положа руку на сердце, даже самый ортодоксальный приверженец строгих концепций программирования признается, что в той или другой мере приходится использовать элементы восходящего способа.
Первые ветви дерева целей для всех игровых программ одни и те же. Они должны обеспечивать выполнение следующих действий программы:
• приведение модели объекта игры в исходное (возможно с элементами