Страница 3 из 8

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

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

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

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

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

Добавлено: 02 янв 2015, 10:15
Jolly Roger
Имхо, это лучше решать отплясывая от сериализации.
Как будет осущетсвляться сохранение, так и нужно делать переход

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 05 янв 2015, 10:51
Феникc
Вот такой код:
Скрытый текст: ПОКАЗАТЬ

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

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.
Отсюда видно что множественные ссылки на один объект обрабатываются корректно.

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

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

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

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