Программы для паскаль abc игры. Создание компьютерной игры на языке Pascal

Пост ностальгии по игрушкам, которые мы сами для себя писали в детстве.
Лазая по просторам App Store ища очередную игрушку для своего айпада, наткнулся на старинную игрушку “Братья Пилоты”. Сразу купил, поставил и прошёл на одном дыхании (уже наверное в 3 раз). Но более всего задержался на эпизоде с холодильником. Уж больно меня прёт эта головоломка.

И внезапно вспомнил, что ещё в школьные годы, после прохождения холодильника, головоломка меня так накрыла, что я написал на паскале свою собственную игрушку - эмулятор головоломки. Но не просто повторяла исходную игру, а позволяла выбирать размер поля, имела хелп, возможность сохранения и продолжения игры с прошлого места после выхода.

Подняв старые бекапы я нашёл исходную игру. Запустил её в dosbox и пропал для внешнего мира на пару часов.


Исходная головоломка, обратите внимание на открытый левый столбец и положение вентилей

В чём же суть?

Суть головоломки достаточно проста. Имеется поле вентилей 4 на 4 штуки, необходимо все вентили на холодильнике поставить в горизонтальное положение. “Но есть нюанс”(с): когда вы поворачиваете вентиль, то вместе с ним поворачиваются все вентили в столбце и строке, в которой находится данный вентиль. И тут начинается самое интересное!
Когда я впервые сел за эту головоломку в исходном квесте, играя ещё в школе, то проходил её, наверное минут 40, не меньше. Но она до того мне понравилась, что я играл в неё играл и играл, и играл…
Но хотелось большего: возможность сохранять игровой процесс, генерировать разные уровни и менять размер поля, чтобы понять алгоритм игры.
Тогда я понял, что если мне головоломка нравится, и хочется попробовать разные масштабы игрового поля, то не стоит ждать у моря погоды. Есть только один выход - реализовать эту игру самостоятельно.

Ну’c, приступим!

Я не смогу точно определить дату создания игры, но это точно конец школы, начало института. В те годы я прекрасно владел паскалем. В институте решал на нём задачки за деньги, помогал писать курсачи и вообще - это был прекрасный логичный язык. Поэтому игрушку было решено писать на нём.
Не смотря на то, что я знал как реализовывать графику в ДОСе, я решил не делать графическое приложение. Это связанно с тем это бы страшно глючило и тормозило что, во первых, мне хотелось как можно быстрее реализовать данное приложение, а реализация графики отняла бы много времени; а во вторых, текстовый вид мне нравится больше. Хотя оглядываясь назад, мне кажется лучше бы я сделал графику и ещё добавил поддержку мыши.
Задача была простая: сделать простую изящную игру, которую не стыдно было бы показать. Из возможностей: помощь, возможность сохранения и после запуска продолжение игры с момента остановки, возможность изменять размер игрового поля. Плюс немного красок и изящества.

Реализация

Я не буду целиком разбирать исходники и логику работы всей программы, ибо они очевидны, а что не очевидно ясно из кода. Но более подробно остановлюсь на паре моментов.
Основу игры составляет текстовый массив NxN элементов, где N может быть равно 2, 4, 8 и 16. Массив заполнен всего двумя символами X и Y. Позиция курсора, это позиция текущего элемента массива i и j. При инвертировании элемента массива происходит замена X на Y и Y на X с столбце и строке массива. Ну и плюс есть горячие клавиши (F1-F4, F10), которые позволяют вызвать Помощь, Сохранить/загрузить, создать и выйти. Здесь всё ясно, и как реализовать просто и останавливаться мы на этом подробно не будем.

Наибольший интерес, с познавательной точки зрения, представляет процедура WRIFT .*

* - примечание, почему wrift

В те времена, в качестве экономии смс-ки писались транслитом. Как мы помним буква “Ш ” заменяется сочетанием “sh ”, но для экономии места я её заменял неиспользуемой буквой со схожим написанием “W ”. Отсюда и пошло название Wrift (Шрифт). Аналогично буква “X ” (икс ) заменяла букву “Х ” (русское “ха ”).

Поскольку я решил использовать текстовый режим для игры, то мне понадобилась буква, которая бы заменила бы вентиль. При чём такая буква, которая бы показывала вентиль в вертикальном и горизонтальном положении. Единственные кандидаты, которые подходят для этих целей - это латинские буквы “N” и “Z”. Буква “Z” напоминает положенную на бок букву N, только растянутую.
Я попробовал этот вариант, и остался им не доволен. И понял, что требуется сделать что-то своё, какое-то альтернативное решение. Уже было я задумался написать графическую версию, как наткнулся на паскалевскую программу “Матрица” от автора Абрарова А.М. . Программа начинается так же, как первая “Матрица” - вывода на экран строки, поиск кода. А затем начинаются сыпаться символы-иероглифы. При чём это реализовано только в текстовом режиме.

Небольшой ликбез о программе Matrix.pas

Программа была очень красивой и изящной для своего времени. И мне тогда весьма доставляла. Самое интересное, что там реализован полный шрифт, для 208 символов! Но я предполагаю, что автор взял реализацию программы типа нашего “русификатора”, только для иероглифов и переделал её под себя.

Правда, сейчас чтобы заставить программу нормально работать, даже в dosbox, надо уменьшить все задержки раз в 10 (delay), иначе конца работы дождутся ваши внуки. Поскольку переделывать программу мне лень, то она представляет чисто академический интерес. Или быть может кто её переделает и покажет миру, софтинка-то красивая (тем более я даю ссылку на сорцы). А если вдруг её автор читает сей пост, то передаю ему мои слова благодарности.

Самое главное, в той программе, для “кракозябр” реализован свой шрифт! И производится его загрузка. Вот эту процедуру загрузки я и позаимствовал, разумеется немного изменив её.
Пара слов о работе со шрифтами.

В MS-DOS средствами BIOS поддерживается работа с растровыми шрифтами. Функции BIOS позволяют получать и устанавливать пользовательские шрифты, а также получать шрифты из знакогенератора видеоадаптера. Все устанавливаемые шрифты имеют одинаковую ширину 8 точек, а высота может иметь три фиксированных значения - 8, 14 или 16 точек. Конкретное значение высоты шрифта определяется видеорежимом, для которого загружается шрифт. Высота шрифта 8 точек соответствует видеорежиму с 50/43 строками, высота 14 точек - видеорежиму с 25 строками для EGA, а высота 16 точек - видеорежиму VGA с 25 строками.

Мы будем использовать видеорежим 16 цветов 40х25 символов. В таком видеорежиме, каждый символ представляет собой массив точек 8х16. Говоря просто, каждый символ представляет собой 16 байт, где в байте бит выставленный в единицу означает то, что он окрашивается в чёрный цвет. Если у вас сейчас каша в голове, не пугайтесь - дальше станет понятнее.
Для обозначения закрытого (вертикального) вентиля была выбрана буква “X” (латинская заглавная буква “Икс”) и для открытого горизонтального, буква “Y” (латинская заглавная буква “Игрек”). Выбор был сделан на эти буквы по нескольким причинам. Во первых они знакомы из школьной программы и на слуху. Во вторых, и это важнее, они в таблице ASCII символов стоят подряд (88d и 89d позиция соответственно), что упрощает их замену. А латинские выбраны для того, чтобы можно было сделать меню на русском, без перезалива шрифта.
Итак, с символами мы определились, теперь перейдём к их одежде, ака шрифту. Берём лист бумаги в клетку, и делаем на нём поле 8х16 и приступаем к рисованию символа горизонтального, а затем вертикального вентиля. Поскольку вентиль должен быть одинаковым, как в вертикальном, так и горизонтальном состоянии, то мы будем использовать только первые 8 строк, чтобы получить квадрат. И далее рисуем в этом поле два вентиля, вертикально и горизонтально. Должно получится как-то так


Шрифт двух вентилей

Далее, чёрный квадратик обозначаем единичкой, белый нулём. И формируем 8 байт. После чего их переводим в десятичный формат и формируем массив. Сначала 8 байт символа, потом 8 байт нулей (подвал же мы оставили пустым), повторяем эту процедуру для второго символа.


Таблица двоичных кодов, и переведённые в десятичный формат

В результате получаем такую шапку процедуры:

Procedure WRIFT; {Zagruzka shrifta ("pesochnye chasy")} Const Font:array of Byte=(129,195,231,153,153,231,195,129,0,0,0,0,0,0,0,0, 255,102,36,24,24,36,102,255,0,0,0,0,0,0,0,0); Var SegScr:Word; OfsScr:Word; screen1:Array of Byte absolute Font;

Font - это массив двух символов вентилей (каждый символ на своей строчке). Самая интересная переменная - это массив screen1 - массив, который располагается по абсолютному адресу переменной Font (директива absolute ). Далее наступает самое интересное.

Begin ofsscr:=ofs(screen1); segscr:=seg(screen1); Asm push bp mov ax,segscr mov es,ax mov bp,ofsscr mov bx,1000h mov dx,88 {s kakogo simvola na4at" zapis" 88d-X,89d-Y} mov cx,2 {koli4estvo simvolov} mov ax,1100h int 10h pop bp mov ah,1 {ustanovit videorezhim txt, tsvetnoj (16 cvetov) 40x25 } mov cx,1000h int 10h End; end;{WRIFT}

Как понятно из строк выше мы загружаем в регистр ES - сегмент, а в регистр BP - смещение адреса расположение нашего шрифта. Командой mov bx,1000h мы говорим, что в шрифте у нас 16 строк (число 10h=16d загружаем в BH, а BL=0).Далее в регистр DX мы загружаем номер символа, с которого мы начинаем менять шрифт. А в CX - количество заменяемых символов. Загружаем в регистр AX - номер функции BIOS для смены шрифта, и вызываем прерывание BIOS. Далее восстанавливаем регистр BP и аналогичным образом выставляем режим видеоадаптера. Подробнее описано тут: shackmaster.narod.ru/fonts.htm . Для лучшего понимания о структуре шрифтов, лучше будет почитать этот сайт.

Таким вот нехитрым образом, можно сменить весь шрифт в ДОСе на свой собственный. Для того, чтобы выгрузить шрифт, используется процедура Restore:

Procedure Restore; {Sbros shrifta} Begin asm mov ax,3 int 10h End; End;{Restore}

Которая выполняется при выводе меню и выходе из программы.

Кстати, для справки, аналогичным образом в ДОСе работали, так называемые “русификаторы”. Они просто заменяли текущий шрифт, на шрифт с русскими буквами.

Один из приколов

Один мой товарищ, а конкретно , когда изучал программирование на Борланд С++ сделал шрифт в виде МПХ, так же используя пример из “Матрицы”. Т.е. просто заменил все символы одним символом МПХ. Нортон Коммандер выглядел страшно! Жаль фотографий с того времени не осталось.
Такую бы программулинку запустить на информатике, то-то училка бы порадовалась.

Модификации сегодня

На самом деле, игру я даю не в том виде, в котором она была написана много лет назад. В ней обнаружились весьма неприятные косяки:
1. Программа просто вылетала, если не был обнаружен файл GAME.SAV;
2. Генератор случайных чисел не был инициализирован, поэтому генерировал постоянно один и тот же уровень.
Плюс, из-за проблем с кодировками, я создал вторую версию игры, полностью на английском языке. И если вы будете читать исходный код не в ДОС-совместимом редакторе, рекомендую использовать её исходники - там не будет проблем с кодировкой.

Так отрадно, что ДОСбокс есть везде, лично я редактировал большую часть программы на iPAD в метро. Представляете, как забавно выглядит перец с айпадом, и открытым на нём Борланд Паскалем?


Старый добрый Borland Pascal на iPAD

Так что косяки оперативно исправлены.

Несколько скриншотов программы, с кратким описанием

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


Старт

Курсор подсвечен, и мигает.

Если нажать F1, то можно получить вот такой нехитрый хелп




Хелп

Для генерации уровня жмём F4 и попадаем вот в такое меню


Меню генерации уровней

Ну и после победы игра вас поздравит


Поздравление с победой

И будет ждать нажатия любой клавиши. В этом случае прогресс игры не сохраняется.

Как установить и играть

В силу особенностей и применения загрузки шрифта, игруха работает только в чистом ламповом ДОСе. По этому, для её работы необходимо использовать dosbox или аналогичную программу.
Установка тривиальна. Качаете архив с программой . Устанавлиаете dosbox . И, если есть желание, русифицируете его, методика для linux вот: old-game.org/?p=1717 .
В принципе все эти файлы можно использовать и для винды: Для этого файл russian.txt кладётся в папке с программой и конфигом, и редактируется ярлык для досбокса. В пути ярлыка должно быть что-то типа: “«C:\Program Files\DOSBox-0.74\DOSBox.exe» -userconf” Убираем “-userconf” и будет работать ваш конфиг.

В Ubuntu я просто щёлкаю правой кнопкой мыши по программе и выбираю запустить её в dosbox, как в винде я не знаю, ибо её нет ни на одной из машин. Ну в крайнем случае монтируется путь до игры, командой mount путь.
На выбор вам русская и английская версия. Можно не морочиться с русификацией и геморроем с конфигами, а просто пулять в английскую. Разницы между ними практически нет. Хотя, лично я, как автор, предпочитаю русскую версию.
Управление производится стрелками клавиатуры, выбор и инвертация клавишей insert или двойным нажатием на пробел (да, тут косяк). Если вдруг заест позиция, нажмите один раз на пробел.

Помните, что каждый раз загружается последняя сохранённая игра. Для генерации новой, нажмите F4. Рекомендую начать с поля 4х4. Я сейчас играю 8х8, и пока боюсь переходить на 16х16. Ибо 4х4 я прохожу менее, чем за минуту, 8х8 минут за 7-10, а 16х16 боюсь даже представить.
Помните, что загрузочное поле с надписью HABR и моим ником (картинка в заходнике статьи), пропадёт после сохранения или легального выхода. Она хранится в файле GAME.SAV . Если хочется восстановить, то замените этот файл, на файл из архива.

Поле специально для хабра

Мне не хотелось просто так пускать игру, пусть и доделанную и допиленную для хабра. Хотелось какую-то фишечку. И я решил сделать надпись в самом большом поле 16х16.
Формат файла сохранения прост: начала идёт размер поля, например цифра 16, перевод каретки, потом 256 (для поля 16х16) символов X и Y, составляющие рисунок поля, а в конце количество Y в поле (этакая контрольная сумма).
Для этого в OF Calc я сформировал такое поле, цветом сделал надпись в клетках. А затем проставил соотсветственно буквы X и Y.

Заготовка для поля.

После чего сохранил его в CSV. Удалил все разделители. Посчитал количество Y (очень просто, делаешь во OF Writer поиск, заменить на и заменяешь Y на что-нить, он говорит количество замен - вот искомое число). Поставил сначала число 16, перевод каретки и в конце количество игреков. Результат вы можете оценить сами:).

Недостатки текущей версии программы.

Я написал текущей версии… Маловероятно, что я буду переписывать программу и совершенствовать её, ибо она уже страшно устарела. Но с другой стороны, сейчас dosbox можно поставить чуть ли не на фонарик, по этому она может обрести новую жизнь, и быть может имеет смысл переписать и исправить основные недостатки.

Итак:
1. Первый, и самый неприятный недостаток - это убогое управление. Во первых инвертация идёт клавишей Insert, или двойным пробелом. При чём, если пробел нажать нечётное количество раз, то программа “заедает”, пока не сделаешь чётное количество нажатий. Это раздражает.
2. Второй существенный недостаток - это отрисовка всей игры с помощью функций write/writeln. При каждом событии экран перерисовывается заново. При игре на поле 16х16 уже заметны тормоза и вспышки отрисовки. Плюс такой подход усложнил логику программы, и теперь её поправить громадная проблема.
Надо было реализовывать отрисовку с помощью функции goto(x;y); Тогда можно было бы менять отдельный символ, не перерисовывая весь экран.
3. Игра просто просит поддержку мыши. Опять же поддержку мыши нужно реализовывать на пару с п. 2, чтобы можно было точно “ловить” координаты.
4. Мелкий баг, который следует из п.2 - когда спускаешься в правый нижний угол, за рамку убегает один символ. Пытался исправить, и понял что проще вообще переписать это место отрисовки, чем разобраться как оно работает.

Что хотелось бы сделать

Конечно, хотелось бы такое приложение под ведройд или iPad. Чтобы можно было в него играть пальцем. Или уж, если не приложение, то браузерную игрушку (но такую, чтобы работала под Android и iOS). Чтобы там было красивое меню и удобная навигация. Была таблица рекордов. Был счётчик времени, которым можно было бравировать с друзьями. Так же была статистика, чтобы можно было оценить среднее время и скорость навыка.
В общем громадный полёт для творчества, при полном отсутствии свободного времени на изучение программирования под эти устройства. С другой стороны, dosbox есть везде, и наверное более универсальной переносимости добиться будет сложно, и может имеет смысл допилить таки эту программу? Как вы думаете?

Итоги...

Цель статьи, не показать какой я молодец, а просто вспомнить как было. Наверняка практически каждый из нас писал что-то такое в детстве. Это не ах какая сложная программа, и её может написать каждый школьник, при достаточной усидчивости. Здесь скорее пост воспоминание.
Раньше я в программах много использовал ассемблер. Мне нравилось “говорить” с железом напрямую, без посредников. Я лучше чувствовал машину. И даже потом, для AVR я писал исключительно на ассемблере. А сейчас я не понимаю, как функционирует ЭВМ. Конечно, я представляю базовые блоки и т.п., но детальную картину я не знаю, и самое забавное, что её не знает никто!
А сейчас… Языки высокого и сверх высокого уровня абстракции вообще заставляют нас не думать, как и где исполняется код. Это без сомнения хорошо, ибо позволяют сосредоточиться непосредственно на задаче, но с другой стороны уходит тот тёплый ламповый шарм работы с железом…

Список литературы и ссылок:
1. Описание, как загрузить шрифт под ДОС shackmaster.narod.ru/fonts.htm
2. Отличный справочник по ассемблеру, который мне дал понимание, как работать с функциями BIOS, да и вообще с комповым железом: “Программирование на аппаратном уровне: специальный справочник.” Кулаков
3. Эмулятор ДОСа dosbox www.dosbox.com/download.php?main=1
4. Программа и исходники narod.ru/disk/65499856001.6f143511c7c3c2ad7866f07008d8db29/INVERTOR.zip.html
5. Исходники программы “Матрица” narod.ru/disk/65499898001.a6c953f20e2ee023bd00e3518e22fea8/Matrix.pas.html

P.S. Фух, я наверное пару дней вспоминал и гуглил, как же я делал этот шрифт. Код есть, он работает, а как я не помню и не понимаю.
P.P.S. Если народу будет интересно, то я добавлю видео, как я прохожу поле 4х4 менее, чем за минуту (на примере холодильника “Братьев Пилотов”).
P.P.P.S. Буду признателен за все замечания по орфографии и пунктуации, отправленные личным сообщением!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите , пожалуйста.

Сейчас среди начинающих игроделов царит мнение, что для написания типичной 2D аркады на PC необходимо обзавестись крутым движком или конструктором, а также нехило знать столь престижный C++, оттого найти стоящую статью по Pascal практически невозможно. Но сегодня я решил попробовать сломать застоявшиеся стереотипы, написав небольшой урок по разработке простенького платформера. Итак, усаживайтесь удобнее, курс «просвещения» начинается…

1. Что необходимо?
Различных сред, использующих в качестве языка программирования Pascal, превеликое множество. Но из всей этой кучи для урока я решил использовать именно PascalABC.net. Почему? Ответ прост: во-первых данная среда программирования использует не чистый Паскаль, а его современный и более удобный потомок – Object Pascal; во-вторых Паскаль.Нет абсолютно бесплатна, а значит вам не придется парится с кряками или тратить деньги на лицензию.

2. Алгоритм.
Итак, у нас есть площадь 640x480, которая по моей задумке будет делиться на клеточки размером 8x8, представляющие из себя звенья массива s. Таким образом, меняя значение клеточки, мы можем сделать ее «свободной», либо «занятой» (к примеру, использовать как стену).

В итоге мы сможем без лишних манипуляций определить, куда игрок может переместиться, а куда нет (см. рис).

3. Переменные и модули.
Для полноценной работы нашей будущей игры нам понадобится подключить всего-ничего один модуль GraphABC, позволяющий отображать графические примитивы на экране.

Листинг 1:

200?"200px":""+(this.scrollHeight+5)+"px");">uses GraphABC;

Var
s: array [,] of integer;
i,x,y,vspeed: integer;
game_end: boolean;

4. Нажатия клавиш.
Итак, чтобы далее вам не пришлось лазать по своей писанине, чтобы модифицировать код, создадим две отдельные процедуры, отвечающие за манипуляции с положением игрока.

Листинг 2:

200?"200px":""+(this.scrollHeight+5)+"px");">//Обработка нажатий клавиш
procedure KeyPress(key: char); begin

If (key="d") and (s[(x div 8)+1,(y div 8)]=0) then //Если нажата клавиша D…
x:=x+8; //... А также есть свободное место, то передвигаемся на…
//… клеточку вперед (значение x увеличивается на 8)

If (key="a") and (s[(x div 8)-1,(y div 8)]=0) then //см. комментарий выше
x:=x-8;

If (key="w") and (vspeed=0) and (s[(x div 8),(y div 8)+1]=1) then //Если есть «занятая клеточка»…
vspeed:=-16; //… под ногами, то совершаем прыжок.

Procedure KeyDown(key: integer); begin
if (key=vk_enter) then game_end:=true; //При нажатии ENTER…
//значение переменной game_end равно true
end;

5. Гравитация.
Неотъемлемой частью платформера является какая никакая, а сила тяжести. Поэтому сейчас мы должны написать отдельную процедуру, которая в дальнейшем поможет игроку встать на ноги в буквальном смысле.

Листинг 3:

200?"200px":""+(this.scrollHeight+5)+"px");">//Гравитация
procedure Gravity(); begin

If vspeed=0 then begin //Если скорость прыжка равна нулю…
if s[(x div 8),(y div 8)+1]=0 then y+=8; //… перемещаемся на «клеточку» вниз (падаем)
end;

If s[(x div 8),(y div 8)+vspeed]=0 then y+=vspeed; //Если сверху есть свободная клеточка, то…
//… перемещаемся на vspeed вверх.

If vspeed<>0 then //Если скорость прыжка не равна нулю (в нашем случае: меньше нуля)…
vspeed+=2; //… то помаленьку ее сбавляем.

6. Рисование.
Думаю тут понятно без лишних слов, но для галочки отмечу, что игра делится на «визуальную» и «невизуальную» части. «Невизуальная» отвечает за все происходящее в самой игре, а «визуальная», собственно, за отображение происходящего на экране. Так вот, данная ниже процедура отвечает за «визуальную» часть и только.

Листинг 4:

200?"200px":""+(this.scrollHeight+5)+"px");">procedure Draw(); begin

Redraw;
LockDrawing;

//Рисуем белый прямоугольник…
setbrushcolor(clwhite); //… размером 640 на 480
fillrectangle(0,0,640,480);

Setbrushcolor(clblack);//Рисуем черные стены…
fillrectangle(0,192,640,224);//… по координатам…
//… 0 – 640 по X; 192 – 224 по Y
//(ВНИМАНИЕ! Данные манипуляции не делают стены осязаемыми, а всего лишь…
//… создают их графический образ.

Setbrushcolor(clred); //Рисуем игрока по координатам…
fillrectangle(x,y,x+8,y+8);//… x и y

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

Листинг 5:

200?"200px":""+(this.scrollHeight+5)+"px");">Begin //начало программы

//Указания значений для переменных
game_end:=false;
x:=0; //Стартовая позиция игрока по X
y:=0; //Стартовая позиция игрока по Y

//Создание массива
s:= new integer;

//Создание платформы, нарисованной в процедуре Draw
for i:=0 to 79 do
s := 1;

While game_end=false do begin //Создаем цикл…
//… который прервется, если game_end = false

//Рисование экрана
Draw();

//Гравитация для игрока
Gravity();

OnKeyPress:=KeyPress; //Обработка нажатий…
OnKeyDown:=KeyDown; //… клавиш

Sleep(30); //Ждем примерно полсекунды, чтобы игра…
//… работала с нормальной скоростью

End;//конец цикла.

End. //конец программы

8. Заключение.
Итого у нас получился незамысловатый платформер с точкой в главной роли. Мы можем передвигаться по горизонтали и прыгать:

В общем, не хотелось бы разбавлять концовку этого урока всякой мутью, поскольку «ненужную воду» зачастую просто не читают, поэтому отделаюсь тем, что попрошу вас оставлять комментарии. Спасибо за внимание! Надеюсь, я вам помог!

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

Инструкция

  • Начните работу над программой с заголовка и указания перечня используемых подключаемых модулей:program reshiprimer;uses crt;
  • Укажите компилятору, какие в состав программы будут входить переменные:vara,b,c:integer;d:string;Здесь a и b - слагаемые, c - сумма, d - ответ на вопрос о том, желает ли пользователь играть дальше.
  • Обозначьте начало программы и бесконечного цикла, а также инициализируйте генератор случайных чисел:beginrandomize;while 0=0 dobegin
  • Запрограммируйте генерацию двух случайных чисел в диапазоне от 0 до 1000:a:=round(random(1000));b:=round(random(1000));
  • Покажите пользователю пример, который он должен решить, а затем запросите результат:writeln("Сколько будет"),a,("+"),b,("?");readln(c);
  • Сообщите пользователю, правильно ли он решил пример:if a+b=c then writeln("Правильно!") else writeln("Неправильно!);
  • Спросите у пользователя, желает ли он играть еще:writeln("Будем играть дальше?");readln(d);
  • При отрицательном ответе завершите работу программы:if upcase(d)"Y" then halt(0);
  • Завершите сначала цикл, а затем и саму программу:endend.Обратите внимание на точку после второго оператора end.
  • Запустите программу, нажав Ctrl+F9. На экран будет выведен первый пример. Сосчитайте в уме и введите ответ на него. Машина тут же сообщит вам, правильно ли он решен. Затем будет задан вопрос о том, желаете ли вы играть дальше. Ответ Y или y приведет к выводу следующего примера, а ввод любой другой буквы - к завершению работы программы.
  • Добившись правильной работы игры, приступите к ее усовершенствованию. Например, добавьте очистку экрана перед показом каждого нового примера командой cls. Используя процедуру textcolor, сделайте, чтобы надписи выводились различными цветами. Подумайте, как можно заставить программу автоматически менять сложность примеров: при правильных ответах усложнять их, а при неправильных - упрощать. Чтобы разнообразить игру, добавьте функцию генерации примеров на различные математические действия.
  • Сегодня несложные игры, где нет ни графических, ни звуковых эффектов, переживают второе рождение. Играя в них, пользователь сосредотачивается на сюжете, а не на художественных приемах. Для создания таких игр хорошо подходит язык Паскаль.

    Инструкция

  • Скачайте компилятор языка Паскаль со следующей страницы - http://edn.embarcadero.com/article/20803. Ознакомьтесь с условиями использования данного программного пакета, после чего установите его.
  • Попробуйте создать игру, в которой от игрока требуется угадать число в интервале от 0 до 100. Вначале введите название программы:program ugadayka;
  • Подключите модуль CRT:uses crt;
  • Обозначьте переменные следующим образом:var
  • zagadka,mnenie,popytki:integer;

  • Начните программу с очистки экрана и переменных, а также присвоения загаданному числу псевдослучайного значения:begin
  • zagadka:=int(rnd*100);

  • Заставьте компьютер спрашивать у пользователя, каким, по его мнению, является загаданное число, до тех пор, пока он его не угадает:while not mnenie=zagadka do
  • popytki:=popytki+1;

    writeln("Попытка номер ",popytki,".");

    write("Как ты думаешь, какое число загадано? ");

    if zagadka>mnenie then writeln("Нет, загаданное число больше!")

    else writeln("Нет, загаданное число меньше!")

  • После того как число будет угадано, автоматическое повторение указанных выше событий прекратится. Начнется выполнение следующих строк программы. В них заставьте машину вывести информацию о том, что пользователь угадал число:writeln("Поздравляю! Ты угадал число с попытки номер ",popytki,". Оно действительно равно ",zagadka,".");
  • knopochka:=readkey

  • Введите оператор для завершения работы программы:end.
  • Сохраните программу под любым желаемым именем, используя пункты меню file -> Save as. В дальнейшем после каждого редактирования сохраняйте ее нажатием клавиши F2.
  • Для запуска программы на исполнения нажмите одновременно клавиши Control и F9.
  • После завершения работы программы для того, чтобы увидеть, что она вывела на экран непосредственно перед этим, нажмите одновременно клавиши Alt и F5. Для возврата к редактору нажмите это же сочетание клавиш еще раз.
  • Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

    хорошую работу на сайт">

    Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

    Размещено на http://www.allbest.ru/

    Размещено на http://www.allbest.ru/

    Введение

    1. Постановка задачи

    2. Описание данных

    3. Алгоритмы и блок-схемы

    4. Программа на языке Pascal с комментариями

    Заключение

    Список использованной литературы

    ВВЕДЕНИЕ

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

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

    1. Постановка задачи

    Требуется создать игру, основным смыслом которой является то, что в одной части экрана перемещаются объект одного типа(«Самолёт»), а в другой части экрана находится объект другого типа(«Средство противовоздушной обороны»), и «Средство ПВО» должно сбивать «Самолёт».

    а) Выбор, обоснование и изложение метода решения задачи.

    Я предпочёл использование динамической памяти, прорисовку текстур в отдельной процедуре.

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

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

    б) Построение алгоритма задачи.

    Программа начинается с меню, если же выбор пал на меню «Start Game» то сначала в динамическую память заносятся «чистые» квадраты экрана, затем последовательно на экран выводятся изображения динамических объектов и последовательно же заносятся в динамическую память. «Чистые» квадраты при этом накладываются на зарисованную область экрана, чтобы при сканировании последующих изображений не возникало конфузов.

    в) Создание и отладка программы.

    Создание программы состояло из трёх этапов: создание меню, создание основного тела игры в виде отдельной процедуры без прорисовки текстур и окончательная прорисовка текстур.

    г) Оформление пояснительной записки и защита курсового проекта.

    2. Описание данных:

    Size1, Size2, Size3, Size4 - переменные целого типа, которые хранят в себе область, выделяемую для динамических переменных.

    Pustota, Sam1, Rocket, F16 - динамические переменные, которые хранят в себе объекты игры.

    Key - булиновая переменная, принимает значение TRUE при нажатии клавиш.

    Name , Head, Cl - строковые переменные, записываемые в файл:

    NAME - хранит имя игрока, вводимое с клавиатуры;

    HEAD и CL - содержат строку, представляющую из себя совокупность дискрипторов языка HTML, которые, после записи в файл, преобразовывают его в HTML страницу.

    F1 - файловая переменная

    Event - переменная, описывающая события (тип: Tevent);

    3. Блок-схема

    4. Программа на языке Pascal c комментариями

    Uses Crt,App,Dialogs,Objects,Drivers,Views,Graph;

    Procedure Super_Mega_Game;

    Label b1;

    var Driver1,Mode,Size,Size2,x,y,size3,n,xs,d2,d11,d12,m,xt,p,h,Size4:Integer; s:char; Pustota,Sam1,Rocket,F16:Pointer; key:boolean; Name,Head,Cl:String; F1:Text;

    begin

    Randomize;

    xs:=1;

    Driver1:=Detect;

    Mode:=Detect;

    InitGraph(Driver1,Mode,"");

    ClearDevice;

    SetBkColor(3);

    Size:=ImageSize(0,0,53,53);

    GetMem(Pustota,size);

    GetImage(0,0,53,53,Pustota^);

    Size2:=ImageSize(640,0,600,40);

    GetMem(Sam1,Size2);

    SetColor(Yellow);

    Line(605,35,630,35);

    LIne(630,35,635,40);

    LIne(600,40,605,35);

    Line(600,40,635,40);

    Line(615,35,615,29);

    Line(615,29,620,35);

    SetColor(6);

    Line(610,32,620,24);

    Line(610,29,620,21);

    SetColor(Red);

    Line(620,24,624,20);

    Line(620,21,624,20);

    Arc(610,30,0,90,2);

    GetImage(640,0,600,40,Sam1^);

    Size4:=ImageSize(100,100,150,150);

    GetMem(F16,Size4);

    {КОРПУС}

    SetColor(6);

    Line(105,120,135,120);

    Line(105,114,130,114);

    {КАБИНА}

    Setcolor(Blue);

    Arc(131,117,0,90,3);

    Setcolor(6);

    Line(134,117,144,118);

    Line(134,120,144,118);

    {ПЕРВОЕ КРЫЛО}

    Line(115,119,113,130);

    Line(113,130,117,130);

    Line(117,130,121,119);

    Line(115,119,121,119);

    {ХВОСТ}

    Line(105,114,101,110);

    Line(101,110,105,120);

    {ВТОРОЕ КРЫЛО}

    Line(119,114,117,109);

    Line(117,109,113,109);

    Line(113,109,114,114);

    GetImage(100,100,150,150,F16^);

    PutImage(100,100,Pustota^,NormalPut);

    Size3:=ImageSize(640,0,600,40);

    GetMem(Rocket,Size3);

    SetColor(6);

    Line(610,32,620,24);

    Line(610,29,620,21);

    SetColor(Red);

    Line(620,24,624,20);

    Line(620,21,624,20);

    Arc(610,30,0,90,2);

    GetImage(640,0,600,40,Rocket^);

    Setcolor(6);

    Line(1,460,640,460);

    x:=6;

    y:=400;

    n:=0;

    m:=0;

    xt:=5;

    p:=1;

    h:=0;

    PutImage(585,10,Pustota^,NormalPut);

    RepeatRepeatif p=1 then begin Delay(100); PutImage(xt,100,F16^,NormalPut); xt:=xt+1; h:=h+1; if h=550 then p:=0; end;if p=0 then begin delay(100); PutImage(xt,100,F16^,NormalPut); xt:=xt-1; h:=h-1; if h=0 then p:=1; end;key:=KeyPressed;if (key=True) then goto b1;until s=chr(27);

    b1:

    s:=ReadKey;

    if s=chr(77) then x:=x+4;

    if s=chr(75) then x:=x-4;

    if s=chr(72) then begin Repeat PutImage(x+51+n,y-35-n,RocKet^,NormalPut); inc(n); PutImage(x+51+n,y-35-n,Pustota^,NormalPut); if (x+51+n)=550 then n:=300; until n=300; PutImage(x+n,y-35-n,Pustota^,NormalPut); if ((y+51+n)>100) and ((x+51+n)>(xt-10)) and ((x+51+n)<(xt+60)) then begin OutTextXY(250,200,"F16-vipe out!!!"); s:=chr(27); end; n:=0; end;

    PutImage(x-4,y,Pustota^,NormalPut);

    PutImage(x,y,Sam1^,NormalPut);

    until s=chr(27);

    readln;

    CloseGraph;

    TextColor(Green);

    Write("Input Your Name: ");

    Readln(Name);

    Head:="
    Winer!!!

    ";

    Cl:="
    ";

    Head:=concat(Head," MegaMen: ",name,cl);

    assign(F1,"Namer.htm");

    Rewrite(f1);

    Write(f1,head);

    Close(f1);

    end;

    type

    PProg=^TProg;

    TProg=object(TApplication)

    Constructor Init;

    end;

    Pdial=^TDial;

    TDial=object(Tdialog)

    Procedure HandleEvent (var Event:TEvent);

    Virtual;

    end;

    constcmPrint = 100;

    Constructor TProg.Init;

    varR:TRect;Dia:Pdial;g:char;

    begin

    Inherited Init;

    R.assign(20,9,60,17);

    Dia:=New(PDial,Init(R,""));

    R.assign(3,4,22,6);

    Dia^.Insert(New(PButton,Init(R,"Start Game",cmPrint,bfDefault)));

    R.assign(23,4,35,6);

    Dia^.Insert(New(PButton,Init(R,"Quit",cmCancel,bfNormal)));

    if execView(Dia)=cmPrint then begin Super_Mega_Game; Writeln("Press "b" for back to main menu"); repeat g:=ReadKey; if g="b" then begin clrscr; end; until g="b"; Writeln("Press "Alt-x" for Quit"); end;

    end;

    Procedure TDial.HandleEvent (var Event:TEvent);

    begin

    Inherited HandleEvent(Event);

    if (Event.What=evCommand) and (Event.Command=cmPrint) then EndModal(cmPrint);

    end;

    Procedure Batva;

    var

    Prog:TProg;

    begin

    Prog.Init;

    Prog.Run;

    Prog.Done;

    end;

    begin

    batva;

    end.

    5. Руководство пользователя для работы в программе

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

    Курсор перемещается при помощи клавиш курсора, выбор осуществляется клавишей ENTER .

    При выборе какого-либо пункта меню появляется соответствующее сообщение, однако же, при выборе пункта «Программа» запускается непосредственно сама игра.

    Суть игры заключается в сбивании самолётов средством ПВО.

    Средство ПВО может с помощью курсора перемещаться по экрану в горизонтальном направлении. При нажатии клавиши «пробел» средство ПВО совершает выстрел. Если снаряд попадает в то появляется надпись-“F-16 wipe out”. После того, как самолёт сбит вам предлагается написать своё имя, а затем просит нажать “b” -которая выводит вас на экран, на котором при нажатии ALT+X выводит вас из программы.

    компьютерный игра текстура программа

    Заключение

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

    Длителен также процесс детальной прорисовки графики.

    Необходимо, чтобы в той папке, где лежит данная программа, находился файл egavga.bgi . Этот файл имеется во многих версиях ТР в папке bin, он отвечает за инициализацию графики.

    Список использованной литературы.

    1. Меженный О.А. «Turbo Pascal-учитесь программировать»; Москва-С. Петербург-Киев; «Диалектика»; 2001; 448с.

    2. Бабушкин И.А.; «Практикум по ТР» - учебное пособие по курсам ИВТ; Москва, 1998.

    3. http://www.freepascal.org;

    4. http://www.geocities.com/~franzglaser/tp.htm;

    5. http://www.garbo.uwasa.fi/pc/turboobj.html;

    Размещено на Allbest.ru

    Подобные документы

      Разработка и реализация компьютерной игры "Змейка" с помощью языка программирования Pascal и модуля CRT. Составление общего алгоритма программы, выделение ее функциональных частей. Разработка тестовых примеров. Использование типизированных файлов.

      курсовая работа , добавлен 23.02.2011

      Характеристика вычислительной системы и инструментов разработки. Программирование на языке Pascal в среде Turbo Pascal и на языке Object Pascal в среде Delphi. Использование процедур, функций, массивов, бинарного поиска. Создание базы данных в виде файла.

      отчет по практике , добавлен 02.05.2014

      История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.

      курсовая работа , добавлен 27.09.2013

      Алгоритмическое представление и описание правил игры "Эволюция". Построение диаграммы прецедентов. Разработка графического интерфейса пользователя. Реализация интерфейса в среде Unity. Структура файла сохранения игры. Проектирование поведения компьютера.

      дипломная работа , добавлен 18.02.2017

      Описание правил игры "Морской бой". Особенности современных компьютеров и искусственного интеллекта. Создание общей блок-схемы программы, ее внешний вид. Необходимые переменные, процедуры и функции. Характеристика объектов, используемых в приложении.

      курсовая работа , добавлен 05.11.2012

      Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

      курсовая работа , добавлен 13.02.2012

      Основы работы на языке высокого уровня Turbo Pascal. Основное оборудование и программное обеспечение. Операторы, необходимы для работы в графической среде Turbo Pascal. Запуск графического режима. Текст программы в графической среде Turbo Pascal.

      лабораторная работа , добавлен 14.05.2011

      Разработка программы казуальной игры "Zuma Deluxe" на языке С\С++. Использование стиля древних инков и ацтеков, возможностей графического движка HGE version 1.53. Назначение основных классов игры. Руководство пользователя, содержание главного меню.

      курсовая работа , добавлен 28.10.2014

      Язык программирования Pascal и его турбооболочка. Аналитический обзор игрового программного обеспечения. Функции модуля Crt. Постановка задачи создания несложной игровой программы "Турбозмей", алгоритм реализации и описание пользовательского интерфейса.

      курсовая работа , добавлен 15.05.2014

      Реализация основных алгоритмических структур. Усеченный условный оператор и оператор exit. Цикл с параметром (счетный цикл). Распечатка таблиц функций. Средства разработки программ на языке Free Pascal. Разработка игрового приложения "Быки и коровы".

    • Сергей Савенков

      какой то “куцый” обзор… как будто спешили куда то