Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update helpers.py is_intersect: manhattan dist #297

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

boriszaitsev
Copy link
Contributor

@boriszaitsev boriszaitsev commented Jul 26, 2019

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), оба на своей территории. Затем первый игрок начинает двигаться ко второму, со своей территории на территорию второго, а второй уходит от столкновения в сторону. со своей территории на свою же.
Получается что второй игрок умирает двигаясь полностью по своей территории, это явно противоречит правилам.
#295
Если заменить условие столкновения на (манхеттенская дистанция < width), то такой случай обработается ожидаемым образом, столкновения не будет, первый игрок начинает захват чужой территории, второй игрок находится на своей территории, в безопасности.

Now is_intersect returns True if difference in any axis (x or y) 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.
@demin-dmitriy
Copy link

demin-dmitriy commented Jul 26, 2019

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

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

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

@boriszaitsev
Copy link
Contributor Author

boriszaitsev commented Jul 26, 2019

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

@demin-dmitriy
Copy link

249 строка:

if isinstance(bonus, Saw):
line = player.get_direction_line()
Saw.append_line(line)
for p in self.players:
if p != player:
if any([is_intersect((p.x, p.y), point) for point in line]):
self.losers.append(p)
Saw.log.append({
'player': player.id,
'loser': p.id,
'killed': True
})
player.tick_score += SAW_KILL_SCORE

@boriszaitsev
Copy link
Contributor Author

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

@psinetron
Copy link

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

@voidmain02
Copy link

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

@boriszaitsev
Copy link
Contributor Author

boriszaitsev commented Jul 26, 2019

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

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

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

@xammi xammi added the invalid This doesn't seem right label Jul 29, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
invalid This doesn't seem right
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants