Делаю бота на питоне на ПК и другие платформы (через 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()