Исследование возможностей языка Паскаль на примере создания экономической стратегии фабрика

XVI Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке. Летняя площадка 2022

Исследование возможностей языка Паскаль на примере создания экономической стратегии фабрика

Лебедев А.С. 1
1Муниципальное Автономное Общеобразовательное Учреждения "Средняя общеобразовательная школа № 4"
Ветошкин А.В. 1
1Муниципальное Автономное Общеобразовательное Учреждения "Средняя общеобразовательная школа № 4"
Автор работы награжден дипломом победителя II степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

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

В данном проекте я расскажу о создании несложной экономической стратегии «Фабрика» на языке программирования Паскаль в среде программирования Lazarus(Лазарус). Сама среда программирования существует с 2001 года, и до сих пор используется. Базируется Lazarus на языке Object Pascal и использует компилятор Free Pascal.

Цель работы: создать экономическую стратегию “Фабрика”. Задачи: придумать идею геймплея; придумать и разработать интерфейс; подобрать спрайты; написать и оптимизировать программу.

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

История создания языка Паскаль

Изначально Паскаль должен был стать новой версией языка программирования Алгол. Алгол был одним из первых языков программирования высокого уровня, то есть имеющего запись, приближенную к обычной речи, наряду с Фортраном. Алгол имел довольно громоздкий вид записи, а потому в 1965 была предложена идея создать преемника Алгол-60, имевшего бы менее громоздкую запись. За это взялся Николас Вирт, ранее участвовавший в разработке Алгола-68. Изначально язык назывался Алгол-W, и уже тогда он разрабатывался от части в образовательных целях для студентов. В дальнейшем язык был переименован в Паскаль, в честь французского математика и физика Блеза Паскаля, который изобрел фактически первый калькулятор, который назывался арифмометр. Это устройство могло производить арифметические действия с двумя числами. Паскаль был официально выпущен в использование в 1970 г. И до сих пор используется, в основном для обучения основам программирования, так как многие принципы, на которых построено программирование на Паскале используется в более сложных языках, таких как C++.

Среда программирования Lazarus

Lazarus среда программирования используется с 2001 года по наши дни. Эта среда является кроссплатформенной, то есть может работать и переносить один и тот же код между операционными системами, а конкретно Windows, Linux, Mac OS и Android. Распространяется свободно. Имеет достаточно широкие возможности, что позволяет создавать достаточно сложные программы, как например Total Commander. Lazarus имеет удобный и интуитивно понятный интерфейс, что позволяет работать в нем без особых затруднений. В данном проекте будет использоваться тип программы “Приложение”, который также может быть назван ООП.

Разработка идеи

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

Принцип игры прост: игрок выступает в роли начальника мебельной фабрики. Задача – накопить энную сумму денег за ограниченное время, путем производства и продажи мебели. В день можно производить ограниченное количество товаров, а сам товар производиться из материалов, которые можно получить лишь путем покупки. В процессе также можно будет приобрести улучшения, которые позволят достичь итоговой цели. Цена на товар и материалы должна варьироваться, для усложнения процесса (вариативность цен приведет к тому что товар будет окупаться не всегда).

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

Процесс разработки

2.1. Графическое оформление

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

Сам интерфейс программы в Lazarus строится из объектов. Все они располагаются на основном – форме. В данной программе она одна. Форм может быть и несколько, однако они имеют раздельный код, поэтому реализовать это непросто, да и в этой игре не требуется. Большая часть кнопок и надписей в игре распределена по панелям. В данной игре это используется для удобной группировки объектов в процессе программирования, но помимо этого панели могут выполнять и более значимые задачи, как пример в Lazarus есть объект под названием Radio Button, при наличии нескольких таких объектов на одной панели может быть активен только один из них. Слева на главной панели располагается “склад”. На нем нет объектов, с которыми игрок мог бы напрямую взаимодействовать, однако он содержит всю информацию о деньгах, материалах и товаре, который имеет игрок. В центре сверху находиться “рынок”. Здесь игрок выбирает какой материал/товар купить/продать, также здесь высвечивается цена. Справа находиться “станок”. Здесь высвечивается информация о том какие материалы требуются для производства того или иного товара. В самом низу находиться кнопка завершения дня, счетчик дней, а также прогресс, определяющий сколько еще товара игрок сможет произвести. Все оставшееся пространство занимают кнопки покупки улучшений, на которых указано улучшение и цена на него. Панелями сгруппированы конкретно: склад, станок, кнопки купить/продать по отдельности для материалов и товаров. Картинки используются на складе, для визуализации хранимого, на рынке, для демонстрации товара, и на станке для более визуального восприятия.

Функция купли-продажи

Одна из важнейших функций всей игры без которой процесс просто невозможен, так как материалы для производства можно получить лишь путем покупки их на рынке. Реализация довольно проста – игрок выбирает материал или мебель из выпадающего списка после чего может увидеть цену на соответствующий товар и купить или продать его. Эта система, как и многие другие не только в данном проекте построена в основном на условном операторе if(если). Цена, появляющаяся картинка, а также то что в итоге будет прибавляться или отниматься у склада определяется за счет проверки текущего индекса выпадающего списка (объект ComboBox). Таких списков для данной возможности два – для материалов и для мебели. Нажатие кнопки покупки или продажи определяет происшествие одного из нескольких событий: покупка при которой у игрока вычитаются деньги (переменная money) но прибавляется материалов или готовой мебели, продажа противоположно покупке (деньги плюс, материалы/мебель минус). Также при совершении любого из этих действий продвигается вперед полоса счета времени. Подробнее об этом в части Функция внутри игрового времени. За цену отвечает массив cost из тринадцати элементов. За количество материалов и мебели массивы mat и prod из четырех и девяти элементов соответственно. Если же у игрока не хватает денег или товара для продажи, то выводится сообщение о невозможности совершить действие.

Функция производства

Функция “станка” также является одной из ключевых в игре, так как является самым простым и надежным способом получить деньги. Игрок выбирает какую мебель он хочет произвести из выпадающего списка, после чего по нажатию кнопки, при наличии достаточного количества материалов, на склад добавляется определенная мебель. Работа основана на проверке с помощью if какой элемент выбран в выпадающем списке, в соответствии с чем выводится картинка соответствующего товара и требуемые материалы, а также хватает ли игроку материалов для производства. Первое условие проверяется ComboBox-ом при смене элемента из перечня, второе – кнопкой “Произвести”.

Каждое результативное нажатие на кнопку производства продвигает вперед полосу, отвечающую за счет игрового времени. Количество раз которое можно совершить производство можно улучшить. Если вышеуказанная полоса заполнена, или игроку не хватает материалов для производства, то при нажатии на кнопку выведется сообщение о невозможности совершить действие. За количество материалов требуемое для производства отвечает четыре массива: proizd из девяти элементов, proizm из семи, proizs из двух и proizo также из двух элементов. Изначально игрок не может производить любую мебель какую захочет. Это ограничивается уровнем производства, который может быть улучшен за деньги. Всего таких уровней три, первый из которых стартовый.

Функция бонусов и улучшений

Всего в игре четыре постоянных улучшений и пять временных(бонусов). За первые отвечает массив upg, за вторые upgt из четырех и пяти элементов соответственно. В случае с постоянными улучшениями массив определяет их уровень, в случае с временными активны они или нет. Постоянные улучшения имеют от трех до пяти уровней, один из которых стартовый. Работа каждого постоянного улучшения основана на проверке через if может ли игрок произвести улучшение. Если да, то происходит изменение определенных параметров, в зависимости от улучшения. Таким образом можно улучшить уровень производства, открывая производство более дорогой мебели, количество действий, что позволяет производить больше мебели, цех что позволит производит больше мебели за тоже кол-во материалов и электрооборудование чтобы сократить содержание фабрики. Бонусы или временные улучшения, дают определенное преимущество не на всегда, а на определенный период практически во всех случаях привязанный к внутри игровым дням. Для этого используется массив day также применяющийся в событиях. Каждый бонус имеет определенное время перезарядки, измеряющееся в игровых днях, за длительность которого отвечает массив cldn, так как все бонусы имеют довольно мощный эффект. Если перезарядка не завершена, то кнопка бонуса будет заблокирована. Бонусы позволяют тратить на производство вдвое меньше материалов, повысить цену на товары, уменьшить цену на содержание и количество действий, или убрать ограничение на количество действий. Последний бонус является единственны который привязан не к игровому времени, а к реальному (примерно 11 секунд) с помощью объекта Timer который считает время с момента своего запуска в миллисекундах.

Функция событий

События – несложный элемент, вносящий дополнительную сложность. Работа их осуществляется с помощью трех переменных. Первая(evnuse) отвечает за частоту событий, вторая(evn) за то случится оно или нет и третья(evnef) за эффект от этого события. Частота изменяться со временем, в первые тридцать дней события не происходят вовсе, с тридцатого дня событие случается в трех из сорока случаях, с сотого в трех из пятнадцати случаях, и со сто-сорокового в трех из пяти случаях. Эффект от события как правило негативный, однако есть три события полезных игроку, одно из них дает деньги, другое дерево, третье металл. Остальные события носят отрицательный эффект. Их можно разделить на три категории – частично или полностью забирающие ресурсы и мебель со склада, отнимающие деньги, и не дающие совершать действия частично, полностью, или полностью на несколько дней.

Функция внутриигрового времени

Центровая часть всей игры, за счет которой и возможно ее прохождение и существование, всех описанных выше механик. Эта функция отвечает за восстановление бонусов и шкалы действий, переопределение цен, работу событий, а также определение победы или поражения и проверку активности бонусов. Основным инструментом опять-таки является if. При проверке на победу или поражение проверяется количество дней и денег у игрока. Если по нажатию кнопки завершения дня денег будет ноль или меньше, то игра автоматически закроется. То же самое произойдет если по достижении сто пятьдесят первого дня денег у игрока будет меньше семисот тысяч. Игра может продолжаться и после сто пятидесятого дня, однако планка в семьсот тысяч останется, и если после этого игрок уронит показатель денег ниже этого значения то проиграет. По каждому нажатию кнопки завершения дня на единицу уменьшаются показатели длительности и перезарядки бонусов и тут же происходит переопределение при необходимости значений на которые эти бонусы влияют. Эта же функция отвечает за расчет стоимости содержания которая зависит от того сколько материалов и товара хранится на складе игрока, на сколько у него улучшен цех и электрооборудование. Это значение обнуляется после выполнения вычитания его из денег для корректной работы.

Оптимизация

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

Заключение

Выполняя данный проект, я смог создать экономическую стратегию “Фабрика”, следовательно, цель была достигнута. В ходе создания этой игры я неплохо отточил и в чем-то даже улучшил свои навыки программирования на Паскале в среде Lazarus. Получившаяся в итоге игра имеет некоторые недостатки главными из которых являются отсутствие какого-бы то ни было обучения, из-за чего новому игроку придется изучать все элементы методом пробы, а также отсутствие возможности сохранять игровой процесс. К плюсам можно отнести малый вес программы, а также минимальные системные требования. Сложность возрастает равномерно, давая игроку достаточно времени чтобы освоится с интерфейсом и изучить основные элементы. Отсюда можно сделать вывод, что она программе есть куда развиваться, однако уже сейчас находится в полностью работоспособном состоянии.

Список источников

Алгол. [Электронный ресурс]. – Режим доступа: URL: https://ru.wikipedia.org/wiki/Алгол

История языка Паскаль. [Электронный ресурс]. – Режим доступа: URL: https://kvodo.ru/istoriya-yazyka-paskal.html

Паскаль, Блез. [Электронный ресурс]. – Режим доступа: URL: https://ru.wikipedia.org/wiki/Паскаль

Lazarus. [Электронный ресурс]. – Режим доступа: URL: https://ru.wikipedia.org/wiki/Lazarus

Total Commander [Электронный ресурс]. – Режим доступа: URL: https://ru.wikipedia.org/wiki/Total_Commander

Приложение

Ссылка на созданный программный продукт (архив)

https://drive.google.com/file/d/1EQ_mEbi-UklFUBZpp-1zx6zz3C0L-ecd/view?usp=sharing

Просмотров работы: 39