Chat:Ru/2020-10-16

From CG community
Jump to navigation Jump to search

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: а интерфейс только объявления методов

magaiti: https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

MadKnight: фабрика - это вообще не related, а builder - это конструктор с bool optionX_enabled

MadKnight: кастомную фичу не добавить

amurushkin: тебе и нужно либо фабирка мебельную либо конструктор столов )))

MadKnight: ничего не подходит

MadKnight: хочу кастомный стол

MadKnight: свой личный

amurushkin: значит наследуй в новый класс. чего magaiti и начал

amurushkin: и там все методы какие должны вести себя по другому переопределяй

magaiti: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

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: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%81%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

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: https://gcc.godbolt.org/#compilers:!((compiler:g6,options:'-O2+-Wall++-xc%2B%2B+-std%3Dc%2B%2B11',source:'class+A+%7B%0Apublic:%0A++++virtual+void+f()+%3D+0%3B%0A%7D%3B%0A%0Aclass+B+:+public+A+%7B%0Apublic:%0A++++void+f()+final+override%3B%0A%7D%3B%0A%0Avoid+foo(B%26+b)+%7B%0A++++b.f()%3B%0A%7D%0A')),filterAsm:(commentOnly:!t,directives:!t,intel:!t,labels:!t),version:3

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: 🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑