@CharonIkh

Как бота заставить различать иконки внутри игры?

Делаю бота на питоне на ПК и другие платформы (через appium, но не начинал еще, онли пк) и возникла проблема, бот двигает экран, криво, но двигает, во время этого он должен искать иконки на экране, через скриншот, который он делает каждое движение, однако этого не происходит, он в тупую просто дергает экран и все, ничего более, я молчу про то, что их нужно собирать) Как можно решить эту проблему? Я уже пытался подключить несколько методов обнаружения, но не помогло, он просто тычит в рандомные иконки.. Голова уже не варит конкретно

import cv2
import numpy as np
import os
import pyautogui
from PIL import ImageGrab
import time
import random
import psutil
import pygetwindow as gw

# Пути к иконкам
ICONS = {
    'tomato1': r'assets\tomato\aitrain\tomatoe\tomato-icon.png',
    'tomato5': r'assets\tomato\aitrain\tomatoe\tomato-icon5.png',
    'tomato7': r'assets\tomato\aitrain\tomatoe\tomato-icon7.png',
    'wood': r'assets\tomato\aitrain\tomatoe\wood-icon.png'
}

def print_running_processes():
    for proc in psutil.process_iter(['name']):
        print(proc.info['name'])

def is_doomsday_running(process_name="doomsday"):
    for proc in psutil.process_iter(['name']):
        if process_name in proc.info['name'].lower():
            return True
    return False

def get_game_window():
    windows = gw.getWindowsWithTitle("Doomsday: Last Survivors")
    if windows:
        return windows[0]  # Возвращаем первое найденное окно
    return None

def main():
    print("Список запущенных процессов:")
    print_running_processes()

    process_name = "doomsday"

    if not is_doomsday_running(process_name):
        print("Doomsday: Last Survivors не обнаружен в списке процессов.")
        print("Пожалуйста, убедитесь, что игра запущена и введите точное имя процесса:")
        process_name = input().strip().lower()

    if is_doomsday_running(process_name):
        print(f"{process_name} запущен. Переключитесь на окно игры.")
        time.sleep(5)  # Даем время для переключения на окно игры

        game_window = get_game_window()
        if not game_window:
            print("Не удалось найти окно игры. Завершение работы.")
            return
        
        game_window.activate()
        time.sleep(1)  # Даем время для активации окна

        print("Начинаем поиск и взаимодействие с иконками...")
        
        while True:
            if not is_doomsday_running(process_name):
                print(f"{process_name} был закрыт. Завершаем работу.")
                break

            if move_and_search(game_window):
                print("Успешно найдена и активирована иконка")
                break
            else:
                print("Продолжаем поиск...")
            
            time.sleep(2)
    else:
        print("Не удалось обнаружить Doomsday: Last Survivors. Завершение работы.")
        return

def find_icon(icon_names, game_window, threshold=0.8):
    bbox = (game_window.left, game_window.top, game_window.right, game_window.bottom)
    screenshot = np.array(ImageGrab.grab(bbox=bbox))
    screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)
    
    for icon_name in icon_names:
        template = cv2.imread(ICONS[icon_name], 0)
        if template is None:
            print(f"Ошибка: Не удалось загрузить иконку {icon_name}")
            continue
        
        gray_screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
        result = cv2.matchTemplate(gray_screenshot, template, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
        
        if max_val >= threshold:
            # Возвращаем координаты иконки относительно экрана
            return (max_loc[0] + template.shape[1] // 2 + game_window.left, 
                    max_loc[1] + template.shape[0] // 2 + game_window.top)
    
    return None

def drag_screen(start_x, start_y, end_x, end_y, duration=1):
    pyautogui.mouseDown(start_x, start_y, button='left')
    pyautogui.moveTo(end_x, end_y, duration=duration)
    pyautogui.mouseUp(button='left')

def move_and_search(game_window):
    screen_width = game_window.width
    screen_height = game_window.height
    
    movements = [
        (screen_width // 2, 0),  # вверх
        (screen_width // 2, screen_height),  # вниз
        (0, screen_height // 2),  # влево
        (screen_width, screen_height // 2)  # вправо
    ]
    
    icon_names = list(ICONS.keys())
    
    for _ in range(4):  # Попробуем 4 движения
        start_x = random.randint(game_window.left, game_window.right)
        start_y = random.randint(game_window.top, game_window.bottom)
        end_x, end_y = random.choice(movements)
        end_x += game_window.left
        end_y += game_window.top
        
        drag_screen(start_x, start_y, end_x, end_y)
        time.sleep(1)
        
        icon_pos = find_icon(icon_names, game_window)
        if icon_pos:
            print(f"Иконка найдена в позиции: {icon_pos}")
            pyautogui.click(icon_pos[0], icon_pos[1])
            time.sleep(1)
            return True
    
    print("Ни одна иконка не найдена после всех попыток")
    return False

if __name__ == "__main__":
    main()
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы