Я пытаюсь реализовать скрипт, который будет играть в игру змея, используя алгоритм *.Игра была предоставлена мне кем-то другим (моим учителем), и я должен написать рабочий сценарий, который будет играть в игру настолько хорошо, насколько это возможно, используя этот точный алгоритм или некоторые его вариации.
Теперь у меня естьЯ написал алгоритм и попробовал различные его симуляции, и оказалось, что он работает просто отлично, однако, поскольку игра представляет собой .exe, я должен сделать снимок экрана игрового экрана и преобразовать его во входные данные для моего алгоритма из того, что я создаю.путь и дать команды змеи, используя pyautogui
.
Итак, чтобы подвести итог, алгоритм:
- Сделать снимок экрана
- Рассчитать путь и перемещения
- Движение к цели
- Повторяйте до тех пор, пока змея не умрет или не достигнет определенного значения.
Проблема, с которой я сталкиваюсь, заключается в том, что у змеи есть определенное время, необходимое для того, чтобы сделать 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)
Пример того, что может вызвать задержка:
Змея на изображении умерла,однако путь для него был указан правильно, но из-за того, что он не отреагировал вовремя (из-за упомянутой задержки), он столкнулся с поворотом.Есть ли способ, например, сделать некоторый блок кода, который занимает от 50-60ms
, чтобы он работал 100ms
, так что ничего не делать, пока не пройдет это время, потому что таким образом я мог бы избавиться от задержки, вычитая 100ms
изпоследний ход и ожидание 100ms
, пока не будут рассчитаны следующие ходы.