Как предотвратить задержку / гонки в питоне? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь реализовать скрипт, который будет играть в игру змея, используя алгоритм *.Игра была предоставлена ​​мне кем-то другим (моим учителем), и я должен написать рабочий сценарий, который будет играть в игру настолько хорошо, насколько это возможно, используя этот точный алгоритм или некоторые его вариации.

Теперь у меня естьЯ написал алгоритм и попробовал различные его симуляции, и оказалось, что он работает просто отлично, однако, поскольку игра представляет собой .exe, я должен сделать снимок экрана игрового экрана и преобразовать его во входные данные для моего алгоритма из того, что я создаю.путь и дать команды змеи, используя pyautogui.

Итак, чтобы подвести итог, алгоритм:

  1. Сделать снимок экрана
  2. Рассчитать путь и перемещения
  3. Движение к цели
  4. Повторяйте до тех пор, пока змея не умрет или не достигнет определенного значения.

Проблема, с которой я сталкиваюсь, заключается в том, что у змеи есть определенное время, необходимое для того, чтобы сделать 1двигаться и я задерживаю нажатие клавиши соответственно этому времени, однако когда я достигаю цели, мне приходится повторять все шаги и шаги 1-2 всегда занимает около 45-55ms, чтобыи в это время моя змея умрет, потому что не отреагировала достаточно быстро.Итак, что было бы хорошим способом предотвратить это?

Решение, которое я придумал, иногда работает, но образуется задержка, и змея либо сделает один шаг слишком рано, либо слишком поздно в какой-то момент, которыйможет быть смертельно опасным:

def simulate_movement(moves, speed):

for move in moves:
    text, pause = move
    interval1 = round(pause * speed, 1)
    if move == moves[-1]:
        interval1 = 0.05  # I speed up the final move because steps 1 and 2 take about 0.05ms
    pyautogui.press(text, interval=interval1)

Пример того, что может вызвать задержка:

enter image description here

Змея на изображении умерла,однако путь для него был указан правильно, но из-за того, что он не отреагировал вовремя (из-за упомянутой задержки), он столкнулся с поворотом.Есть ли способ, например, сделать некоторый блок кода, который занимает от 50-60ms, чтобы он работал 100ms, так что ничего не делать, пока не пройдет это время, потому что таким образом я мог бы избавиться от задержки, вычитая 100ms изпоследний ход и ожидание 100ms, пока не будут рассчитаны следующие ходы.

...