Бегущий по лезвию тяпки

  • ↓
  • ↑
  • ⇑
 
Записи с темой: питон (список заголовков)
11:50 

область видимости

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Наконец сделал область видимости, так что при брожении по уровню не видно за угол и сквозь стену. "Удешевить" вычисление без странных результатов не получается, так что тупо считаю видимость для каждой координаты в радиусе зрения за вычетом тех, что не связаны с никаким тайлом.
Нашёл труд на тему выживания на дикой природе. Теперь надо собраться с мыслями и придумать "масштаб" пространства, времени и стат персонажа, чтобы это как-то напоминало реальность.

@темы: Питон

11:56 

и тормознули крутейший пентиум

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Историческое событие - мой "рогалик" наконец тормозит мой комп.
Это я применил самодельный алгоритм поля видимости (FOV который обзывают), который, внезапно :) работает не правильно, и между ходами теперь ощутимая задержка.


Как там зовутся инструменты замеряющие время исполнения процедур? Профилеры?

upd: А нет, пока не тормознул. Это я не в тот цикл вычисление поля занёс, и оно вычислялось для каждой клетки как для всех.

@темы: Питон

14:57 

Перестройка

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Переписал генерацию уровня так, чтобы все опции передавались именованным кортежем, в котором первым пунктом идёт строка с типом уровня. Разделил класс Уровень на два класса: ФабрикаУровня, конечным продуктом деятельности которой является объект типа Уровень, которому "отписал" все методы, ответсвенные за житие персонажей.
Уровень на посмотреть получаю так:


И на выходе такого кода получаю:
Generation time 0.38181447982788086, level size 32, factory size 32

Чего-то я не знаю про метод __sizeof__ или пока что разница между объёмами данных невелика. Ну, даже если я зря делил Уровень на Фабрику и собственно Уровень, остаётся задание опций кортежем.

@темы: Питон

11:20 

самоуровнекопание

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Пока писал генератор уровня пропустил, что при использовании сгенерированный уровень не будет нуждаться в методах, которые его создавали. Вот тут нашёл простой ответ - разделение уровня и генератора уровня. Снова оказываюсь в положении человека впервые вышедшего интернет - мозги разбегаются. Сейчас у меня реализован всего один тип уровня (зову его "соляные шахты"). Писать на каждый тип уровня генератор - значит на каждый тип нужен свой набор аргументов? Тогда вызов генератора будет напоминать рецепт соуса из 40 ингредиентов.
Вариант: придумать сейчас ещё 2-3 типа уровней, которые генерировались бы схожими по сути параметрами (средний размер комнаты и форма, направления и ветвистость коридоров?), чтобы задавать их и тип уровня строковым параметром.
Или передавать тип уровня классам, которые генерируют комнаты и коридоры...хотя тогда уровни будут по сути одним и тем же.
Сейчас "соляные шахты" это рандомные залы из которых идут ветвящиеся коридоры. Когда коридор встречается с другим коридором и залой он прекращается. Во избежание бесконечной генерации у "шахтёров" есть параметр "выносливость", со времением убывающий. Если устал, так никуда и недокопавшись, то прекращается всё равно. Так получаются развилки и тупики. То есть уровень задуман как нечто, прокопанное наугад и впоследствии брошенное. Не забыть: сделать список финишей тупиков и спавнить там впоследствии мобов.

Для генерации чего-то, что не было построено наугад такой способ не подходит. Значит "шахтёров" надо заменить или, чтоб не плодить сущности, добавить им возможность идти к намеченой цели?
Или для "неслучайных" уровней все коридоры будет делать один-единственный "шахтёр" другого типа, который никогда не ветвится наугад.

Когда я всё это буду делать.

@темы: Размышлизмы, Питон

21:51 

про генерёж уровня

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Взялся помечтать как я буду уровни другого типа генерить и заподозрил, что в нынешнем способе кроется принципиальный изъян. Сейчас при создании объекта типа "уровень" из инициализации вызываются методы, которые при использовании уровня в дальнейшем более не применяются, а конечным продуктом является несколько словарей с координатами и типами клеток. Методы, которые создают "землекопов" для ветвящихся тоннелей и которые их же потом останавливают после создания уровня больше не вызываются.
Может быть стоит накатать одну большую функцию, которая будет в зависимости от введённых параметров создавать уровень указанного типа. И так на каждый уровень по отдельной функции со своим букетом аргументов, потому как в уровне, который будет целиком из залов и ровных широких коридоров не будет нуждаться в коридорах змеящихся и одноклеточных.
С другой стороны, может быть и хорошо, что методы остаются: можно реализовать изменение уровня от долгого отсутствия персонажа - идёшь так знакомым уже коридором, а там внезапно развилка.
Как-то надо найти баланс между не стопорением на одном месте, пока в других ещё конь не валялся, и скачем галопом по европам, с оставлением в тылу множества недодуманного.

@темы: Питон, Размышлизмы

20:30 

it's alive!...at least it moves

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Наладил цикл работы игры с брожением по уровню по командам с нумпада. Перемещение в непроходимую клетку не принимается как правильная команда.

@темы: Питон

22:19 

Панорамы и перспективы

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Дописал просмотровщик уровней. Скроллит гладко и при убегании центра за пределы уровня выруливает "окно" с другой стороны, так что уровень скроллится как карта в "Цивилизации". Надо будет придумать уровень, который будет на самом "сшит" по одной или двум координатам. Но это не раньше чем можно будет побегать по простому уровню.

@темы: Шпаргалка, Питон

20:05 

curses try 2

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Предпринял вторую попытку отображения уровня в curses. Окошко 22х22 тайла со скроллом по нумпаду.
Следующий шаг: подцепить это окно к очереди событий (чтобы время на уровне шло) и посадить на клавиши скролла добавление события движения. Дошло наконец, что не надо было изобретать классы виджетов в курсесах, которые будут сканировать объект "уровень", а добавить в "уровень" метод, который выдавал бы список строк заданной длины с центром в указанных координатах.

ps Продолжаю наблюдать положительные отзывы по urwid. В виртуальном окружении через pip он установился, но перебегать на него пока не буду. Последнее что запомнилось из “Use curses... don’t swear”, что в urwid'е лучше работать всё же понимая как рабоатют curses, а я их благополочно забыл и учу заново. Кстати в curses с тех пор появился wrapper, который прячет инициализацию/деинициализацию под себя, так что можно писать сразу

@темы: Питон

23:50 

textland

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Дошли руки попробовать очередную альтерантиву стандартной curses под питоном. Нашлось после брожения по рогаликовскому форуму. Звать это textland. Ставил в vireualenv.



Дальше пока не ковырялся. Это вообще нормально, когда что-то не устанавливается потому что нет readme'шника?

@темы: Питон, Ссылки

11:33 

Мимо белого я, блока Луны

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Вчера начерно слепил в один ком очередь событий, уровень с поиском пути и искусственного идиота. Персонаж прошёл из точки А до точки Б, каждый шаг имел определённое время события и перерыв между действиями. Точка Б таки была достигнута, но наблюдаются временные парадоксы. Либо с системой, либо с моим пониманием heapq что-то требует доработки.
Но это всё равно checkpoint, хотя кроме меня, никому пока не видный.

@темы: Questlog, Питон

20:07 

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Внезапно - qt (точнее pyside) для третьего питона есть в репах к минту. Буду смотреть его helloworld'ы.

upd: И не менее внезапно: если ставить в систему pyside, то отваливается ipython3-qtconsole. Мутную сторону силы чую тут.

А вот народ задался ценным вопросом где брать доки по новым tkinter и питону.
stackoverflow.com/questions/6865792/fresh-tutor...

@темы: Наблюдения, Питон

17:54 

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Я опасался, что пока был отвлечён от питона на поиски работы и фриланс, проспал целую эпоху. Судя по докам на третий питон перешли только tkinter и qt. В pip видать много всякого, но чего-то куда не ткнись оно после запуска выдаёт еррор и затухает. Может оно конечно не в целом так, в а узкой интересной мне области. Вот кое-что правда нашлось интересное - cursgame. Может использую, может просто изучу.
Но в целом думаю стоит опробовать сделать то, что мне нужно на tkinter, чтоб меньше заниматься борьбой, больше строительством. Судя по скринам на tkinter продолжают писать что-то для широкой общественности, а то было озвучено мнение, что это рудимент из девяностых для квадратно-гнездовых гуёв.

@темы: Размышлизмы, Питон

13:23 

виртуальное

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Продолжаю копаться в питоне, добрался до виртуальных окружений и pip, благо последний нынче родной питонский инструмент согласно pep. Правда качать всё равно пришлось, а команда pyvenv как ни странно не пожелала работать согласно сохранённого урока. После установки скрипта get-pip.py и установки virtualenv всё заработало почти так, как я и подозревал.
читать дальше
upd:
Разница в том, что если запусать pip install через sudo, то всё устанавливается в системную версию.

Смотрю виртуальность не такая полная и непрошибаемоая, как можно заподозрить из некоторых мануалов. Вот и критика есть habrahabr.ru/post/206024/
Тем не менее хорошо, что я наконец добрался до pip.

@темы: Питон

17:54 

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
С одной стороны curses для рогалика это классика, с другой стороны питонские курсес идут только под линуксом, и лично у меня любят вываливаться. С другой стороны отладка начинает жать мне мозг, т.к. не всегдя ясно глючит "графика" или алгоритмы. При том, что я естессна разделяю классы объектов механики игры и классы виджетов...
Может сделать "графику" на tkinter. Он идёт везде, на лейблы можно поставить отображение переменных, а вся отладка будет принтоваться в консоль. Подобие tty сделать на ткинтерской canvas?

@темы: Размышлизмы, Питон

17:33 

Искатель fb2

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Причинив себе питоническое усилие волшебный пендель, доделал скрипт для поиска fb2 по ключевым словам в заданной папке. По желанию можно копировать найденные файлы в отдельную папку и удалять неправильно форматированные файлы.
Работает через командную строку, задаётся ключевое слово (с ключём -k) и путь к папке (с ключём -p), если не указан то используется текущая папка.


Оставлю тут для кучи ссылку на описание формата fb2.
Мутное же это дело - парсинг xml. Может конечно что это я с непривычки, но вольности позволенные в формате меня бесили.

@темы: Шпаргалка, Питон

13:42 

Восприятие

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Думаю над механикой своей будущей игрушки-рогалика. Если у меня будет три параметра на восприятие т.е. зрение, слух и обоняние не усложнит ли это как реализацию, так и саму игру. Что если сделать всего один единственный параметр "Восприятие" и по случаю разглядывания, выслушивания и разнюхивания применять расовые/классовые бонусы в каждом конкретном случае. Пожалуй это будет логично, т.е. если кто-то по прошествии тренировок стал "телом крепок", то все три физических параметра поползут вверх, но общий баланс останется не искажённым. С другой стороны если персонаж заработает по ходу приключения глухоту, то просто на это время множитель слуха = 0.

@темы: Питон, Игрища, Размышлизмы

19:25 

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
sqlite3 и xml деревья кипятят мой мозг

@темы: Питон

20:08 

очередь событий

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Добился работы очереди событий без того, чтобы обрабатываемое событие разрешалось "никаким" результатом. Наплодил по ходу пьесы тучу классов. Надо определяться с следующим куском мозаики. У меня есть уровень, по которому пока некому ходить, схематичный сферический персонаж в вакууме и очередь событий. Вероятно стоит додумать как организовывать параметры персонажа и как увязать пространство и время.

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

@темы: Питон

17:25 

lock Доступ к записи ограничен

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Закрытая запись, не предназначенная для публичного просмотра

URL
16:52 

Как ходы записаны?

Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Ход времени замедлился.
И это было невозможно.


К.Саймак, "Что может быть проще времени"


Думаю как организовать время в игре. Почитал всякие треды и доки про priority queue и прочее.
Предположим есть действующие персонажи, которые делают заявки на действия. Очередность действий определяется неким приоритетом, который игромеханически связан с их параметрами. Действия с приоритетом и собственно заявкой отправляются в очередь, откуда по мере набегания уходят на обработку. Неясный вопрос - где тут ход. Может волевым усилием сделать ход длящимся, скажем 200 у.е. в которых исчисляется приоритет, и всех, кто у не успел отправлять в очередь на следующий ход? Если я буду продолжительность хода ставить в зависимость всех "желающих высказаться", не получится ли, что время течёт в зависимости от этого количества?
В тредах умные люди спорят как из очереди события удалять, если автора того события перебили. Вероятно я чего не понимаю, потому пока завёл булевскую переменную, от значения которой зависит выполнять ли заявку, когда до неё дошла очередь. А то вдруг автора не только перебили, но и поправить успели :)

@темы: Размышлизмы, Питон

главная