miniaicups
miniaicups copied to clipboard
Update helpers.py is_intersect: manhattan dist
Now is_intersect returns True if difference in both axises between players less than width. Thiat results to issue with double death in case when they pathes are perpendicular and both players start and end points (elementar cells, grid crosses) are valid. Replacing condition to comparing width with manhattan dist makes this issue fixed.
Сейчас считается что есть столкновение, если разница по обоим координатам меньше 30. В таком случае получаются ложные столкновения, когда оба игрока находятся в соседних узлах сетки (aka элементарных ячейках, кратных 30 -15), оба на своей территории. Затем первый игрок начинает двигаться ко второму, со своей территории на территорию второго, а второй уходит от столкновения в сторону. со своей территории на свою же. Получается что второй игрок умирает двигаясь полностью по своей территории, это явно противоречит правилам. https://github.com/MailRuChamps/miniaicups/issues/295 Если заменить условие столкновения на (манхеттенская дистанция < width), то такой случай обработается ожидаемым образом, столкновения не будет, первый игрок начинает захват чужой территории, второй игрок находится на своей территории, в безопасности.
В правилах везде говорится, что игрок -- это квадрат. Этот PR превращает его в ромб (это конечно тоже квадрат, но не тот, что имелось в виду).
В описаной ситуации я лично не вижу противоречия правилам. Игроки столкнулись, у обоих шлейф одинаковый (нулевой), следовательно оба умирают. Может быть стоит задуматься над тем чтобы откорректировать правила в этом случае и переопределить длину шлейфа. (Но не переопределять форму игрока!). Либо, если так и надо, то желательно разъяснить этот момент в правилах. Интересно что думают орги на этот счёт.
Ещё, если не ошибаюсь, этот PR ненамеренно меняет механику пилы.
Ну пусть при учете коллизий будет ромб, все остальные "настоящие" коллизии обработаются нормально, когда действительно траектории пересекаются, просто на пару тиков позже. Зато не будет контринтуитивной ситуации, когда находясь на своей территории, бот не может избежать смерти, куда бы он не пошел. Я не уверен насчет пилы, но вроде никак не влияет: функция is_itersect используется только в одном месте: game.py -> Game.check_loss(), там где обрабатываются коллизии между игроками.
249 строка: https://github.com/MailRuChamps/miniaicups/blob/d1b3b3e88afe6ecaf36c4bfba0ab20a350f72197/paperio/local_runner/game_objects/game.py#L244-L256
Да, пропустил это место. В этом случае ромб или квадрат - не важно, если пила цепляет квадрат 30х30, то она зацепит и вписанный в него ромб, линия пилы параллельна одной из осей xy.
Однозначно игрок находящийся на своей территории должен быть в безопасности. Игрок на территории противника должен проигрывать при столкновении. Иначе какой смысл в своей территории?
Согласен с @demin-dmitriy. Если в этой ситуации посчитать, что у игрока-агрессора длина шлейфа больше нуля (он ведь на 1/6 уже заехал на территорию противника), тогда он бы от этого столкновения погиб.
@voidmain02 про длину шлейфа нет вопросов, она у обоих игроков в issue нулевая. Этот ПР предлагает не считать столкновением ситуации типа: Тик 1: Игрок 1 уходит из своей клетки А в соседнюю свою же клетку Б (влево). Игрок 2 уходит из своей клетки В в клетку игрока 1 А(вниз). (А - прямой угол треугольника АБВ, Б слева от А, В сверху от А) Тик2: Оба они находятся в пути, длина шлефа у обоих == 0 (собственно у игрока 1 шлефа вообще не будет, он у себя дома, а у игрока 2 шлейф будет равным 1 через 5 тиков, по прибытии в А). В этот момент, когда они в пути и двигаются по перпендикулярным прямым, их квадраты 30х30 пересекаются и происходит столкновение, имеем 2 трупа.
Если ПР принять, то на тике 1 столкновения не будет, и через 5 тиков игрок 1 будет в Б ( на своей территории, шлейфа нет), игрок 2 будет в А( на вражеской территории, шлейф == 1).
При этом все прочие ситуации, когда квадраты 30х30 игроков сталкиваются (в лоб или под прямым углом) так же останутся коллизиями, просто будут происходить иногда ( в случае прямого угла ) на пару тиков позже.