Игра 2048 на Pascal ABC .NET
Попросил меня однажды один человек помочь ему с курсовой. Все делали что-то простенькое, а он вот решил выделиться, замахнулся на игру, даже начал, но потом он понял, что как-то не понимает некоторых вещей, поэтому обратился за помощью ко мне
Ну а я что… Помог ему, конечно же! Да и самому было интересно! А теперь расскажу о некоторых подробностях и «возможностях» игры, а также ниже можно будет ссылку на исходники найти
Если честно, до этого мало дел имел с паскалем, к тому же, с паскалем .net!
Открыв наброски, которые тот человек уже сделал, увидел модули GraphABC, ABCObjects, с которыми раньше не приходилось работать.
Но до меня уже была часть работы сделана, а именно создание окна нужного размера и размещение «сетки» квадратиков 4х4.
Это облегчило задачу, потому что я увидел, что много схожестей есть с обычными паскалевскими объектами или графическими примитивами, а тут ещё удобство было в том, что все эти объекты (квадратики, кружочки и другие штуки) сами отвечают за свою прорисовку, не нужно рисовать на canvas-е и т.д., тут можно просто указать новую позицию или ещё как-то изменить объект, а перерисуется он уже сам!
И тут началась разработка! Никогда не приходилось до этого делать игру 2048, но найдя на просторах интернетов браузерную реализацию данной игры, пришлось поиграть в неё, опробовать разные ситуации, чтобы наглядно ознакомиться с правилами. Оттуда же были стянуты цвета и записаны в несколько чудном формате, потому что оказалось, что данный паскаль не поддерживает запись цветов через $, как это сделано в том же Delphi, например )
Вот такой вышел код, который возвращал нужный цвет текста и фона, в зависимости от цифры.
TSquareColor — это запись, хранящая в себе фоновый цвет и цвет текста. Функция createColor принимает на вход первым параметром цвет фона, а вторым — цвет текста и возвращает уже заполненную запись TSquareColor, которая потом уже используется для задания цвета определённой клеточки )
Вообще, код неплохо откомментирован. В некоторых местах даже избыточно, т.к. это курсовая работа, пришлось комментировать почти всё
А некоторые куски кода, которые можно было бы оптимизировать и вынести в отдельную функцию, лишь изменяя некоторые параметры, пришлось оставить так, как есть, задублированными… )
Поэтому всякие объяснения можно найти в коде!
Сразу скажу, что настройки размера поля, отступов клеточек друг от друга, другие отступы, настройки анимации и т.д. можно задавать тоже в коде, эти константы вынесены специально для этих целей )
Настало время показать, как это дело выглядит! А вот так:
Игра 2048. Окно программы в самом разгаре игры!
Ничего особенного. Всё как обычно )
А в заголовке отображается ещё и количество очков. Управление то же самое, как и в классической реализации игры. Поведение тоже )
При появлении и сложении клеточек есть анимация небольшая, которая порой работает кривовато… Тут уж был задействован таймер, а также изменение размеров этих блоков. Иногда просто почему-то размер не доходит до начального состояния, и поэтому некоторые клеточки так и остаются немного больше или меньше, но это происходит редко )
Также был написан небольшой класс для показа «диалоговых» окон, который содержит в себе простенькую реализацию некоего подобия окна подтверждения (которое содержит вопрос и кнопки ОК и Отмена). Суть в том, что можно динамически создавать эти диалоговые окошки, модально показывать их, реагируют они также на нажатия клавиши Esc (отмена) и Enter (ок).
Также можно показывать просто уведомление с кнопкой Ок!
Простенько, но большего и не нужно.. ) Даже это уже было лишним
Код класса этого находится в файле controlUtils.pas, который тоже находится в архиве
Выглядят окошки примерно вот так:
Игра 2048. Вопрос о начале новой игры (при нажатии на Esc)
Игра 2048. Конец игры. Лол!
Про модальные диалоги я, конечно, загнул немножко )
Вся модальность работает вот так:
Обрабатываются нажатия в главном окне программы, а там уже идёт проверка, если открыто какое-то диалоговое окно, то нужно обрабатывать нажатия несколько иначе, а если же нет никаких окон, то там уж управлять игрой нужно )
При нажатии мышкой на кнопку ОК или Enter на клавиатуре срабатывает уже определённое заданное событие, которое передаётся как callback (типа того) при вызове функции dialogs.showConfirm. Как-то так оно и работает… )
Прикольно, в общем. Остальное можно найти в коде и в комментариях, которых там, как уже было сказано выше, предостаточно.
Были некоторые идеи, типа сохранения состояния игры при закрытии и восстановление при открытии, но как-то не было в этом необходимости, да и интерес через некоторое время пропал, поэтому всё осталось на таком уровне, на котором есть сейчас. К тому же, для курсовой тому человеку всех этих окошек диалоговых не нужно, поэтому на каком-то этапе он просто оставил старую версию и стал дорабатывать её по-своему )
Скачать исходник и готовый ехе-шник, который, кстати, весит довольно мало из-за .Net, можно вот в этом замечательном архиве: http://shpirat.net/etc/2048_PascalABC.NET.zip
Сделано это всё было ещё осенью, но сейчас стало можно это опубликовать, может, ещё кому-то пригодится или же просто интересно будет
Мини игра на паскале
Мини игра паскаль смотри бесплатно и без рекламы в видеоплеере https://docs.google.com/document/d/1YU0bg7U3nvH_eJgP3q33HLMOws0hR7QJVYKQwM65Olk/mobilebasic мини игра паскаль и разместили всё в удобном для вас месте. Игра домино Здравствуйте, хочу попросить помощи в написании игры домино на языке с использованием. Игровое поле представляет собой прямоугольник, по которому движется теннисный мячик. Мини игра Угадай число Продолжительность 23 21 3 3 871 просмотр. Базовые навыки дают томики https://docs.google.com/document/d/1OpfcV4QRJFk1BmhDdJhhTwRekCj-kIUkP8zagMDt0c0/mobilebasic толщиной в тыщенку страниц. На видео показано как решать квадратное http://armhleb.ru/index.php?subaction=userinfo&user=ezimije уравнение с использованием программы на паскале. Лушайте онлайн и качивайте песню Создание Игр На Паскале https://docs.google.com/document/d/1QHwQn2U-E8gbZOmXUV0qCuv1ch0tbBYlLMjTXq-yC-w/mobilebasic размером и длительностью 9 мин и 15 сек в формате.
Попытка создать вменяемый 2 движок на Паскале. Меню должно содержать 5 вертикальных пунктов где. моя игра, игра на Паскале пародия на, 3 движок на Паскале, Графика в, Обзор программ часть. Вот подумал для себя создать мини искусственный интеллект. не смогу точно определить дату создания игры, но это точно конец школы, начало института. В данном видеоролик я вам покажу простейшею программу в Паскале. советую поместить этот файл в отдельную папку https://kal.akigul.pw/23.html он создаст вокруг себя ещё 7 вспомогательных файлов. Темы линейные алгоритмы, ветвления, циклы, массивы, строки.
Здравствуйте, я написал простенькую консольную миниигру, на звание полноценной игры она даже не претендует, я освоил Паскаль 23 дня назад, у меня есть вопрос, какой ЯП лучше подходит для разработки игр Программирование игр Теннис на языке Подробнее. Нужна небольшая консультация\помощь в предложенном ниже коде. Ответ прост вопервых данная среда программирования использует не чистый Паскаль, а его современный и более удобный потомок. Можно ли звуки загружать не построчно, а как картинки в массив. Исторически, Паскаль появился чуть раньше Си, и долгое время удерживал с ним примерный паритет по распространённости, так как вообще это очень близкие по концепции и возможностям языки. Логическая игра, написанная на языке Паскаль 5й версии, на советском компьютере ЕС1841. Технические требования Надо разработать на одном из предложенных игровых. Игра на смотри бесплатно и без рекламы в видеоплеере http://theboboo.com/bd2/4717 игра на и разместили всё в удобном для вас месте.
Игры на языке программирования Паскаль.
Качать Создание Игр На Паскале 3 размером https://izx.buzanrad.xyz/8.html бесплатно на высокой скорости и в хорошем качестве. Цель игры заключается в том, чтобы собрать плитку с числом. Форум программистов и сисадминов Киберфорум Форум программистов Паскаль. Простенькая арена с тремя классами, полем 10Х10 классика, командами и ручным управлением любым количеством. смысл в том, чтоб на экран выдавлись несколько https://docs.google.com/document/d/1vyYEgRii7II0gr04RfSjGcnmkAsdHXr3SBgCvo2QubA/mobilebasic чисел, которые нужно запомнить и ввести в обратном порядке. Игра написана с нуля собственными клешнями, в ней присутствуют как разрушаемые, так и неразрушаемые блоки. Подскажите как можно сделать мини прикол на паскале не знаю как правильно называется Суть нужно https://docs.google.com/document/d/1n87sCT5yjbVcUHxtW6UbGO8aQUztnj4G0NuIHTVUoBg/mobilebasic программа которая при запуске начинает ходить по монитору, например снег идет или кошка на мониторе.
Итог провал изза недостаточ ной производит ельности. Мне интересно создать примитивный движок в псевдо 3д графике, только. В этом видео я покажу вам, как написать довольно простую миниигру на языке программир ования. В нем подробно рассматриваются решения большого количества задач, от простых до достаточно сложных. В данном видео из курса по программированию для начинающих Паскаль с нуля, вы познакомитесь со средой. Дайте пожалуйста код простейшей игры, написанной на. Меню для игры http://49.231.238.163/board/viewtopic.php?f=3&t=605061&p=908862 Помогите пожалуйста создать меню. Но не просто повторяла исходную игру, а позволяла выбирать размер поля, имела хелп, возможность сохранения и продолжения игры. Простая и легкая https://oou.galabar.co/20.html минииграПрограммирование ◕‿◕ Подробнее. Разбор кода и демонстрац ия моего https://hfl.gogore.co/30.html каркасного 3 движка под, написанног на. Простая и легкая минииграПрограммирование ◕‿◕ Продолжительность 6 09 6 834 просмотра.
Возникли неполадки при создании игры на Короче, я не давно начал заниматься программированием. Коллекция простых задач по программированию, https://docs.google.com/document/d/1yeqHS3lGIWcGKyzlSEE8L6Z6MaPG4ZqoiWzReMtTsX0/mobilebasic решение которых написано на языке. конца игры Количество неигровых объектов Счетчик выигрышей Счетчик проигрышей Информационная строка Сообщение в начале игры. Вы можете подсказать, как создать игры в паскале. Делая свой арканойд с класным названием на паскале столкнулся с проблемами шарик не отражается от кирпичей и от ракетки, и сама ракетка двигается не правильно. анти Сапер на С перевести на Паскаль Здраствуйте, нашел в http://helpf.pro/index.php?name=account&op=info&uname=obuxaf инете исходники программы в которой реализован алгоритм определения мин у игры. А если создать эту игру на в андроиде https://ui.bothris.online/ и установить ее как апк то она будет работать.
Простейшая игра на паскале Обсуждение Киберфорум.
Игровой искусственный интелект В чом разница между игровым искусственным интелектом и искусственным интелектом. Сама игра не очень, но обложка и куча дополнительных функций сделали игру довольно интересной, код игры не помещяется в сообщение поэтому скину файлом. Можно остановиться на варианте, когда по экрану движется полоска, управляемая клавиатурой. вообще есть ли в паскале массив звуковых файлов. Ну раз извращение, тогда даже искать не буду https://docs.google.com/document/d/1Ttov_ng3SluhnFaQoq3Xrlam7F8JZ55mJZ865zxgk6g/mobilebasic хотя было бы прикольно, сделать такое на паскале. По скольку сам уже долго изучаю и владею достаточными знаниями, хочу поделиться ими с вами. Статьи об играх, в том числе и сделанных на гейммейкерах. Если честно, до этого мало дел имел с паскалем, к тому же, с паскалем . В нее играют 2 человека у меня будут играть 2, на самом деле может быть больше.
знаю на уровне правда https://sdk.rethinkrobotics.com/intera/User:RetaHeyward6 в массивах еще не разобрался. Продолжительность 8 25 Эдуард Мецкер 772 468 просмотров. Платформер на Паскале Для вас пацаны https://docs.google.com/document/d/1ApFB0PJqTS09rPrv-FtTFTQsbwW514R0d7KE8YTDW4Y/mobilebasic игроделы Продолжительность 26 15 4 191 просмотр. Сборник задач посвящен вопросам программирования на языке программирования. В этом видео я покажу вам, как написать довольно простую миниигру на языке программир. Рассматриваются основы программирования и базовый синтаксис, в том числе типы данных, условия и циклы. Способы записи алгоритма процедурная генерация мира ландшафта на паскале Знакомство с модулем Урок. Простейшая игра на паскале Здравствуйте, стало интересным создание своей игры на паскале. хочу учиться на программиста, но я пока даже не знаю, как писать игры в паскале. Игра 15 пятнашки Мне вот задали курсовую написать игру.
Игра смотри бесплатно и без рекламы в видеоплеере игра и разместили. Исходный код игры Змейка Может кто нибудь скинет какую нибудь игру, лучше всего змейку. Видео Уроки создания игры в Урок 2движение персонажа. Скачать можно тут полезноеп Хорошо можно изучить паскаль с помощью ютуб. Немного пояснений для тех кто только начинает учиться. Улучшить программу Программа работает, но нужно немного ее улучшить. Программирование игры на паскале Здравствуйте, недавно освоил базу в паскале абс и больше делать нечего, кроме как написать. Если плитки не изменили своё положение после нажатия на какуюлибо клавишу управления, то новая плитка всё равно появится. Написать программу, имитирующую игру в теннис. Итог провал изза недостаточной производительности Паскаля. Элементарно создаешь двумерный массив можно через одномерный, но это как кому удобнее нужной размерности это будет поле твое. Всем привет сегодня я решил подогнать вам миниигру написанную на языке программирования.
Можно ли сделать многопользовательскую игру на паскаль.
Много уникальных исходных кодов, доступных для скачивания. Берешь и идешь https://docs.google.com/document/d/13SpDbHuQX0-nNlFv3rklGvV6hIk4YDGVPnSJaK2OVGo/mobilebasic покупаешь самоучитель по паскалю. Нужны исходники игр на Пожалуйста дайте исходники игр. Готовые работы на тему Игры на языке программирования Паскаль. Список готовых работ на тему Игры на языке программирования Паскаль. Далее объявляешь переменные и они буду задавать положение сбиваемого объекта на поле и присваиваешь им случайные. Простая и легкая минииграПрограммирование ◕‿◕ Подробнее. Нужно что бы у одинаковых слов были разные коды. Решил устроить себе расслабление, https://docs.google.com/document/d/1MEpT4S1y2QldPaB163dV1joJd3m9-Ddf1Fa82KVKmgU/mobilebasic написал миниигру на питоне. Помогите сделать так, чтобы после отпускания клавиши змейка https://nzl.kajigrel.pw/2.html двигалась в том же направлении или менял это направление.
Суть игры такова, в разных местах появляется шарик на1. Потому что не знать массивы и называть https://docs.google.com/document/d/1MObzOuU-LyBNRcZgr_NHl8ON8t0V5f-LLOirJdfh1WY/mobilebasic себя миддлом может либо полный бездарь либо тролль. В этом видео я расскажу как создать свою собственную игру. Введение в программирование вообще и язык Паскаль в частности. Создайте функцию, которой в качестве аргументов передается число и степень, в которую надо возвести число. Обзор игры, написанной мной на Паскале за пару часов, количество глюков превзошло все мои ожидания, но исправить их нет возможности. В этом видео я покажу вам, как написать довольно простую миниигру на языке программирования. Написать полную версию игры на любом языке программирования, в том числе Паскаль, достаточно сложная задача для начинающих. Пишу меню для игры, при нажатии на белое поле выскакивает ошибка и процесс завершается Если нажимать не на квадраты, а на белое поле фон.
Рассматривается графический режим в паскале с использованием среды программирования, примеры того, как нарисовать различные графические примитивы. Доработайте программу таким образом, чтобы в случае неудачной игры пользователю выводилось сообщение том, что он не угадал число. Игра на реакцию Нужно написать игру в паскале. Компьютер загадывает случайное число в диапазоне от 0 до. Игра в Паскале Помогите пожалуйста исправить ошибки https://docs.google.com/document/d/1okvFQqjetUAOnGCrSSx2p8XEIxo9mTk44SSFBiTfbYQ/mobilebasic в программе текст задачи Дана прямоугольная область. Нужна ваша помощь какие служебные слова используются для этого и что они значат, как правильно их вписывать в паскале и пример простой игры, если можно. Первая игра на паскале, http://www.portalfara.com/?p=7689 которую я написал аналог пэкмана. Скиньте ктонебудь пожалуйста исходный код игры Сапер упрощенный вариант.
Да только вот просто набрав в игры на паскале, можно запросто скачать множество готовых игр с исходным кодом и с подробным описанием функций и процедур. пишем игру угадай число группа канала заходите. Составить поле для игры в сапер 1 https://docs.google.com/document/d/1HS0g1CEYGkmxJl5WVoGoMEk3m3qeKHKsvHQg8_plMJY/mobilebasic Пастбище представляет собой прямоугольник, разбитый на клеток. Решение задач, программирование и готовые программы на Паскаль. Простая и легкая минииграПрограммирование ◕‿◕. Задали такое задание, сделать игру гонки вроде все сделал и все бы ничего, но https://eux.delalanim.xyz/40.html когда гонка проходит и начинается следующая гонка то там текст ложится сверху на старый.
Доработайте программу таким образом, чтобы после завершения игры пользователю предлагалось либо завершить игру, либо начать. Задание Реализовать миниигру наподобие игры. Требования к игре Наличие главного меню Подсчет очков Проигрыш, возможность начать игру заново Наличие. Открыв наброски, которые тот человек уже сделал, увидел модули, с которыми раньше не приходилось работать. Превосходная программа, демонстрирующая возможности графики и алгоритма игры Жизнь на торе. С правой стороны располагается ракетка игрока, которую можно передвигать вверх или вниз. Ниже представлен вариант кода, при выполнении.
Игра «Змейка» на языке Паскаль
Такая игра, как «Змейка», известна многим, не только детям, но и взрослым. В том случае, если человек знает хотя бы минимальные основы программирования посредством использования языка Паскаль, есть возможность написать её самостоятельно.
Змейка представляет собой игру, в которой по экрану полоска осуществляет перемещение. Изменять направление, в котором она будет двигаться, можно посредством использования клавиш влево, вправо, вниз и вверх. Ключевая цель игры заключается в том, что передвигающаяся змейка не должна столкнуться с «врагами», «препятствиями» и при этом собрать все возможные бонусы.
В процессе столкновениями с бонусом змейка будет автоматически увеличиваться. В том случае, если столкновение произойдет с препятствиями, то игра автоматически заканчивается и ее можно начинать с самого начала.
Решение задачи по созданию «Змейки» в Паскале
Рассматривая сам процесс написания кода программы к игре «Змейка», можно сказать, что для тех, кто только начинает заниматься программированием, задача достаточно сложная. Здесь даже можно остановиться на том варианте, когда по экрану будет перемещаться обыкновенная полоска, которую можно будет посредством клавиатуры перемещать в нужном направлении.
Ниже можно ознакомиться с вариантом кода для игры «Змейка». Но особенность этот варианта будет заключаться в том, что по площади экрана будет попросту перемещаться курсом посредством использования клавиш влево, вправо, вверх и вниз.
Как только он выйдет за границы, игра будет автоматически заканчиваться. При этом границы, за которые не может выйти курсор, в обязательном порядке должны быть прописаны в цикле while. Рассматривая ниже приведенный вариант, стоит обратить внимание на то, что у змейки будет полностью отсутствовать хвост.
Вариант реализации игры «Змейка» на языке программирования Паскаль будет выглядеть следующим образом:

В модуле graph также можно предложить следующую модель реализации этой игры на Паскале. Будет выглядеть она следующим образом:

Детальное описание разработки
Написание программы происходит в специальной среде программирования под наименованием TurboPascal. Именно в ней будет создано специальное контекстное меню, которое возникнет перед игроком в самом начале игрового процесса.
В этом меню каждый пользователь сможет найти подсказки по тому, как можно будет осуществлять процесс управления змейкой в процессе игры. На поле будет находиться змейка, которую нужно будет перемещать и бонусы, которые нужно будет собирать для ее дальнейшего перемещения.
Как только будет осуществлен процесс запуска программы, будут выполнены следующие действия:
- первоначально появится контекстное меню, в котором будет отображена специальная справка о том, каким образом можно будет осуществлять процесс управления змейкой;
- после этого игроку предлагается приступить к выполнению игрового процесса;
- после подтверждения перед игроком откроется специальное игровое поле зеленого цвета, где в точках с произвольными координатами будет появляться еда и бонусы, а также появиться змейка, которая сразу же начнет процесс движения в правую сторону.
Процесс управления змейкой можно реализовать посредством применения следующих клавиш:
- d – вправо;
- a – влево;
- s – вниз;
- w – вверх.
Хранение каждой из координат составляющих частей змейки будет происходить в специальной матрице. После того, как будет происходить процесс нажатия одной из клавиш, эти значения будут автоматически меняться и повторно сохраняться в матрице, а змейка при этом будет осуществлять свое передвижение.
В том случае, если координаты начала змейки и еды будут между собой совпадать, координаты, в которых находится еда и бонусы, будут автоматически меняться. При поедании змейкой еды или же бонусов ее длина будет автоматически изменяться на один сегмент.
Стоит обратить внимание на то, что на каждом из этапов змейка будет осуществлять проверку на то, не столкнулась ли змейка с препятствием. В том случае, если это все-таки произойдет, игровой процесс заканчивается, а игрок видит перед собой сообщение о проигрыше и возможность осуществить игру повторно в том случае, если он желает.
Если же игроку удастся собрать абсолютно все бонусы и всю еду до того момента, пока змейка достигнет максимально возможной длины, перед ним появится сообщение о том, что он выиграл. Поэтому, если кто-то думает, что игра «Змейка» является бесконечной, на самом деле это не так. В процессе написания игры указывается предельное значение длины змейки.
Рассматривая функциональное описание, стоит обратить внимание на то, что для точки есть необходимость выбрать тип данных spoint=record. Максимальная длина змейки будет выступать в качестве константы и здесь программист должен самостоятельно выбрать предельное значение. Если же рассматривать переменные, то среди них можно выделить следующие:
- координаты размещения еды и бонусов;
- длина змейки;
- координаты расположения головы змейки;
- координаты размещения отдельных частей тела змейки;
- флаг, отвечающий за конец игрового процесса;
- вектор, по которому будет происходить перемещение змейки.
Поэтому, чтобы реализовать такую игру, как «Змейка» посредством использования языка программирования Паскаль, можно сказать, что выполнить этот процесс вполне возможно. Но при этом у человека, который начинает изучать язык программирования, должны быть хотя бы минимальные знания в реализации этого процесса. В других случаях понадобиться большое количество сил и времени для того, чтобы без подготовки выполнить написание код программы к известной и популярной игре под наименованием «Змейка».
Первая игра, которую я просто написал для себя
Пост ностальгии по игрушкам, которые мы сами для себя писали в детстве.
Лазая по просторам 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.*
Поскольку я решил использовать текстовый режим для игры, то мне понадобилась буква, которая бы заменила бы вентиль. При чём такая буква, которая бы показывала вентиль в вертикальном и горизонтальном положении. Единственные кандидаты, которые подходят для этих целей — это латинские буквы “N” и “Z”. Буква “Z” напоминает положенную на бок букву N, только растянутую.
Я попробовал этот вариант, и остался им не доволен. И понял, что требуется сделать что-то своё, какое-то альтернативное решение. Уже было я задумался написать графическую версию, как наткнулся на паскалевскую программу “Матрица” от автора Абрарова А.М. . Программа начинается так же, как первая “Матрица” — вывода на экран строки, поиск кода. А затем начинаются сыпаться символы-иероглифы. При чём это реализовано только в текстовом режиме.
Программа была очень красивой и изящной для своего времени. И мне тогда весьма доставляла. Самое интересное, что там реализован полный шрифт, для 208 символов! Но я предполагаю, что автор взял реализацию программы типа нашего “русификатора”, только для иероглифов и переделал её под себя.
Правда, сейчас чтобы заставить программу нормально работать, даже в dosbox, надо уменьшить все задержки раз в 10 (delay), иначе конца работы дождутся ваши внуки. Поскольку переделывать программу мне лень, то она представляет чисто академический интерес. Или быть может кто её переделает и покажет миру, софтинка-то красивая (тем более я даю ссылку на сорцы). А если вдруг её автор читает сей пост, то передаю ему мои слова благодарности.
Самое главное, в той программе, для “кракозябр” реализован свой шрифт! И производится его загрузка. Вот эту процедуру загрузки я и позаимствовал, разумеется немного изменив её.
Пара слов о работе со шрифтами.
Мы будем использовать видеорежим 16 цветов 40х25 символов. В таком видеорежиме, каждый символ представляет собой массив точек 8х16. Говоря просто, каждый символ представляет собой 16 байт, где в байте бит выставленный в единицу означает то, что он окрашивается в чёрный цвет. Если у вас сейчас каша в голове, не пугайтесь — дальше станет понятнее.
Для обозначения закрытого (вертикального) вентиля была выбрана буква “X” (латинская заглавная буква “Икс”) и для открытого горизонтального, буква “Y” (латинская заглавная буква “Игрек”). Выбор был сделан на эти буквы по нескольким причинам. Во первых они знакомы из школьной программы и на слуху. Во вторых, и это важнее, они в таблице ASCII символов стоят подряд (88d и 89d позиция соответственно), что упрощает их замену. А латинские выбраны для того, чтобы можно было сделать меню на русском, без перезалива шрифта.
Итак, с символами мы определились, теперь перейдём к их одежде, ака шрифту. Берём лист бумаги в клетку, и делаем на нём поле 8х16 и приступаем к рисованию символа горизонтального, а затем вертикального вентиля. Поскольку вентиль должен быть одинаковым, как в вертикальном, так и горизонтальном состоянии, то мы будем использовать только первые 8 строк, чтобы получить квадрат. И далее рисуем в этом поле два вентиля, вертикально и горизонтально. Должно получится как-то так
Шрифт двух вентилей
Далее, чёрный квадратик обозначаем единичкой, белый нулём. И формируем 8 байт. После чего их переводим в десятичный формат и формируем массив. Сначала 8 байт символа, потом 8 байт нулей (подвал же мы оставили пустым), повторяем эту процедуру для второго символа.
Таблица двоичных кодов, и переведённые в десятичный формат
В результате получаем такую шапку процедуры:
Font — это массив двух символов вентилей (каждый символ на своей строчке). Самая интересная переменная — это массив screen1 — массив, который располагается по абсолютному адресу переменной Font (директива absolute). Далее наступает самое интересное.
Как понятно из строк выше мы загружаем в регистр ES — сегмент, а в регистр BP — смещение адреса расположение нашего шрифта. Командой mov bx,1000h мы говорим, что в шрифте у нас 16 строк (число 10h=16d загружаем в BH, а BL=0).Далее в регистр DX мы загружаем номер символа, с которого мы начинаем менять шрифт. А в CX — количество заменяемых символов. Загружаем в регистр AX — номер функции BIOS для смены шрифта, и вызываем прерывание BIOS. Далее восстанавливаем регистр BP и аналогичным образом выставляем режим видеоадаптера. Подробнее описано тут: shackmaster.narod.ru/fonts.htm. Для лучшего понимания о структуре шрифтов, лучше будет почитать этот сайт.
Таким вот нехитрым образом, можно сменить весь шрифт в ДОСе на свой собственный. Для того, чтобы выгрузить шрифт, используется процедура 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 я писал исключительно на ассемблере. А сейчас я не понимаю, как функционирует ЭВМ. Конечно, я представляю базовые блоки и т.п., но детальную картину я не знаю, и самое забавное, что её не знает никто!
А сейчас… Языки высокого и сверх высокого уровня абстракции вообще заставляют нас не думать, как и где исполняется код. Это без сомнения хорошо, ибо позволяют сосредоточиться непосредственно на задаче, но с другой стороны уходит тот тёплый ламповый шарм работы с железом…