Напишу что-нибудь, пожалуй. Раз уж настроение нет никакого - то унылость цедить будет ещё более скучно. Так что в напишу движок для своей супер-мега RPG из своей мечты. Разумеется, движок можно будет использовать как для убийцы всех существующих ММО, так и для рогалика-поделки-на-коленке. Масштабируемый. Практичный. Универсальный.
Имя для очередного сэндбокса придумать довольно сложно: DreamGame уже есть, а другое в голову не лезет. Пускай будет Solution.
Да, консольное приложение на F# (потом если выгорит переделаю во что-нибудь более удобоваримое "под винду"). Раз уж дневник могут читать все, то буду даже чего-нибудь объяснять по ходу, хотя пишу "для себя", и про программирование, и про функциональщину, и про философию, и
про т.д.
F# - (ЭфШарп или ФиШарп) - функциональный язык программирования, но пока не буду вдаваться в детали и изотерику (везде функции, данные - функции, мир - функция, и я - функция, и ты - функция). Программа - это функция (словарь синонимов рыдает, но тут уже технические подробности, без чётких терминов не обойтись), которая что-то вычисляет. А раз компьютеры - электронные и основанные на байтиках, то программа по сути вычисляет некое число. Хотя результат нам сейчас не столь важен - важен процесс, когда на экране очередной монстр захлёбывается собственной кровью. А программирование - это, по сути, конструирование процесса вычисления. Но, ближе к делу: ...
Ах да, есть ещё такие понятия как декларативность и иммутабельность - тоже интересные вещи, но если их (и всё, что из них следует и от них зависит) расписывать, то до самой мякотки можно и не добраться, хотя вещи и интересные. Если в кратце: "обычные" программы императивны и мутабельны, то есть если алгоритм писать человеческим языком, то получится как-то так "вот перегоревшая лампочка. выкручивай её. а вот новая лампочка. после этого бери её. а затем вкручиывай". Есть последовательность во времени, объекты меняются во время операций. В нашем же случае должно выглядеть как-то так: "Нам нужна закрученная лампочка в гнезде, где старая выкручена". Если повертеть фразы, в принципе, то же самое. Ладно, что-то я совсем в детсад ударился.
БОЛЬШЕ МЕДЛИТЬ БЫЛО НЕЛЬЗЯ!читать дальше
Это даже не каркас. #light - указывает на то, что используем упрощённую модель форматирования (то есть вместо begin end или какие там у них заменители используем отступы), module Game - название модуля (ну, раз пока только 1 модуль, то можно считать это просто названием программы), open System - подключение основной библиотеки .NET, а вот дальше уже интереснее. Console.ReadKey() - понятно, вызов штатной функции .NET (в языке есть и свои, но, во-первых, они мне не очень нравятся, а, во-вторых, не на секунду нельзя забывать о том, что мы пишем на богомерзком дотнете!). ignore - игнорирует результат функции, т.к. функция возвращает символ, а он не нужен (а программа, как ещё не успела стереться из памяти что-то считает, и этот символ будет ей мешать). Ну и стрелочка "<|" - хорошо бы было без неё и обойтись, но нельзя, в F# строгая типизация (хо-хо, уж это можно мусолить часами), и при автоматическом типовыведении вывод типа происходить не слева направо, а справа налево. Ну и чёрт с ним.
Теперь немного философии и гениальных орхитектурных решений... что есть мир... что представляет из себя вселенная... кто я.... на этом месте, в принципе можно было бы остановиться и пойти дунуть или, по меньшей мере проставить ещё много-много-многоточий, но в практическо-прагматическом эмм... мире кодинга нужно рано или поздно принимать волевые решения (взвесить, и выбрать то, где минусы наименее ужасны).
И было слово: Игровая "Вселенная" в каждый момент "Времени" будет находиться и одном из "Состояний". И будет отображение, то есть функция, которая из одного состояния создаёт второе. "АЧтоДальше?" - хорошее название для такой функции, но коллеги не поймут. Поэтому назовём её "processor". А самую-самую главную функцию отвечающую за течение "Времени" назовём "flow". "Время" не для красного типографического знака в кавычках - время игровой вселенной и время процессора - это разные вещи. Про "реальное" время так вообще молчу.
Ну вот, собственно, портативная вселенная объявлена (let) и будет крутиться в бесконечной рекурсии (rec). Ах да, первый агрумент flow - функция, так можно. И нужно. То есть функция, которя работает по-разному в зависимости от другой функции которую в неё передали (кто там хотел полиморфизм?)
Раз программа создаётся не для идеальных миров надо добавить где-нибудь остановку, если главный герой сдохнет/выиграет или просто игроку надоест. Логично добавить ещё одну функцию как параметр, которая будет останавливать процесс, назовём её climax. Например, если герой умер, то она возвращает true.
match - это такой case, только в нём ещё можно всякие трюки делать. пока не будем.
Ну вот, собственно и всё! Движок готов.
Дело за малым - создать нужные нам функции processor и climax и обернуть в какой-нибудь дружелюбный интерфейс.
"Э? А как же вывод на экран? А ввод действий игрока?" Ответ прост - это должны быль сайд-эффекты функции processor.
Proof of concept:
То есть новое состояние - то же, что и старое, но оно так же выводится в консоль.
Добавим ещё две функции: для ввода и тиканья часов (в данном случае состоянием будет считаться число-время), и соединим оператором ">>" в данные потекут из одной функцию в другую как вода по трубам. Да, результат этой операции - композиция функций.
Надо бы патент оформить.