miniaicups icon indicating copy to clipboard operation
miniaicups copied to clipboard

Update helpers.py is_intersect: manhattan dist

Open boriszaitsev opened this issue 4 years ago • 7 comments

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), то такой случай обработается ожидаемым образом, столкновения не будет, первый игрок начинает захват чужой территории, второй игрок находится на своей территории, в безопасности.

boriszaitsev avatar Jul 26 '19 09:07 boriszaitsev

В правилах везде говорится, что игрок -- это квадрат. Этот PR превращает его в ромб (это конечно тоже квадрат, но не тот, что имелось в виду).

В описаной ситуации я лично не вижу противоречия правилам. Игроки столкнулись, у обоих шлейф одинаковый (нулевой), следовательно оба умирают. Может быть стоит задуматься над тем чтобы откорректировать правила в этом случае и переопределить длину шлейфа. (Но не переопределять форму игрока!). Либо, если так и надо, то желательно разъяснить этот момент в правилах. Интересно что думают орги на этот счёт.

Ещё, если не ошибаюсь, этот PR ненамеренно меняет механику пилы.

demin-dmitriy avatar Jul 26 '19 10:07 demin-dmitriy

Ну пусть при учете коллизий будет ромб, все остальные "настоящие" коллизии обработаются нормально, когда действительно траектории пересекаются, просто на пару тиков позже. Зато не будет контринтуитивной ситуации, когда находясь на своей территории, бот не может избежать смерти, куда бы он не пошел. Я не уверен насчет пилы, но вроде никак не влияет: функция is_itersect используется только в одном месте: game.py -> Game.check_loss(), там где обрабатываются коллизии между игроками.

boriszaitsev avatar Jul 26 '19 11:07 boriszaitsev

249 строка: https://github.com/MailRuChamps/miniaicups/blob/d1b3b3e88afe6ecaf36c4bfba0ab20a350f72197/paperio/local_runner/game_objects/game.py#L244-L256

demin-dmitriy avatar Jul 26 '19 11:07 demin-dmitriy

Да, пропустил это место. В этом случае ромб или квадрат - не важно, если пила цепляет квадрат 30х30, то она зацепит и вписанный в него ромб, линия пилы параллельна одной из осей xy.

boriszaitsev avatar Jul 26 '19 11:07 boriszaitsev

Однозначно игрок находящийся на своей территории должен быть в безопасности. Игрок на территории противника должен проигрывать при столкновении. Иначе какой смысл в своей территории?

psinetron avatar Jul 26 '19 12:07 psinetron

Согласен с @demin-dmitriy. Если в этой ситуации посчитать, что у игрока-агрессора длина шлейфа больше нуля (он ведь на 1/6 уже заехал на территорию противника), тогда он бы от этого столкновения погиб.

voidmain02 avatar Jul 26 '19 12:07 voidmain02

@voidmain02 про длину шлейфа нет вопросов, она у обоих игроков в issue нулевая. Этот ПР предлагает не считать столкновением ситуации типа: Тик 1: Игрок 1 уходит из своей клетки А в соседнюю свою же клетку Б (влево). Игрок 2 уходит из своей клетки В в клетку игрока 1 А(вниз). (А - прямой угол треугольника АБВ, Б слева от А, В сверху от А) Тик2: Оба они находятся в пути, длина шлефа у обоих == 0 (собственно у игрока 1 шлефа вообще не будет, он у себя дома, а у игрока 2 шлейф будет равным 1 через 5 тиков, по прибытии в А). В этот момент, когда они в пути и двигаются по перпендикулярным прямым, их квадраты 30х30 пересекаются и происходит столкновение, имеем 2 трупа.

Если ПР принять, то на тике 1 столкновения не будет, и через 5 тиков игрок 1 будет в Б ( на своей территории, шлейфа нет), игрок 2 будет в А( на вражеской территории, шлейф == 1).

При этом все прочие ситуации, когда квадраты 30х30 игроков сталкиваются (в лоб или под прямым углом) так же останутся коллизиями, просто будут происходить иногда ( в случае прямого угла ) на пару тиков позже.

boriszaitsev avatar Jul 26 '19 14:07 boriszaitsev