Chat:Ru/2020-10-16
magaiti: ну что, никто в гонки не играет, 2048 не пилит?
YurkovAS: это уже запилили, надо новое
YurkovAS: у эйлера была в новых еще игра sokoban - куда-то пропала, забанили походу.
YurkovAS: в мультиплеере много новых выходило, можно их порешать народом. жаль, что за них баллов мало начисляют
YurkovAS: из оптимизаций same game вышла 1-2 мес, в общем тоже понравилась. можно переписать на более быстрый алгоритм
magaiti: sokoban веселуха
magaiti: я пилю 2048, хочу побить топа
magaiti: исследую в оффлайне
magaiti: code of the rings не решал?
magaiti: оптимизацию старую
magaiti: а мультиплеер можно сабмитить?
YurkovAS: code of the rings - не понимаю правила игры
magaiti: вроде все просто там
YurkovAS: можно, нижние 5 рядов все от комьюнити
magaiti: 30 рун с буквами, за ход можно перейти влево-вправо, сменить булку на руне на соседнюю по алфавиту, или прочитать букву
magaiti: букву*
magaiti: не булку :)
magaiti: между A и Z еще пробел
magaiti: задача за минимальное число действий прочитать заданную фразу
magaiti: потом еще добавляются циклы
magaiti: но можно без них начать кодить
YurkovAS: спасибо. надо запрогать тогда
magaiti: у меня кривой алгоритм там, старый код, да еще и на перле
tutubalin: YurkovAS code of the rings - это упрощённый Brainfuck
YurkovAS: tutubalin спс. попытаюсь что-нибудь сделать. похоже там что-то нестандартное для меня, т.к. в топе много питона
wlesavo: YurkovAS там много хардкода, некоторые валидаторы люди руками решали
wlesavo: но если без экспертных правил можно сделать поиск, это достаточно интересно
magaiti: у меня какие-то эвристики на перле, 69 место
magaiti: думаю на с++ можно лучше выступить
magaiti: за 2 секунды то
magaiti: я не помню, кажется я не смог нормально последний тест сжать
magaiti: там много повторяющихся слов, но я по таймауту вылетал, из-за длины входной строки. вроде у меня квадратичный алгоритм
magaiti: поиска циклов
magaiti: я тут решил slidingpuzzle через A*
magaiti: а ща полез в codewars посмотреть, а там тоже решал такую, но каким-то ужасным костыльным способом
magaiti: первые 2 строчки жадным алгоритмом, а потом бфс
magaiti: там веселые задачки есть, типа оптимизирующий компилятор
magaiti: визуализации нет
magaiti: хм, интересно, в 2048 может тоже A* потестить
wlesavo: magaiti а ты кстати в ns играл? мне кажется тебе зайдет, там очень интересно тоже
magaiti: ns?
wlesavo: number shifting
amurushkin: ну бим серч и оценка это тоже близко к A*
magaiti: не совсем
magaiti: A* умеет возвращаться
amurushkin: ну просто он всю ширину хранит
magaiti: не всю, он дфсит по эвристике
magaiti: глубину хранит
magaiti: точнее хм
magaiti: там очередь с приоритетом
magaiti: но по сути дфс, т.к. идет в сторону увеличения эвристики, если возможно
magaiti: хм, а правда
magaiti: просто пихаем все в одну PQ, вынимаем решение с наибольшей эвристикой, запихиваем потомков
magaiti: за 30 секунд что-нибудь найдем
magaiti: хз как дубликаты отсекать, все не влезут в память
MadKnight: так, вот у нас есть класс Table
MadKnight: теперь мы хотим стол-раскладушку
MadKnight: как это в ООП сделать?
magaiti: class CollapsibleTable: public Table, public Collapsible
MadKnight: чё за collapsible ?
MadKnight: как он методы стола перегружает?
magaiti: раскладной
magaiti: добавляет методы сложить/разложить
MadKnight: как он вообще может стол модифицировать?
magaiti: зависит от того как класс задан
MadKnight: ему как минимум нужно иметь связь со столом
magaiti: если у нас в дизайн заложено что у стола форма постоянная, то придется новый класс делать
MadKnight: почему постоянная форма?
magaiti: Table и Collapsible это интерфейсы
MadKnight: т.е. ITable и ICollapse ?
magaiti: связь будет в реализации
magaiti: lf
magaiti: да
MadKnight: и т.е. CollapsibleTable весь код реализует?
MadKnight: хорошо, теперь мы хотим парящий в воздухе стол
magaiti: делегирует все что может
MadKnight: который не падает
MadKnight: и потом мы хотим парящий в воздухе раскладной стол
amurushkin: можно вообще шаблон билдер использовать с параметрами
MadKnight: а потом мы хотим меняющий цвет стол
magaiti: парящий в воздухе раскладной стол для игры в подводные пятимерные шахматы со сферическими конями в вязкой среде
MadKnight: как это всё соединить? amurushkin покажи
amurushkin: передаешь в конструктор тип стола и он там настраивает его параметры
MadKnight: всмысле
MadKnight: чё за тип стола
magaiti: флаги - какие свойства нужны
MadKnight: какой тип у парящего в воздухе раскладного меняющего цвет стола?
Uljahn: Automaton2000: пора мутить фабрику фабрик
Automaton2000: по крайней мере в варике можно было мапы строить(до сих пор) и много очень игр вышло по этим кастомкам
MadKnight: да вы чё творите вообще
magaiti: нужна мебельная фабрика
MadKnight: мы не можем хардкодить все возможные типы в базовом классе
MadKnight: ужас
amurushkin: ну бля есть у тебя поле gravity. если в конструкторе тип 1 то g=9 это падающий стол. если тип 2 то g=9 и уже парящий. и так далее
magaiti: она возвращает столы
MadKnight: парящий в воздухе - это наш личный кастомный тип стола
amurushkin: опечатался но смысл я думаю понятен
magaiti: мы не хардкодим, у нас реализация любая может быть
MadKnight: а стол - это класс библиотеки
magaiti: она скрыта за интерфейсаи
MadKnight: мебельная фабрика же будет в библиотеке
amurushkin: MadKnight: почитай шаблоны проектирования фабрика и билдер. какой то из них твой случай
MadKnight: а у нас кастомный тип стола
Uljahn: Automaton2000: чем отличается абстрактный класс от интерфейса?
Automaton2000: но я не знаю как это сделать
magaiti: у нас кастомный, и что
magaiti: стол без свистелок просто адаптер библиотечного
magaiti: парящий там имеет интерфейс для парения
MadKnight: ничё не понял
magaiti: а как разные приколюхи друг с другом взаимодействуют, в общем случае нельзя знать заранее
magaiti: шаблоны пректрования ккури
MadKnight: да я наш1ёл
MadKnight: там просто bool optionEnabled прописывают
MadKnight: под взаимодействие приколюх надо пилить отдельный код
magaiti: Uljahn абстрактный класс может иметь реализацию
magaiti: а интерфейс только объявления методов
MadKnight: фабрика - это вообще не related, а builder - это конструктор с bool optionX_enabled
MadKnight: кастомную фичу не добавить
amurushkin: тебе и нужно либо фабирка мебельную либо конструктор столов )))
MadKnight: ничего не подходит
MadKnight: хочу кастомный стол
MadKnight: свой личный
amurushkin: значит наследуй в новый класс. чего magaiti и начал
amurushkin: и там все методы какие должны вести себя по другому переопределяй
MadKnight: стандартные - для нубов
magaiti: у тебя уже есть отличный библиотечный стол
MadKnight: а как наследовать если мне надо парящий стол и цветной стол?
magaiti: начинаешь так class myTable { libraryTable t;}
MadKnight: class B {
A a = new A(); void foo() { a.foo();
MadKnight: ммм выглядит как dirty workaround
magaiti: это делегирование в чистом виде
magaiti: все четко
MadKnight: прям как игрвой цикл в ФП языках
MadKnight: твоё делегирование использовано в кач-ве workaround'a
MadKnight: прям как они используют рекурсию в кач-ве workaround'a в ФП
magaiti: ты можешь потом заменить библиотечный стол на свой, а код использующий твой класс не надо будет менять
magaiti: круто же
MadKnight: это называется прокси
magaiti: это сейчас прокси
Uljahn: может, тебе миксины нужны?
MadKnight: чё за миксины
magaiti: примеси
MadKnight: вечно не могу понять если Uljahn тролит или нет
MadKnight: постоянно кажется что троллит
MadKnight: мне нужен парящий стол с динамичной раскраской
MadKnight: что ещё нужно человеку?
Uljahn: чё сразу троллит-то :(
MadKnight: да с этим понятно
magaiti: хз, в с++ это через множественное наследование делается если не ошибаюсь
MadKnight: Uljahn но что делать если надо то что по ссылке, но для примесей, сделанных специально для Table ?
magaiti: смотри, у тебя есть объект physicalObject
magaiti: допустим
magaiti: он нужен для реализациипарения, свечения итд
magaiti: ты подключаешь интерфейсы парящий и светящийся,
MadKnight: ты не можешь унаследовать множество классов, которые все наследуются от одного и того же базового
magaiti: и добавляешь physicalObject
magaiti: в c++ есть виртуалльное наследование
magaiti: это во первых
magaiti: т.е. можно
magaiti: во вторых, интерфейсы не наследуются
magaiti: они отдельно
magaiti: точнее они используют методы physicalObject
MadKnight: у меня ващет GameWorld
magaiti: но н наследуются от него
magaiti: стол - не мир
MadKnight: и если в нём нету физики, то я не хочу чтобы можно было юзать physicalObject
magaiti: как твой стол будет парить без физики?
MadKnight: вот именно
MadKnight: в мире нет физики - нельзя создать парящий стол
MadKnight: парящий стол требует мир с физикой
magaiti: ну тогда подключаешь интрфейс Iпарящий, и реализуешь без физики, как тебе надо
amurushkin: тогда чего ты от нас хочешь то?
magaiti: ну нельзя так нельзя
amurushkin: как раз физика нужна для падающего. для парящего пойдет и без физики
MadKnight: как на этапе компиляции не позволять создавать парящий стол для мира без физики?
MadKnight: это именно physically парящий стол
magaiti: в мире без физики у стола не будет приватных методов для изменения графитации
magaiti: и грохнется компиляция
MadKnight: он не меняет гравитацию
magaiti: ну что=то он делает
magaiti: с физикой
MadKnight: у него двигатели которые его вверх толкают
amurushkin: MadKnight: почему ты выбрал UE4 а не Unity?
magaiti: значит не будет двигателей
MadKnight: это workaround
MadKnight: amurushkin лишь как пример
amurushkin: MadKnight: про движки я серьзено спросил
MadKnight: так я лишь как пример взял ue4
amurushkin: а вообще конечно это дичь но если наследовать столы от разных миров то и компилятор будет об этом знать
MadKnight: я же не решил что unity всё, плох
MadKnight: так мы не наследуем столы от разных миров лол
amurushkin: ну блин ты же на нем кодишь? почему именно на нем?
MadKnight: просто парящий стол подходит только для мира с физикой
Uljahn: можно наследовать методы от методов мира, если в мире не реализованы методы (изменения гравитации), то и стол не сможет наследовать, не?
MadKnight: так я и на ue4 и на юнити кодил
amurushkin: выбрал что нибудь одно?
MadKnight: ue4 более для тяжёлых ААА 3д игор
MadKnight: а юнити - для простеньких 2д игр
amurushkin: ну на юните полно 3д игр также
MadKnight: больше* подходит
MadKnight: видел какие 3д анимации персонажей делают в ue4 ?
MadKnight: научили персонажа бегать по кругу, смотря в одну сторону
amurushkin: нет не видел. а их разве не отдельно от движка делают?
MadKnight: чтобы ноги персонажа двигались реалистично
MadKnight: не, отдельно сделали только анимации бега в 4 стороны
amurushkin: впринципе я тебя услышал. подумаю еще куда присмотреться
MadKnight: а в движке персонаж может бегать в любые стороны, смотря всегда только вперёд
magaiti: это решается инверсной кинематикой, не?
MadKnight: как ты ноги персонажа заставишь передвигаться под движение?
MadKnight: https://youtu.be/1UOY-FMm-xo?t=3646
MadKnight: вот держите, посмотрите минуту
MadKnight: или даже 2
magaiti: инверсной кинематикой же
magaiti: в анимации задается полохение торса/таза
magaiti: за ноги ИК просчитывает
MadKnight: тут сложнее
magaiti: в юнити наверное дефолтная сосет, я хз
MadKnight: ИК не для этого
magaiti: но ее там можно прогать самому
MadKnight: так ты посмотри
magaiti: не вижу причин почему такое нельзя было бы сделать в юнити самому или взять готовое откуда-нить
MadKnight: а как бы ты такое в юнити сделал?
amurushkin: ну запрогать разве нельзя?
MadKnight: там достаточно advanced скрипты
amurushkin: можно вообще для головы отдельную модель и будет как танк вертеть ))
MadKnight: у меня от твоей идеи флешбеки из фильма Т-34
MadKnight: или, как его ещё называют - "токийский дрифт на танках"
Uljahn: по плавным траекториям красиво бегает, но интереснее посмотреть на анимации, если пад дёргать рандомно
MadKnight: или - "добрые но braindead немцы против коварных наших
MadKnight: "
MadKnight: добрые но braindead немцы getting rekt by russians that use cheats
MadKnight: Uljahn просто будет быстро переходить, но при этом ноги слетать не будут
MadKnight: Uljahn посмотри любой paragon gameplay, там люди постоянно влево/вправо спамят
magaiti: https://docs.unity3d.com/ru/2019.4/Manual/class-BlendTree.html
magaiti: думаю что вот этим можно
MadKnight: да всмысле
MadKnight: этого недостаточно
magaiti: ну делаем скажем 8 анимаций
magaiti: потом блендим на все углы
magaiti: бега
MadKnight: ага ага
Uljahn: Automaton2000: здравствуйте, это канал об аниме? как мне пропатчить жль под юнити?
Automaton2000: вот это я пока не дошел до стадии когда результат всегда одинаковый примерно :)
MadKnight: а потом у тебя на диагонали вперёд/влево ноги персонажа заблендятся так что будут сквозь друг друга проходить
MadKnight: знакомая тема
Uljahn: так надо фаззи-логику юзать
magaiti: это борда по линуксу? ччем заканчивается Евангелион?
Uljahn: гистерезис
magaiti: хз я персонажей не делал с серьезной физикой
magaiti: только пару аватаров для виар чата
MadKnight: как сблендить бег вперёд и назад?
magaiti: а зачем?
magaiti: куда ты собрался бежать ?
MadKnight: так надо задом вперёд бежать
magaiti: это бег назад и будет
MadKnight: ну а как сблендить?
magaiti: что с чем?
wlesavo: интересные у вас дискуссии конечно
MadKnight: если угол будет между бегом задом вперёд и бегом передом вперёд
magaiti: этобудет бег вбок
magaiti: или на месте
magaiti: на это отдельные анимации
MadKnight: там тоже либо задом вбок либо передом вбок
magaiti: бег задом вперед от бега передом назад отличается только углом камеры
MadKnight: ненене
MadKnight: передом вперёд*
MadKnight: и я про бок
magaiti: а ну да, положение таза еще
MadKnight: вот ты бежишь ровно влево
MadKnight: правую ногу ставишь за левой или впереди левой?
Uljahn: мне кажется, или в 2048 можно как-то изящнее applyMove сделать?
magaiti: значит надо еще несколько вариантов для разных положений таза
MadKnight: как ты их blend'ить будешь?
magaiti: а что там для applymove?
amurushkin: Uljahn: можно вообще предрасчитать наверное. но я тупо скопировал из рефери
magaiti: есть двумерный блендинг
magaiti: по одной оси таз по другой унаправление
MadKnight: что за ось такая - таз?
MadKnight: чему она будет равна?
magaiti: ось блендинга, угол поворота таза
MadKnight: всё равно
MadKnight: в один момент угол будет такой что ноги начнут ровно сквозь друг друга проходить
amurushkin: фиксируешь камеру выше пояса и посрать на ноги ))))
magaiti: или пальто
Uljahn: или делаешь FPS
MadKnight: ну вы мастера workaround'ов
MadKnight: не зря прогерами стали
MadKnight: не будем фиксить баги, будем скрывать их под пальто
magaiti: fps тру вариант
magaiti: не надо вообще анимаций
magaiti: жаль что только гг может быть от первого лица
MadKnight: ага, и другие персонажи вокруг тебя будут просто статик модельками
magaiti: просто более деревянными чем гг
MadKnight: мы вообще говорили что юнити тоже осилит такие крутые анимации
MadKnight: а теперь мы пришли к статик моделькам персонажей
magaiti: я на почку не буду спорить
magaiti: но думаю что может осилить
MadKnight: зачем на почку
magaiti: но придется приложить усилие
MadKnight: давай тебе объясню общую идею как в ue4 это работает
Uljahn: ))
MadKnight: и тогда ты скажешь как в юнити это запилить
magaiti: ну давай
amurushkin: а давайте лучше в 2048 всех порекаем :)
MadKnight: они делают не blend
Uljahn: хотел сделать applyMove сразу для всех рядов матрицы грида с помощью numpy, но надо мозг выворачивать, алгоритм из рефери не векторизуется в лоб
MadKnight: они поворачивают одну из 8 (на самом деле 4) анимаций бега
MadKnight: и вот когда она повернулась достаточно сильно, они blend'ом переходят в соседнюю анимацию
amurushkin: Uljahn: меня была идея построчно или по столбцам в зависимости от мува по лукап таблицам сделать
amurushkin: (16:07:52) MadKnight: они делают не blend (16:08:38) MadKnight: ... они blend'ом переходят в соседнюю анимацию
MadKnight: придираешьс
MadKnight: я
MadKnight: вместо blend(4 anims) -> rotate(currAnim, dAngle)
magaiti: это все в юнити должно быть
magaiti: таблица слияний слишком бльшая
magaiti: сделать можно ,но надо тестить, будет ли она быстрее
magaiti: чем вычисление
magaiti: для питона может и быстрее
MadKnight: \]
magaiti: :door:
MadKnight: упс
magaiti: :tractor:
magaiti: :tractor: :pig:
Uljahn: нафига ваще в играх такая реалистичность движений? мне в д2 до сих пор интересно играть, хоть там и спрайтики, а инди-новодел не заходит, т.к. кроме унылого графена там ничего нет
Uljahn: Automaton2000: симулятор бегуна с 1.5кк полигонов
Automaton2000: madknight у тебя в крестиках осталось?
magaiti: для того чтобы продавать новые консоли, конечно же
magaiti: суровый чат у вас, однимодеры и Automaton2000
Automaton2000: хотя я сам не знаю
magaiti: д2 рулит за счет системы лута, ну и билдостроения
magaiti: но щас есть игры и получше в этих областях
magaiti: тот же PoE
magaiti: я бы еще DDO добавил, но это нишевый продукт
magaiti: но от графена д2 сейчас уже глаза вытекают
magaiti: даже спрайтики сейчас уже надо делать в 4к
amurushkin: выяснил что подсчет хеша уменьшает количество сим в 2 раза у меня. попробовал переписать на PQ. полный провал :)
magaiti: а что пилишь, 2048,
magaiti: ?
magaiti: хеш только для широкого луча начинает давать пользу, 512-1024 типа того
magaiti: и то н факт
amurushkin: у меня вроде дает результат и на более узком
magaiti: на pq отлично работает, неправильно реализовал наверное
amurushkin: да наверное неправильно закодил
amurushkin: я pq в плюсах еще не юзал ниразу
magaiti: уменьшает колв-о сим это плохой результат )
magaiti: там надо правильно задать предикат сравнения
magaiti: и я все время забываю какой элемент на топе, мин или макс
magaiti: гуглю каждый раз
magaiti: ну и выпихивать минимальный перед вставкой нового, когда размер уже равен/кратен ширине луча
magaiti: я обычно беру размер pq = 2 ширины, потому что дубликатов набирается в среднем половина
magaiti: после отсеивания дубликатов получается примерно ширина луча
amurushkin: а как ты их отсеиваешь? если скор прошлого и текущего равны то пропускаешь?
magaiti: пока добавляешь в PQ, можно только сравнивать с топом
magaiti: т.к. она непрозрачная
magaiti: потом достаешь все, они в обратном порядке будут отсортированы
magaiti: в сортированном массиве можно за O(N) убрать дубликаты
magaiti: непрозрачный мешок с дыркой сверху, через которую видно один элемент. или дно)
magaiti: дубликаты убираю std::unique
amurushkin: а так вообще заметен прирост?
magaiti: хотя не, std::unique нужен если с кучей работать
magaiti: в PQ просто достаешь по очереди, и дубликаты видно сразу
magaiti: прирост по сравнению с чем?
magaiti: я сразу кучу забабахал
magaiti: вставлять в вектор - это неоптимально
magaiti: хотя в нем можно дубликаты находить, конечно
magaiti: проще то есть
amurushkin: я дубликаты через map сделал
magaiti: хеш или дерево?
amurushkin: unordered_map<int,bool>
magaiti: а бул зачем
magaiti: почему не unordered_set
amurushkin: я делаю так if (!used[h]) {used[h] = true;
magaiti: неправильно
magaiti: доступ через квадратные скобки создает элемент
magaiti: надо так m = map.find(h)
magaiti: if (h == map.end())
amurushkin: забавно что оно работает
magaiti: а лучше сразу insert делать
magaiti: он возвращает пару итератор и бул
magaiti: бул - вставил или уже есть
magaiti: то есть ты либо вставил новый, либо выяснил что уже есть, за один вызов
magaiti: ну если бул - это "есть или нет", то надо set юзать
magaiti: быстрее должен быть
magaiti: а зачем тебе хе, кстати?
magaiti: хеш
amurushkin: попробую.
magaiti: дубликаты отсеивать?
amurushkin: да для дубликатов. почему то когда скор юзаю float то оно не работает
magaiti: его имеет смысл совмещать с контейнером, где нельзя найти дубликат, типа кучи или PQ
magaiti: а если у тебя сортированны массив например, то там ты и так найдешь
magaiti: float часто дает одинаковый скор для разных
magaiti: досок
magaiti: помогает брать иррациональный дискаунт
amurushkin: у меня идея просто не вставлять дубликаты вообще. за счет этого в ширину луча попадает больше полезных стейтов
magaiti: и/или переходить на дабл
magaiti: я пробовал, но сим больше когда тупо берешь кучу в 2 раза шире, а потом дубликаты удаляешь каждые несколько шагов
magaiti: чем хашсет на каждой вставке опрашивать
magaiti: полезность стейтов спорная
amurushkin: есть поле для деятельности :)
amurushkin: ну по крайней мере лучше 8 разных чем одинаковых
magaiti: например финальная позиция перед 131 - 256 128 64 32 / 4 4 8 16
magaiti: но в нее можно за 2 хода попасть из позиции 256 128 32 32 / 0 4 32 16
magaiti: не знаю, эта позиция моет сцуществовать или нет
magaiti: но змейка ее отсеет скорее всего
magaiti: мне кажется надо в какой-то момент с бима переходить на а-стар или дфс, или что-то такое
magaiti: немного ошибся с позицией, но суть в том что там большие цифры в 4-й строке часто нужны
magaiti: или вообще змейку делать на 2 верхние строки, а нижние как-то по другому считать
magaiti: все надо тестить
magaiti: я обратную симу пишу, думаю на выходных уже получу результаты
magaiti: типа отъехать на несколько ходов от идеальной позиции, и пытаться с бимом пересечься
magaiti: запустить тоже бим по змейке, но в обратную сторону
magaiti: у меня ширина луча в начале 16 вроде, постепенно до нескольких сотен увеличиваю
magaiti: а к ходам где должны уже 2 строка собраться, выкручиваю на 1024 или даже 2048
magaiti: но не помогает
magaiti: ты ради спортивного интереса делаешь?
magaiti: ради очков лучше побольше разных нарешать
wlesavo: обратная сима конечно манящая штука, сама по себе идея красивая, но чет так лениво уже
amurushkin: magaiti ради собственного удовольствия. чем выше получается подняться тем интереснее
amurushkin: ради очков она вообще не прибыльная с таким то количеством участников
MadKnight: я короче своего старого препода по кодингу озадачил своими вопросами
MadKnight: он заинтересовался
MadKnight: типа как бы запилить это всё очень гибким, максимально модульным, и главное - максимально оптимизированным
MadKnight: и в виде базовой библиотеки
MadKnight: особенно интересен ему вопрос как сделать максимально гибко и чтобы при этом было максимально оптимизировано
MadKnight: оказалось - такое возможно
magaiti: ну-ну, просвети нас
amurushkin: видели картинку новую контеста?
amurushkin: такое ощущение что опять куховарить :)
magaiti: я наверное не буду участвовать
magaiti: неохота на время работать
magaiti: 2 раза участвовал, все время кончается головной болью и проблемами на работе
magaiti: тк голова забита контестом
amurushkin: что да что да. я так на последнем контесте из бронзы даже не вышел
amurushkin: а в раике будешь? там месяц где то будет
magaiti: я запаковал в 64 бита доску, верхняя 5 бит, 2 по 4 и 3 бита нижняя. позиции которые не влезают в такую упаковку, просто не рассматриваю
magaiti: соответственно паковать по змейке
magaiti: как уже предлагали
magaiti: сразу и доска и фитнсс, и уникально
magaiti: в нижней строке только до 128 правда
magaiti: но надеюсь хватит
amurushkin: а не геморно такую доску юзать?
magaiti: хз
magaiti: чем меньше тем больше влезет в 16 гб локально
magaiti: а потом разберусь
Uljahn: получается, варианты не-змейки у вас не рассматриваются вообще? или таких не может быть?
Uljahn: играл сегодня руками, набил плитку 2048, змейкой редко получалось выстраивать, хотя там спавн непредсказуемый
magaiti: ну смотри
magaiti: чтоб собрать 131к, нужно слить 16 ячеек
magaiti: подряд от 65к до 8 4 4
magaiti: они должны быть выстроены так чтобы это можно было сделать
magaiti: то есть нужен непрерывный пууть
magaiti: а кроме этого еще нужно чтоб было удобно собирать
magaiti: вот и получается что змейка
magaiti: все-таки нужен фитнес с дискаунтом
magaiti: эта запакованная фигня в 64 бита плохо ищет
magaiti: прикол, сид может в ноль превратиться, и тогда все - четверка в верхнюю левую клетку всегда
magaiti: или нет
magaiti: это где-то у меня косяк что ли
magaiti: хмм, для A* нужна другая эвристика, более сложная
magaiti: а то он любит выращивать нижние клетки
MadKnight: через модульность magaiti
MadKnight: нужно разделять всё
MadKnight: и не делать кашу
magaiti: ну так
magaiti: за счет чего достигаетмся модульность?:
magaiti: за счет интерфейсов
magaiti: за счет шаблонов проектрования
MadKnight: ну вот недостаточной модульности достиг
magaiti: ну так рассказывай
magaiti: а мы поржем
MadKnight: хороший настрой
amurushkin: magaiti: или нет, в первую свободную
magaiti: ась?
amurushkin: (22:31:42) magaiti: или нет
magaiti: первая свободная - это верхняя левая свободная, если я не напутал. неважно
magaiti: нулевой сид из-за моего косяка только был
amurushkin: верхняя левая не всегда первая свободная
magaiti: верхняя левая свободная всегда свободная
magaiti: хз я не хочу щас выяснять в каком порядке чужой код перебирает клетки
MadKnight: короче я вернулся
MadKnight: ну го magaiti посмотрим как ты решишь эту проблемку
MadKnight: надо запилить базовый класс борда и базовый класс графа так, чтобы можно было гибкий поиск пути закодить и юзать его везде где нужен поиск пути
magaiti: какого графа?
MadKnight: ну графы
MadKnight: как в PR2
magaiti: почему у нас поиск должен использовать граф?
MadKnight: поиск по графу*
MadKnight: от одной ноды к другой
magaiti: поиск чего по графу чего
MadKnight: так по графу как в PR2
magaiti: а борд как с графом связан?
magaiti: что такое PR2
MadKnight: просто карта задана в виде графа
magaiti: а
magaiti: а в чем проблема?
MadKnight: как общий поиск пути для них сделать?
magaiti: в смысле общий
MadKnight: чтобы один поиск пути работал и для бордов и для графов
magaiti: сделать общий интерфейс у борда и графа, к которому будет поиск обращаться
MadKnight: какой интерфейс
magaiti: который будет использовать поиск
MadKnight: это не модульный подход
magaiti: что нужно для поиска?
magaiti: чем не модульный?
MadKnight: ты вшил часть поиска пути в граф и борд
magaiti: нет
MadKnight: интерфейс поиска пути
magaiti: я реализовал интерфейс в графе и борде, который отдает информацию о тоологии
MadKnight: это часть модуля поиска пути
magaiti: эт оне интерфейс поиска
MadKnight: ты его вшил
magaiti: это интерфейс топологии
MadKnight: а если тебе поиск пути не нужен будет?
magaiti: не вшил, а надстроил
magaiti: тогда не буду интерфейс добавлять
MadKnight: это базовый класс
magaiti: что базовы класс?
MadKnight: код один и тот же
MadKnight: для игры где нужен поиск пути и для игры где он не нужен
magaiti: ну и что?
MadKnight: ты не можешь добавлять или убирать интерфейс у базового класса
magaiti: у базового не могу
magaiti: могу у наследованного
MadKnight: что именно будет у этого интерфейса?
magaiti: методы, возвращающие информацию о клетках, типа список соседних
magaiti: нод/клеток
magaiti: что там еще нужно для поиска, еще не знаю. расстояния
MadKnight: теряешь производительность
magaiti: да ладно
magaiti: и как не терять?
MadKnight: 1 - у тебя вызов ф-ий интерфейса будет по указателю
magaiti: расскажи как не терять
MadKnight: 2 - массив соединений для борда придётся хранить
magaiti: почему?
MadKnight: точнее генерить
magaiti: почему поиск вообще должен использовать массив соединений?
magaiti: ну ок
magaiti: и как тогда класс борда сделать?
MadKnight: тыж говорил сам
magaiti: я говорил что методыесть
magaiti: а что генерить надо это ты сам придумал
MadKnight: вообще-то по логике за доступные соединения должен отвечать юнит для которого мы путь ищем
magaiti: фигасе
magaiti: то есть он должен знать как устроен борд?
magaiti: про юнит вообще не было речи
MadKnight: нет, базовый класс не должен
magaiti: если у тебя от юнита зависит топология, то надо хорошо подумать как разнести борд, юнитов и поиск
magaiti: чтоб не получилась каша
MadKnight: топология не зависит
MadKnight: юнит лишь говорит доступные ему перемещения
magaiti: он для этого должен борд опрашивать
magaiti: как?
magaiti: а тогда придется строить топологию для этого юнита, не так ли?
MadKnight: не, он возьмёт стандартный getter топологии из своего типа карты
magaiti: как этот геттер выглядит?
MadKnight: и если надо, добавит своих условий
magaiti: ну ок, геттер топологии
magaiti: чем это принципиально отличается от того что я сказал?
MadKnight: у меня адреса будут известны на этапе компиляции
magaiti: на этапе инициализации
MadKnight: и оптимизатор справится лучше
magaiti: ты собрался компилятором карту оптимизировать?
magaiti: она у тебя одна на всю игру?
MadKnight: да не карту
MadKnight: а функции инлайнить
MadKnight: автоматически
magaiti: а, ты все о том же
MadKnight: не, сейчас я об обычных inlin
MadKnight: e
magaiti: ну есть такое понятие как статический полиморфизм
MadKnight: это тогда надо поиск пути шаблонным делать
magaiti: ты вообще не о том спрашиваешь
magaiti: ты спрашиваешь про архитектуру
magaiti: а хочешь услышать про реализацию полиморфизма
magaiti: а как ты его нешаблонным сделаешь, чтоб он и борд мог юзать, и граф?
MadKnight: что вообще поиск пути будет возвращать?
MadKnight: вопрос больше вот в чём -
MadKnight: что делать с играми где статик размер карты?
magaiti: упс
MadKnight: что делать если мы хотим вместо дистансов сохранять id след ячейки куда идти?
magaiti: короче, если твои виртуальные методы имеют модификатор final , то они соптимизируются
magaiti: и указателей не будет
magaiti: что значит вместо
magaiti: ты же сказал что есть геттер топологии
magaiti: поиск пути будет возвращать путь
magaiti: очевидно же
magaiti: тогда тебе нужны разные методы поиска
MadKnight: путь в каком виде?
magaiti: в каком тебе нужно, такой поиск ты и вызываешь
magaiti: в общем случае наверное список нод
MadKnight: так может нам не надо путь только из одной точки
MadKnight: а надо весь distanceMap
magaiti: ну так вызывай метод для дистансмапа
MadKnight: но в виде чего создать его?
magaiti: хотя насчет final это забей,
magaiti: кого создать в виде чего?
magaiti: какое отношение это имеет к модульности?
MadKnight: это про оптимизацию
MadKnight: динамический массив?
MadKnight: статический?
MadKnight: или что?
magaiti: я хз как выглядит дистансмап
MadKnight: 2д карта значений distance
MadKnight: под каждую ячейку - по значению distance
magaiti: а как дистансмапы обычно используют?
MadKnight: из любой точки можешь дойти до цели
MadKnight: просто идёшь по направлению уменьшающегося distance
magaiti: думаю лучше всего передать адрес массива, а поиск его заполнит
magaiti: нужный размер отдельно можно узнать заранее
magaiti: если ты хочешь выделять сам
MadKnight: а как заполнять не дистансмапом?
magaiti: что заполнять?
MadKnight: ладно, я походу спать просто пойду
magaiti: иди
magaiti: 🛏️
magaiti: 🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑