Ещё один проект рогалика на Python:заметки, вопросы, идеи

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Oreyn » 01 янв 2015, 13:04

Первое примерно так и собираюсь сделать, только нужно поаккуратней записать, как именно хранить мобов и предметы. Я бы предпочёл в двумерном словаре, но тогда теряется возможность быстрого получения списка всех плейсхолдеров (с другой стороны, она не нужна).
Я пришел к выводу, что это вопрос реализации касается сугубо карты, и знать о ней должна только она. В итоге она хранит и двумерный массив структур тайлов с итемами и мобами, чтобы быстро ответить на вопрос "есть ли в этом тайле моб/итем?" и выдать на него ссылку, также как и просто перечень-словарь всех мобов/итемов на карте, чтобы можно было быстро перебрать их для поиска по определенному критерию (вместо того чтобы перебирать весь двумерный массив размерностью в карту). Поддерживать в актуальном состоянии эти словари задача сугубо карты, остальные объекты знать не знают про эти тонкости, и откажись я от словаря, никто и не заметит и не будет нуждаться в переделке.
Чем будет хорошо это разделение? Если сделать просто функцию turn, делающую ход на основе окружения моба и его состояния, вызывающую более примитивные функции
Выгода больше в организации кода. Работать, конечно, будет и так. И изначально я все и тулил в моба и вызывал функцию turn. И когда уже объект до невменяемости оброс функциями как низкоуроневыми так и высокоуровневыми (плюс еще унаследованные функции отображения, у меня там анимация и тайловая графика), с мясом разделял эту кучу на разные объекты. Субъективно мне стало проще ориентироваться и разделять - что касается тушки моба, и что касается мозгов моба. Опять таки тушка инкапсулирует в себе методы и данные самого моба (параметры, эквип). Разделяя тушку и мозги моба я поймал пару багов с эквипом и релоадом оружия, которые в высокоуровневых функциях дублировали функционал низкоуровневых и шли в обход стандартных функций с проверками и прочим. Которые были сделаны, конечно, по моей невнимательности и той сложности вороха разноуровневых функций в который превращался год-обжект моб.

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 02 янв 2015, 09:18

Сейчас делаю класс Уровень, и возникла небольшая проблема. Как правильнее делать переходы между уровнями? Понятно, что это будут тоже плейсхолдеры, но на какой стадии их ставить в карту? На этапе генерации ещё не существует словаря всех объектов на карте, но уже при генерации карты стоит предусмотреть входы и выходы.
Вариант решения пока такой: на этапе генерации в некоторые клетки ставить указатели на будущие порталы, потом превращать все карты в уровни и специально генерировать все порталы. Указатели на порталы делать отдельной переменной, а не запихивать к ландшафту, иначе придётся заниматься изменением ландшафта после его генерации, что нехорошо.

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Jolly Roger » 02 янв 2015, 10:15

Имхо, это лучше решать отплясывая от сериализации.
Как будет осущетсвляться сохранение, так и нужно делать переход
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 02 янв 2015, 10:42

Вопрос не в том, как именно делать и хранить порталы — я уже решил, что они будут вместе с монстрами и предметами. Вопрос в том, как правильнее генерировать карту, так как есть объект Карта, в котором происходит расстановка стен и прочего, и есть объект Уровень, строящийся по объекту типа Карта, и в Уровне есть уже сгенерированная карта и хранятся указатели на монстры, порталы, предметы. И понятно, что хорошо бы делать порталы ещё в объекте Карта, но там нет нормального для них места. Значит, их нужно добавлять уже в объект Уровень, но тогда нужно как-то передать туда места, на которых они будут стоять.
Проблему уже решил.

Сейчас рад понимать, что уже сделана карта, и нужно делать "собачку".

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 02 янв 2015, 22:38

С помощью чего лучше делать озвучку и графику? Графика будет достаточно простой, по типу эффектов похожа на brogue, плюс разные геометрические фигуры. Звук хочется делать посложнее, чем проигрыш звуковых файлов в нужный момент.
Начинаю думать об игровой механике, есть много красивых фич, на которых можно основать игру, но связать их во что-то путное тяжело.
Кстати, на каких масштабах питон начинает тормозить (сколько юнитов)? У меня количество управляемых ботов не будет превышать разумные количества вроде 1000, но я применяю не самые эффективные структуры данных. Впрочем, ботам будет всё равно, они же не будут копировать мои карты себе в память.

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 03 янв 2015, 10:38

Уже приходится писать какую-то игровую механику, часть уже написана.
При большом желании можно будет потом реализовать какую-нибудь GURPS или DnD подобную систему, лучше первое (более гибка, на мой взгляд), но сейчас ставлю заглушки.
Сейчас чувствую себя на каком-то распутье. Хочется, чтобы уровни были разными и имели оригинальных монстров, хочется прикрутить свои фичи, хочется добавить оригинальную систему магии, хочется графику и музыку, хочется ещё многого… но неясно, с чего начинать.

Уровни буду стараться делать как можно более индивидуальными, несмотря на то, что они будут генерироваться. Сделаю пока первые два уровня с простыми монстрами, а потом посмотрим. Прототип игры будет сильно отличаться от желаемого конечного результата и сильно походить на любой другой рогалик той же стадии разработки.

Из идей для игровой механики: транспорт; движущиеся ячейки; вообще меняющаяся карта; командный ИИ; что-нибудь с лавой; размножение монстров; конъюгация монстров; циклический метаморфоз монстров; интересное описание каждого монстра; прибор, создающий монстра по чертежам игрока (миниигра);

От первоначальной идеи при виде этих фич хочется немного отойти, но совсем немного, и это не помешает, как я думаю.

Да, тот код что у меня сейчас пока ещё ни разу был запущен — на машине отсутствует нормальная версия python, а с онлайн интерпретаторами возиться пока лень. Не к добру это. На тестирование потом нужно будет специально выделить один-два дня.

Зато теперь я бэкаплюсь :mrgreen:

Аватара пользователя
Cfyz
Сообщения: 758
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Cfyz » 03 янв 2015, 19:59

Tookser писал(а):С помощью чего лучше делать озвучку и графику? Графика будет достаточно простой, по типу эффектов похожа на brogue, плюс разные геометрические фигуры.
Касаемо графики, если подходят Windows/Linux, то взгляни на BearLibTerminal.
Cfyz теперь - наглая морда.

Аватара пользователя
Apromix
Мастер
Сообщения: 1087
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Apromix » 04 янв 2015, 09:52

Tookser писал(а):Да, тот код что у меня сейчас пока ещё ни разу был запущен — на машине отсутствует нормальная версия python, а с онлайн интерпретаторами возиться пока лень. Не к добру это. На тестирование потом нужно будет специально выделить один-два дня.
С тестированием мы все быстренько поможем :)
Изображение Изображение

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 04 янв 2015, 10:18

Apromix писал(а):
Tookser писал(а):Да, тот код что у меня сейчас пока ещё ни разу был запущен — на машине отсутствует нормальная версия python, а с онлайн интерпретаторами возиться пока лень. Не к добру это. На тестирование потом нужно будет специально выделить один-два дня.
С тестированием мы все быстренько поможем :)
Это да :)

Сейчас думаю над тем, что не знаю ООП так, как хотел бы этого, не программирую и занимаюсь другими делами. Боюсь, что напишу что-то ужасное, что придётся потом исправлять долго и мучительно.

Кстати, я ведь правильно понимаю, что могу брать и сериализовать любые объекты с помощью стандартных питоновских средств, pickle, кажется (даже если я изменял методы объекта)? Прочитал про такую возможность, но пока не совсем понимаю, как оно будет работать на произвольных объектах.

Думаю, разработка будет идти очень медленно в течение января, так как времени сейчас не хватает.

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Феникc » 04 янв 2015, 18:03

Сериализовать можешь точно, единственное что нужно разобраться с тем, как не сохранить вместе с одним объектом ещё сотню повязанных с ним ссылками. Тут надо копать в сторону вик рефов; лично я с этим ещё не сталкивался, хотя пиклом, конечно, пользовался.
Все методы объекта сохраняются тривиально, достаточно помнить что функция в питоне (да и в любом скриптовом языке) - тоже объект и, соответственно, нет практически никакой разницы между переменной ClassA.a и функцией ClassA.a().
Всё вышесказанное - ИМХО, если не указано обратное.

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 05 янв 2015, 02:30

Феникc писал(а):Сериализовать можешь точно, единственное что нужно разобраться с тем, как не сохранить вместе с одним объектом ещё сотню повязанных с ним ссылками. Тут надо копать в сторону вик рефов; лично я с этим ещё не сталкивался, хотя пиклом, конечно, пользовался.
Все методы объекта сохраняются тривиально, достаточно помнить что функция в питоне (да и в любом скриптовом языке) - тоже объект и, соответственно, нет практически никакой разницы между переменной ClassA.a и функцией ClassA.a().
Меня больше волнует, что будет с ссылками на один и тот же объект. А как сохранить все объекты по разу — можно просто унаследовать их классы от класса типа Serialized, который будет показывать, сохранён объект или нет. А дальше аккуратно рекурсивно обойти всё, оптимизировав затраты времени на это.
Кстати, тот скриншот выше должен был быть смайликом ;)

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Феникc » 05 янв 2015, 10:38

Почему-то мне кажется что пикл предусматривает такой вариант. На самом деле, это очень легко проверить, просто создай три объекта, в двух из которых хранится ссылка на третий и сохрани их, а потом внимательно покури полученный файл. Хм...
Последний раз редактировалось Феникc 05 янв 2015, 10:52, всего редактировалось 1 раз.
Всё вышесказанное - ИМХО, если не указано обратное.

Аватара пользователя
Феникc
Сообщения: 679
Зарегистрирован: 27 ноя 2010, 15:01
Откуда: Челябинск

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Феникc » 05 янв 2015, 10:51

Вот такой код:
Скрытый текст: ПОКАЗАТЬ

Код: Выделить всё

class C:
	def __init__(self):
		self.rel = None
		self.rel1 = None
		self.data = None

a = C()
b = C()
c = C()

a.rel = b
a.rel1 = c
a.data = 'Its A!'

b.rel = a
b.data = 'Its B!'
c.rel = a
c.data = 'Its C!'

import pickle

with open('d.txt', 'w') as f:
	pickle.dump(c, f)
выдаёт вот такой результат:
Скрытый текст: ПОКАЗАТЬ

Код: Выделить всё

(i__main__
C
p0
(dp1
S'rel1'
p2
NsS'data'
p3
S'Its C!'
p4
sS'rel'
p5
(i__main__
C
p6
(dp7
g2
g0
sg3
S'Its A!'
p8
sg5
(i__main__
C
p9
(dp10
g2
Nsg3
S'Its B!'
p11
sg5
g6
sbsbsb.
Отсюда видно что множественные ссылки на один объект обрабатываются корректно.
Всё вышесказанное - ИМХО, если не указано обратное.

Аватара пользователя
scaven
Сообщения: 44
Зарегистрирован: 27 дек 2006, 17:14
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение scaven » 05 янв 2015, 12:08

Tookser писал(а): Сейчас думаю над тем, что не знаю ООП так, как хотел бы этого, не программирую и занимаюсь другими делами. Боюсь, что напишу что-то ужасное, что придётся потом исправлять долго и мучительно.
ООП не панацея ни разу. Лучше написать как можешь, понять что именно плохо и тормозит разработку и переписать, чем сделать неудобную раздутую композицию и потом мучаться с ней, потому что все было "правильно, по книжке написано".
Бояться не надо - исправлять придется в любом случае :). Лучше думать о том, как писать так, чтобы потом было легко небольшие кусочки переписывать.
Вот из более менее полезного https://ru.wikipedia.org/wiki/SOLID_(об ... мирование) , и то - особо глубоко вчитываться не стоит, просто основную идею ухватить.
d41d8cd98f00b204e9800998ecf8427e

Tookser
Сообщения: 144
Зарегистрирован: 08 апр 2010, 11:09
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 05 янв 2015, 15:56

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

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость