sat2707 / aicups

Официальный репозиторий документации aicups.ru
Apache License 2.0
37 stars 29 forks source link

Баг, который может давать преимущество левому игроку в самом начале игры #88

Closed Justize closed 6 years ago

Justize commented 6 years ago

Например, если оба игрока на первых тиках используют одинаковую стратегию: зовём всех своих пассажиров в лифт с id 3/4, а всех чужих пассажиров в лифт с id 1/2 (то есть имеем ситуацию, когда для каждого пассажира чужой лифт ближе чем свой), то на первых тиках все пассажиры побегут в лифты левого игрока. Реплей Это происходит, т.к. в функции set_passenger_elevator()

def set_passenger_elevator(self, passenger, elevator):
        if (passenger.is_waiting_for_elevator() or passenger.is_returning()) and elevator.current_floor() == passenger.from_floor and elevator.is_filling() and not elevator.is_full():
            if passenger.elevator:
                passenger_elevator_distance = abs(passenger.x - passenger.elevator.x)
                passenger_new_elevator_distance = abs(passenger.x - elevator.x)
                if passenger_new_elevator_distance < passenger_elevator_distance:
                    passenger.elevator = elevator
                return

            if elevator.get_type() == passenger.get_type():
                passenger.elevator = elevator
                return

            if elevator.ready_for_enemy_passenger():
                passenger.elevator = elevator
                return

пассажиру может назначиться новый лифт ,если пассажир в состоянии 1 или 3, в случаях:

  1. Пассажиру уже назначен лифт
  2. Пассажир и лифт принадлежат одному игроку
  3. Лифт готов забирать чужих пассажиров

Поскольку сначала просчитывается правый игрок, то имеем следующую ситуацию:

  1. Пассажиру левого игрока назначается левый лифт , т.к . правый игрок не смог его позвать в свой, потому что его лифт еще не может приглашать чужих пассажиров.
  2. Пассажиру правого игрока сначала назначается правый лифт, но в тот же тик лифт переназначается на левый, т.к. пасажир к нему ближе, он все еще в 1 состоянии, но ему уже назначен лифт (выполняется условие if passenger.elevator:).

Таким образом левый игрок может "угонять" чужих пассажиров, а правый не может, несправедливо)

Karloid commented 6 years ago

а это нормально что там в первом ифе нет проверки на elevator.ready_for_enemy_passenger() ? то есть если у пассажира уже был лифт, следующий назначается без этой проверки. Или я что то недопонял?

Mur4ik commented 6 years ago

Касается не только начала игры, преимущество у второго игрока сохраняется на протяжении всей симуляции в данной ситуации.

И я это вижу немного по другому: левый игрок зовет пассажира правый игрок зовет того же пассажира и если пассажир ближе к правому, то игнорится правило 40 тиков и пассажир пойдет к правому игроку.

sat2707 commented 6 years ago

Исправили