Я уже не раз писал про curses, но зачем вообще мне понадобилась эта библиотека? Для нетерпеливых сразу ссылка:
github.com/zHz00/KGBCЯ играю в
Kittens Game, там у меня цивилизация котят, у них разные фабрики-заводы-газеты-параходы, и всё это надо строить. При этом следующая постройка стоит на 15% больше предыдущей. А иногда не на 15%. Есть ещё один нюанс: некоторые ресурсы, из которых собирают постройки, имеют "ёмкость". Допустим, уран имеет ёмкость 10000. Если следующий ускоритель стоит 11000, то хоть ты тресни, ты его не построишь, потому что не сможешь накопить 11000 урана. Сначала надо поднять ёмкость урана на 1000, для чего надо построить новый реактор. Он не требует урана, но он требует титана. И стоит на 15% больше предыдущего реактора. Есть ли у меня достаточная ёмкость титана, чтобы построить следующий реактор? Вопрос.
(читать дальше)
Передо мной постоянно возникало две задачи:
1. Узнать, сколько ещё я могу собрать зданий заданного типа до тех пор, пока не упрусь в предел ёмкости по какому-нибудь ресурсу. А постройки обычно строятся не из одного ресурса, а из нескольких, поэтому упереться я могу в один ресурс, а могу в другой. В процессе игры блокирующий ресурс может меняться.
2. Узнать, сколько всего мне понадобится ресурсов, чтобы собрать все здания от текущего до последнего. Если не хватает, то сколько я могу собрать зданий с текущими ресурсами?
Сначала я использовал эксель. Но каждый раз делать таблицу под новую постройку утомительно. Сделать же таблицы под все постройки -- это долго, потому что построек несколько десятков.
Мне пришла идея сделать универсальную программу, которая считает все эти постройки и выдаёт мне то, что надо. Вопрос был -- на чём это написать? Конечно, на питоне. Но на питоне можно написать по-разному.
-- Графическое приложение на wxWidgets (нужно учить wxWidgets)
-- Текстовое приложение на curses (нужно учить curses)
-- Веб приложение на flask+AJAX (нужно разбираться с какими-то веб-технологиями)
Ну и я выбрал текстовое приложение на curses. Было ли это ошибкой? Не знаю. Знакомые веб-программисты топили за веб-вариант. По понятным причинам. Но я далёк от веба. И не хочу к нему приближаться.
Так или иначе, приблуду я сделал, и постоянно ей пользуюсь. Показываю приблуду и вам.
Итак, первое, что у меня есть -- это защита от спойлеров:
При каждом старте вам будет выдаваться предупреждение о том, что программу надо выключить. Чтобы его закрыть, надо нажать F4, а не что-нибудь ещё. Предупреждение можно отключить, и это запоминается, но чтобы его отключить, надо нажать F7. Надо было сделать, чтобы программа закрывалась при нажатии любой клавиши, кроме F4 и F7, но это было бы слишком злобно.
Далее отображается список построек. Я замазал большинство из них, чтобы не было спойлеров больше, чем на несколько часов игры (если вы запустите программу, то, конечно, там ничего замазано не будет):
Как видно, в программе есть несколько вкладок с постройками, и тут видна только первая. Это, конечно, замороченная система, когда надо нажимать буквы с контролом или альтом, чтобы выбрать постройку. Но вообще-то работает мышка (и на практике я пользуюсь только ей).
В игре есть развитая система скидок, поэтому увеличение стоимости следующей постройки может быть не 15%, а значительно меньше. Но эти скидки могут распространяться только на конкретную постройку или на группу построек. Для того, чтобы назначить скидки, надо выбрать вкладку Workshop. Тут, конечно, тоже всё замазано:
Скидки сохраняются в настроечном файле, поэтому их не надо выставлять каждый раз.
Ну ладно, кликнули мы по постройке или нажали клавишу, дальше что? Дальше -- таблица. Вот пример:
Таблицу можно вращать в обе стороны с тремя разными скоростями. И вращать её можно до самых 1.7e+308, потом будете видеть только inf и overflow. В верхней строке будет отображаться информация о включённых скидках. Тут, например, мы имеем скидку 1% к основанию показательной функции.
Чтобы посчитать общее число ресурсов, нужно выделить несколько построек. Для этого используется система, похожая на выделение нортон коммандера. Есть вторая система, использующая квадратные скобки. Их можно комбинировать. После выделения в нижней строке увидим сумму:
После того, как я написал эту программу, играть стало значительно приятнее. Есть и минусы. В KG некоторые ресурсы первичные, а некоторые производные. Моя программа не показывает пересчёт производных ресурсов в первичные. Сделать такую функцию не так-то просто! Дело в том, что преобразование идёт с определённым коэффициентом, и для различных производных ресурсов коэффициент тоже получается различным, зависящим от нескольких факторов. Может быть, сделаю это в будущем.
Программа тестирована на python 3.8 (windows 7 x64, windows 8 x32) а также на python 3.11 (Debian 12, MX Linux 23.4).
Для скачивания и ознакомления следует пройти на гитхаб: github.com/zHz00/KGBC
P.S. А ещё я составил детальное описание того, как работает каждая скидка. Я не уверен, что программой воспользуется хотя бы один человек, кроме меня, а уж справку вообще никто не прочтёт. И тем не менее, я это сделал.