Первая Игра, Которую Я Написал Для Себя

Пост ностальгии по игрушкам, которые мы писали себе в детстве.

Лазая по App Store в поисках очередной игрушки для своего iPad, я наткнулся на старую игрушку «Братья Пилоты».

Я сразу купил, установил и допилил за один раз (раза уже наверное 3).

Но больше всего меня задержал эпизод с холодильником.

Эта загадка меня очень беспокоит.

Первая игра, которую я написал для себя

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

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

Восстановив старые резервные копии, я нашел оригинальную игру.

Запустил в досбокс и пропал из внешнего мира на пару часов.



Первая игра, которую я написал для себя

Оригинальная головоломка: обратите внимание на открытую левую колонну и положение ворот.



В чем смысл?

Суть головоломки довольно проста.

Имеется поле клапанов 4 на 4 штуки; необходимо поставить все клапаны на холодильнике в горизонтальное положение.

«Но есть нюанс»(с): при повороте вентиля все вентили в том столбце и ряду, в котором этот вентиль находится, поворачиваются вместе с ним.

И вот здесь начинается веселье! Когда я впервые сел разгадывать эту головоломку в оригинальном квесте, играя ее еще в школе, мне потребовалось, наверное, минут 40, не меньше.

Но мне она настолько понравилась, что я играл, играл и играл.

Но мне хотелось большего: возможности сохранять геймплей, генерировать разные уровни и менять размер поля, чтобы понять алгоритм игры.

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

Выход один – реализовать эту игру самостоятельно.



Что ж, давайте начнем!

Я не смогу указать точную дату создания игры, но это точно конец школы, начало учебы в колледже.

В те годы я свободно владел Паскалем.

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

Поэтому было решено написать игрушку именно на нем.

Несмотря на то, что я знал, как реализовать графику в DOS, я решил не делать графическое приложение.

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

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

Среди особенностей: помощь, возможность сохранить и после запуска продолжить игру с момента ее остановки, возможность изменить размер игрового поля.

Плюс немного цвета и изящества.



Выполнение

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

Но на паре моментов остановлюсь подробнее.

Основой игры является текстовый массив из элементов NxN, где N может быть равно 2, 4, 8 и 16. Массив заполняется только двумя символами X и Y. Позицией курсора является позиция текущего элемента массива.

я и Дж.

При инвертировании элемента массива X заменяется на Y, а Y на X в столбце и строке массива.

Ну и плюс есть горячие клавиши (F1-F4, F10), позволяющие вызвать Справку, Сохранить/Загрузить, Создать и Выйти.

Здесь все понятно, а как это реализовать просто и мы не будем на этом подробно останавливаться.

Наибольший интерес, с образовательной точки зрения, представляет процедура РИСФТ .

* * - обратите внимание, почему В те времена в целях экономии СМС-сообщения писались транслитерацией.

Как мы запоминаем письмо» Ш ” заменяется комбинацией “ ш », но для экономии места заменил ее неиспользуемой буквой с аналогичным написанием « Вт «Отсюда и пошло название Рифт (Шрифт).

Так же письмо « Икс ” ( Икс ) заменил букву « Икс " (Русский " Ха ”).

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

Какое это имеет отношение к букве, на которой будет изображен клапан в вертикальном и горизонтальном положении.

Единственными кандидатами, подходящими для этих целей, являются латинские буквы «N» и «Z».

Буква «Z» напоминает положенную на бок букву Н, только вытянутую.

Я попробовал этот вариант и он мне не понравился.

И я понял, что мне нужно сделать что-то свое, какое-то альтернативное решение.

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

«Матрица» от автора Абрарова А.

М.

.

Программа начинается так же, как и первая «Матрица» — вывод на экран строки, поиск кода.

И тогда начинают сыпаться иероглифические символы.

Причем реализовано это только в текстовом режиме.

Небольшой ликбез о программе Matrix.pas Программа была очень красивой и элегантной для своего времени.

И тогда это доставило мне массу удовольствия.

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

Правда теперь, чтобы программа работала нормально, даже в досбоксе, нужно уменьшить все задержки в 10 раз (delay), иначе ваши внуки будут ждать окончания работы.

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

А может кто-то переделает и покажет миру, софт прекрасный (тем более, что даю ссылку на исходники).

И если вдруг его автор прочитает этот пост, то передаю ему слова благодарности.

Самое главное, что в этой программе у «кракозября» есть свой шрифт! И он загружен.

Эту процедуру загрузки я позаимствовал, конечно немного изменив.

Несколько слов о работе со шрифтами.

В MS-DOS BIOS поддерживает работу с растровыми шрифтами.

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

Все установленные шрифты имеют одинаковую ширину — 8 пунктов, а высота может иметь три фиксированных значения — 8, 14 или 16 пунктов.

Конкретное значение высоты шрифта определяется видеорежимом, для которого загружается шрифт. Высота шрифта 8 точек соответствует режиму видео 50/43 строки, высота шрифта 14 точек соответствует режиму видео 25 строк для EGA, а высота шрифта 16 точек соответствует режиму видео 25 строк VGA.

взятый отсюда Мы будем использовать видеорежим 16 цветов 40x25 символов.

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

Для обозначения закрытого (вертикального) клапана выбрана буква «Х» (латинская заглавная буква «Х»), а для открытого горизонтального клапана — буква «Y» (латинская заглавная буква «Y»).

Эти буквы были выбраны по нескольким причинам.

Во-первых, они знакомы по школьной программе и на слух.

Во-вторых, и это более важно, они располагаются подряд в таблице символов ASCII (позиция 88d и 89d соответственно), что упрощает их замену.

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

Итак, с символами мы определились, теперь перейдем к их оболочке, она же шрифт. Берем лист бумаги в клетку, делаем на нем поле 8х16 и начинаем рисовать условное обозначение горизонтального, а затем вертикального клапана.

Поскольку ворота должны быть одинаковыми как в вертикальном, так и в горизонтальном состоянии, мы будем использовать только первые 8 строк, чтобы получить квадрат. А затем рисуем на этом поле два вентиля, вертикально и горизонтально.

Должно получиться что-то вроде этого

Первая игра, которую я написал для себя

Двухклапанный шрифт Далее обозначим черный квадрат единицей, а белый нулем.

И формируем 8 байт. Затем преобразуем их в десятичный формат и формируем массив.

Сначала 8 байт символа, затем 8 байт нулей (подвал мы оставили пустым), повторяем эту процедуру для второго символа.



Первая игра, которую я написал для себя

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

  
  
   

procedure WRIFT; {Zagruzka shrifta ("pesochnye chasy")} Const Font:array [1.32] 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 [0.512] of Byte absolute 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 строк (в BH загружается число 10h=16d, а BL=0).

Далее загружаем номер символа в регистр DX, с чего начинаем менять шрифт. А в СХ - количество заменяемых символов.

Загружаем регистр AX в номер функции BIOS для изменения шрифта и вызываем прерывание BIOS. Далее восстанавливаем регистр БП и таким же образом устанавливаем режим видеоадаптера.

Более подробно описано здесь: shackmaster.narod.ru/fonts.htm .

Для лучшего понимания структуры шрифта лучше прочитать этот сайт. Таким простым способом можно поменять весь шрифт в ДОСе на свой.

Чтобы выгрузить шрифт, используйте процедуру Восстановить:

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

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

Кстати, для справки, в DOS аналогичным образом работали так называемые «русификаторы».

Они просто заменили текущий шрифт на шрифт с русскими буквами.

Одна из шуток Один из моих друзей, в частности терми , когда я изучал программирование на Borland C++, я сделал шрифт в виде MPH, также на примере из «Матрицы».

Те.

Я просто заменил все символы одним символом MPH. Norton Commander выглядел устрашающе! Жаль, что фотографий того времени не осталось.

Если бы такое программное звено можно было запустить в информатике, учитель был бы рад.

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

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

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

А если вы читаете исходный код не в DOS-совместимом редакторе, рекомендую использовать его исходники — проблем с кодировкой не возникнет. Как приятно, что DOSbox есть повсюду; Большую часть программы я лично редактировал на iPad в метро.

Представляете, как смешно выглядит Пеппер с iPad и открытым на нем Borland Pascal?

Первая игра, которую я написал для себя

Старый добрый Borland Pascal на iPad Так что косяки были оперативно исправлены.



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

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

После запуска открывается игровое поле с последней сохраненной игрой.



Первая игра, которую я написал для себя

Начинать Курсор подсвечивается и мигает. Если вы нажмете F1, вы получите эту простую помощь

Первая игра, которую я написал для себя



Первая игра, которую я написал для себя

Помощь Чтобы сгенерировать уровень, нажмите F4 и попадете в это меню.



Первая игра, которую я написал для себя

Меню генерации уровней Ну а после победы игра вас поздравит

Первая игра, которую я написал для себя

Поздравляем с победой И он будет ждать нажатия любой клавиши.

При этом игровой прогресс не сохраняется.



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

Из-за особенностей и применения загрузки шрифтов игрушка работает только в чистом ламповом DOS. Поэтому для его работы нужно использовать dosbox или подобную программу.

Установка тривиальна.

Скачать архив с программой .

Установить досбокс .

И при желании можно его русифицировать, вот способ для Linux: old-game.org/Эp=1717 .

В принципе, все эти файлы можно использовать и для Windows: Для этого файл russian.txt помещаем в папку с программой и конфигом и редактируем ярлык для Dosbox. Короткий путь должен выглядеть примерно так: « «C:\Program Files\DOSBox-0.74\DOSBox.exe» -userconf» Мы удаляем «-userconf» и ваша конфигурация будет работать.

В Ubuntu я просто щелкаю правой кнопкой мыши по программе и выбираю запустить ее в dosbox, но не знаю, как это сделать в Windows, потому что ни на одной из машин ее нет. Ну и в крайнем случае путь к игре монтируется с помощью команды mount path. У вас есть на выбор русская и английская версии.

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

Разницы между ними практически нет. Хотя лично я как автор предпочитаю русскую версию.

Управление осуществляется с помощью стрелок клавиатуры, выделение и инверсия - с помощью клавиши вставки или двойного щелчка по пробелу (да, здесь есть косяк).

Если позиция вдруг застряла, нажмите один раз пробел.

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

Чтобы создать новый, нажмите F4. Я рекомендую начать с поля 4х4. Я сейчас играю в 8х8 и до сих пор боюсь переходить на 16х16. Потому что 4х4 я делаю меньше чем за минуту, 8х8 минут за 7-10, а 16х16 боюсь даже представить.

Помните, что поле загрузки с надписью ХАБР и моим ником (картинка в записи статьи) исчезнет после сохранения или легального выхода.

Он хранится в файле ИГРА.

САВ .

Если хотите восстановить, то замените этот файл файлом из архива.

Поле специально для хабра Мне не хотелось просто запускать игру, даже если она уже доделана и доработана для хаба.

Мне хотелось какой-нибудь хитрости.

И я решил сделать надпись в самом большом поле 16х16. Формат файла сохранения простой: сначала идет размер поля, например цифра 16, возврат каретки, затем 256 (для поля 16x16) символов X и Y, составляющих шаблон поля, и в конце количество Y в поле (разновидность контрольной суммы).

Для этого я создал такое поле в OF Calc и сделал надписи в ячейках цветом.

А затем он прописал буквы X и Y соответственно.



Первая игра, которую я написал для себя

Подготовка к полю.

Затем я сохранил его как CSV. Удалены все разделители.

Я посчитал количество Y (все очень просто, делаешь поиск в OF Writer, заменяешь на и заменяешь Y на что-то, он тебе сообщает количество замен — это и есть то число, которое ты ищешь).

Сначала я поставил цифру 16, возврат каретки и в конце количество игроков.

О результате можете судить сами :).



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

Я написал актуальную версию.

Вряд ли я буду переписывать программу и улучшать ее, потому что она уже ужасно устарела.

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



Так:
1. Первый и самый неприятный недостаток – плохое управление.

Сначала инверсия производится с помощью клавиши Insert или двойного пробела.

Более того, если нажать пробел нечетное количество раз, программа «залипнет», пока вы не сделаете четное количество нажатий.

Это раздражает. 2. Второй существенный недостаток — рендеринг всей игры с помощью функций write/writeln. При каждом событии экран перерисовывается.

При игре на поле 16х16 уже заметны подтормаживания и вспышки рендеринга.

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

Необходимо было реализовать рендеринг с помощью функции goto(x;y); Тогда можно было бы менять один символ, не перерисовывая весь экран.

3. Игра просто просит поддержку мыши.

Опять же, поддержку мыши нужно реализовать совместно с шагом 2, чтобы можно было точно «уловить» координаты.

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

Я попробовал это исправить и понял, что проще полностью переписать это место рендеринга, чем разбираться, как оно работает.

Чем бы Вы хотели заняться

Конечно, хотелось бы такое приложение для Android или iPad. Чтобы вы могли играть пальцем.

Или, если не приложение, то браузерная игрушка (но такая, которая работает под Android и iOS).

Чтобы было красивое меню и удобная навигация.

Была таблица рекордов.

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

Также была статистика, чтобы можно было оценить среднее время и скорость выполнения навыка.

В общем, огромный полет для творчества, при полном отсутствии свободного времени на изучение программирования для этих устройств.

С другой стороны, досбокс есть везде, и добиться более универсальной переносимости, наверное, будет сложно, и, может быть, имеет смысл допилить эту программу? Как вы думаете?

Полученные результаты.

Цель статьи не показать какой я молодец, а просто вспомнить как было.

Наверняка почти каждый из нас писал в детстве что-то подобное.

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

Это скорее пост-воспоминание.

Раньше я часто использовал ассемблер в программах.

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

Я стал лучше чувствовать машину.

Да и то для AVR я писал исключительно на ассемблере.

И теперь я не понимаю, как функционирует ЭVM. Базовые блоки и т. д. я, конечно, представляю, но детальной картины не знаю, и самое смешное, что ее никто не знает! А теперь.

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

Список литературы и ссылок:
1. Описание как скачать шрифт под DOS shackmaster.narod.ru/fonts.htm 2. Отличный справочник по ассемблеру, давший мне понимание, как работать с функциями BIOS, да и вообще с железом компьютера: «Программирование на аппаратном уровне: специальный справочник».

Кулаков 3. Симулятор DOS досбокса 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. Уф, я, наверное, провел пару дней, вспоминая и гугля, как я сделал этот шрифт. Код есть, он работает, но я не помню и не понимаю как.

П.

П.

С.

Если людям будет интересно, добавлю видео, как я заполняю поле 4х4 менее чем за минуту (на примере холодильника Pilot Brothers).

П.

П.

П.

С.

Буду признателен за любые замечания по орфографии и пунктуации, отправленные в личное сообщение! В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Какую следующую статью вы хотите увидеть? 18,32% Начало работы с gnuplot. Для новичков основы и основы + немного хитростей 164 45,81% Генератор случайных чисел на основе радиоактивного распада 410 35,87% Сантехническая электроника (цикл статей) 321 Проголосовали 895 пользователей.

210 пользователей воздержались.

Теги: #pascal #old games #oldschool #Assembler #ностальгия #DOS #dosbox #Ненормальное программирование #delphi

Вместе с данным постом часто просматривают: