Форум сайта python.su
Добрый день!
Я новичок, заканчиваю курсы питона. Пора начинать писать курсовую работу, моя тема написать мини игру симулятор подводной лодки.
Никакой графики, как можно было бы подумать из названия темы, (ну может быть потом допишу на PyQt) весь игровой процесс будет проходить в консоли в диалоговом режиме, как старые адвентюрные игры с локациями - запрос - ответ. Только текст.
Вопрос в том, что у меня будут не локации, а огромное пространство моря с неровным рельефом дна и береговой линии. Не хотелось бы изобретать велосипед, но я совершенно не знаю, как описать такую карту и как в ней перемещаться?
Хранить данные буду в SQLite3
Ещё раз кратко - нужно описать трехмерную карту но не нужно её отрисовывать, только перемещаться в ней по осям y x z. 3д редакторами не владею, вся работа в питоне.
Офлайн
SchlangeНачинать надо с текстового файла, иначе все эти усложнения просто время заберут.
Хранить данные буду в SQLite3
SchlangeПо-моему, это называет “карта высот”. Просто у тебя таблица из байтов, где в каждом высота дна в виде числа. А что там плавает ещё, должно храниться в другой таблице. И получается, что ты в этих таблицах узнаёшь, можешь ли ты проплыть, что там плавает в такой-то точке и ещё что-нибудь. Так ты можешь не утежелять карту всевозможными объектами, а просто собирать точку карты с разных таблиц, подгружая их по мере надобности.
но я совершенно не знаю, как описать такую карту и как в ней перемещаться?
Отредактировано py.user.next (Апрель 10, 2017 09:52:42)
Офлайн
В данном случае скорее карта глубин) Например.
У меня нет навыков работы в 3д редакторе, поэтому ручками по старинке взял бумагу в клетку, нарисовал на ней форму берега и глубины в виде замкнутых фигур. Записал все координаты в файл csv: x,y,z, где координаты точек, а - z - глубина.
Логика:
если строка координат имеет глубину с положительным числом - то это форма берега или остров, отрицательная - глубина. уровень 0 - поверхность моря.
Полностью совпадающие начальная и конечная координаты - являют собой фигуру, отдельный полигон. контур моря, или углубления.
Совпадающие глубины (z координаты) - признак одной фигуры. Потом можно усложнить, но пока сделал так для визуального обнаружения в CSV файле разных полигонов.
Начал писать:
import csv filename = 'sea.csv' with open(filename, newline='') as f: reader = csv.reader(f) try: for row in reader: print(row) except csv.Error as e: sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))
Офлайн
Можно сделать двухмерный массив из float. Хранить можно высоты не в каждой точке, а скажем, через 10-100 и интерполировать.
Отредактировано PooH (Апрель 12, 2017 05:13:24)
Офлайн
SchlangeТебе надо описать морское дно математически. Для этого используются такие понятия как пространство, точка, кортеж объектов в точке. В такой-то точке пространства находится земля, в такой-то точке пространства находится вода, в такой-то точке пространства находится воздух, в такой-то точке пространства находится рыба. И дальше берётся дно и записывается в виде всех высот, которые у него есть. Таким образом ты потом для точки пространства сможешь определить, есть ли в ней земля. Твоя лодка находится в какой-то точке пространства, а рядом с этой точкой есть соседние точки, для каждой из которых можно всё определить. Плавание лодки - это перемещение из точки в точку. А перемещение из точки в точку - это изменение текущих координат точки в пространстве. (У тебя где-то всё время записано, что у такой-то точки в её кортеже объектов есть лодка.)
В данном случае скорее карта глубин) Например.
SchlangeПоэтому надо всё делать на очень маленькой карте, иначе на большую карту всё время разработки тратишь, а потом действий никаких на ней сделать не можешь. Надо сначала механику лодки (персонажа игры) разработать, а потом уже к ней карты подключать любые.
И тут понял, что не знаю что дальше делать))
Отредактировано py.user.next (Апрель 12, 2017 06:15:38)
Офлайн
PooH
Можно сделать двухмерный массив из float. Хранить можно высоты не в каждой точке, а скажем, через 10-100 и интерполировать.
py.user.next
Тебе надо описать морское дно математически.
Поэтому надо всё делать на очень маленькой карте, иначе на большую карту всё время разработки тратишь, а потом действий никаких на ней сделать не можешь. Надо сначала механику лодки (персонажа игры) разработать, а потом уже к ней карты подключать любые.
Офлайн
SchlangeЭто вот, например, у тебя лодка плывёт прямо (задано проплыть 10 точек по прямой) а там есть прямая скала под углом (поверхность скалы - это отрезок, состоящий из точек). Как узнать, пересекаются ли отрезки (отрезок пути лодки и отрезок поверхности скалы)? Вот алгоритм для определения, пересекаются ли отрезки, строится на векторном произведении.
и как реализовать проверку интерполяции (врезание в скалу например)
SchlangeЗначит, будешь просто плавать, как в тетрисе, без каких-то умностей. Там математики нет, просто всё время проверяются соседние клетки. Но и всё это будет работать медленно, потому что нужно будет все клетки перебирать, пока не выяснится, есть ли там пересечение с какой-нибудь из десяти скал.
В математике не силён.
Отредактировано py.user.next (Апрель 12, 2017 11:35:09)
Офлайн
SchlangeНу я так понял, нужно хранить карту высот. Тут проще всего для твоей задачи будет использовать равномерную сетку. Делаешь двухмерный массив arr, значение
PooH
Можно сделать двухмерный массив из float. Хранить можно высоты не в каждой точке, а скажем, через 10-100 и интерполировать.
У меня уже есть карта, там три значения xyz на точку пространства. Что такое интерполяция прочитал в вики. Ура, теперь я знаю это слово. По ссылке не осилил.
arr[x][y]
Отредактировано PooH (Апрель 13, 2017 05:10:24)
Офлайн
SchlangeНадо сделать карту высот, потом надо сделать множество точек пространства и потом просто сделать лодку с методами перемещения (испольнитель “лодка”).
У меня уже есть карта
Офлайн
Почти реализовал сам корабль, осталась физика.
https://github.com/hikikomori4/sensuikan
Задача: генерировать дифферент на нос или корму в зависимости от изменения центра тяжести.
Есть
uboat.c_differ –тут ранится число дифферента. положительно - на нос, отрицательное - на корму, нулевое - ровный киль.
Есть две балластные цистерны по краям,
uboat.tanks
uboat.tanks
они будут влиять на дифф.
Как в зависимости от их неравномерного заполнения плавно менять дифф на определённый градус?
Офлайн