Chrome Dino: пишем бота для игры в «Динозавра»

Многим знакома ситуация, когда пропадает интернет и в браузере Google Chrome появляется ставшая уже культовой игра «Динозавр». Мне стало интересно создать робота, который будет играть в неё самостоятельно. Вот что из этого вышло.

Игра «Динозавр» в браузере Google Chrome

Чтобы запустить игру в браузере Google Chrome не обязательно отключать интернет, можно открыть новую вкладку и написать в адресной строке команду:

chrome://dino

Для написания бота выбрал язык Python и библиотеку PyAutoGUI.

Для начала найдем на экране самого динозавра:

def find_image_on_screen(base64_string, confidence=0.8): image_data = base64.b64decode(base64_string) image = Image.open(BytesIO(image_data)) try: location = pyautogui.locateOnScreen(image, confidence=confidence) except pyautogui.ImageNotFoundException: return False return location def find_dino(): img = ['iVBORw0KGgoAAAANSUhEUgAAAAgAAAAbAQMAAAB7g1z9AAAABlBMVE', 'VTU1P///+JyPDT', 'WsrKwAAAB507xw', 'AAAAGklEQVQI12P4D4TYAT8QgoA9FDIDoTEQAtkAfjYEA2Wu4vMAAAAASUVORK5CYII=']; dinos = [img[0]+img[1]+img[3], img[0]+img[2]+img[3]] for dino in dinos: location = find_image_on_screen(dino) if location: print("Found Dino:", location) return location print("Dino not found") sys.exit() return False

Теперь установим точку наблюдения на некотором удалении от динозавра. Будем действовать следующим образом: если в нашу область наблюдения попадает какой-нибудь предмет, например, кактус или птеродактиль, мы перепрыгиваем его:

location=find_dino() dino_L = location.left dino_T = location.top dino_W = location.width dino_H = location.height jump_distance_px = 145 eye_W = 30 eye_H = 35 jump_region = ( int(dino_L + jump_distance_px), int(dino_T - 5), int(eye_W), int(eye_H + 5) )

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

def is_obstacle_detected(region): image = pyautogui.screenshot(region=region).convert('L') extrema = image.getextrema() return not extrema[0] == extrema[1]

Мы проверяем, все ли пиксели одного цвета, если это не так, значит на нашем пути препятствие, и его нужно перепрыгнуть:

def jump(): pyautogui.press('up') try: while True: if is_obstacle_detected(jump_region): jump() except KeyboardInterrupt: print("Game stopped by user")

Вот и всё. Мы написали простую, но в то же время функциональную версию бота, который будет работать как в дневном, так и в ночном режиме игры:

Игра «Динозавр» в ночном режиме

Конкурс на самый лучший бот для прохождения игры Dino

Кому интересно, присылайте своих ботов, написанных на языке Python, мне на тестирование в Telegram:

Лучший бот получит приз 10 000 руб. Конкурс продлиться до 18 марта 2025. Исходный код бота победителя будет выложен на всеобщее обозрение, чтобы любой желающий смог сделать ещё более лучшую версию. В заявке указывайте ссылку на свой проект с ботом на гите, а также ваш лучший результат при самостоятельном тестировании.

12
3 комментария