Рыба ловится

This commit is contained in:
Daniil 2025-11-07 21:56:46 +03:00
parent f9e26cfa50
commit 3dd853bf17
4 changed files with 164 additions and 0 deletions

BIN
catched_bober.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
game.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
game_orig.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

164
main.py
View File

@ -212,6 +212,170 @@ def find_bober_on_screen():
time.sleep(0.5)
pyautogui.mouseUp(button='left')
print(" ✓ Левой кнопкой мыши удержано 0.5 секунды!")
# Теперь ищем game.png на всем экране
game_template_path = "game.png"
if os.path.exists(game_template_path):
print(f"\nПоиск '{game_template_path}' на всем экране...")
# Загружаем шаблон game.png
game_template = cv2.imread(game_template_path, cv2.IMREAD_GRAYSCALE)
if game_template is not None:
game_w, game_h = game_template.shape[::-1]
game_threshold = 0.5
# Захватываем весь экран
full_screen = sct.grab(sct.monitors[1]) # monitors[1] - это основной монитор
# Конвертируем в numpy array и оттенки серого
full_screen_np = np.array(full_screen)
full_screen_gray = cv2.cvtColor(full_screen_np, cv2.COLOR_BGR2GRAY)
# Выполняем поиск шаблона game.png
game_res = cv2.matchTemplate(full_screen_gray, game_template, cv2.TM_CCOEFF_NORMED)
# Получаем максимальное значение совпадения
game_min_val, game_max_val, game_min_loc, game_max_loc = cv2.minMaxLoc(game_res)
# Проверяем, найден ли game.png
game_loc = np.where(game_res >= game_threshold)
game_matches = list(zip(*game_loc[::-1]))
if len(game_matches) > 0:
print(f"✓ game.png НАЙДЕН на экране!")
print(f" Уверенность совпадения: {game_max_val:.2f}")
print(f" Позиция: ({game_max_loc[0]}, {game_max_loc[1]})")
# Сохраняем координаты найденной области в переменные
left_side = game_max_loc[0]
right_side = game_max_loc[0] + game_w
top_side = game_max_loc[1]
bottom_side = game_max_loc[1] + game_h
print(f" Координаты области:")
print(f" left_side: {left_side}")
print(f" right_side: {right_side}")
print(f" top_side: {top_side}")
print(f" bottom_side: {bottom_side}")
# Теперь ищем catched_bober в этой области и мониторим его позицию
catched_bober_template_path = "catched_bober.png"
if os.path.exists(catched_bober_template_path):
print(f"\nПоиск '{catched_bober_template_path}' в области game...")
# Загружаем шаблон catched_bober.png
catched_bober_template = cv2.imread(catched_bober_template_path, cv2.IMREAD_GRAYSCALE)
if catched_bober_template is not None:
catched_w, catched_h = catched_bober_template.shape[::-1]
catched_threshold = 0.5
check_interval = 0.1 # секунд между проверками (быстрая реакция)
# Определяем область для мониторинга (область game)
game_area = {
"top": top_side,
"left": left_side,
"width": right_side - left_side,
"height": bottom_side - top_side
}
print(f" Мониторинг позиции catched_bober в области game...")
print(f" Область: ({left_side}, {top_side}) - ({right_side}, {bottom_side})")
mouse_pressed = False
previous_x = None
check_count = 0
# Цикл непрерывного мониторинга
while True:
check_count += 1
# Захватываем область game
game_area_screenshot = sct.grab(game_area)
# Конвертируем в numpy array и оттенки серого
game_area_np = np.array(game_area_screenshot)
game_area_gray = cv2.cvtColor(game_area_np, cv2.COLOR_BGR2GRAY)
# Выполняем поиск шаблона catched_bober
catched_res = cv2.matchTemplate(game_area_gray, catched_bober_template, cv2.TM_CCOEFF_NORMED)
# Получаем максимальное значение совпадения
catched_min_val, catched_max_val, catched_min_loc, catched_max_loc = cv2.minMaxLoc(catched_res)
# Проверяем, найден ли catched_bober
catched_loc = np.where(catched_res >= catched_threshold)
catched_matches = list(zip(*catched_loc[::-1]))
if len(catched_matches) > 0:
# Вычисляем центр найденного catched_bober
current_x = catched_max_loc[0] + catched_w // 2
current_x_absolute = left_side + current_x # Абсолютная координата на экране
# Вычисляем расстояние до левой и правой стороны
distance_to_left = current_x
distance_to_right = (right_side - left_side) - current_x
# Определяем, к какой стороне ближе
closer_to_left = distance_to_left < distance_to_right
# Показываем информацию каждые 10 проверок
if check_count % 10 == 0:
print(f" Проверка #{check_count}: catched_bober на позиции {current_x_absolute} (относительно: {current_x})")
print(f" Расстояние до левой: {distance_to_left}, до правой: {distance_to_right}")
# Управление мышью в зависимости от позиции
if closer_to_left:
# Ближе к левой стороне - нажимаем кнопку мыши
if not mouse_pressed:
pyautogui.mouseDown(button='left')
mouse_pressed = True
print(f" → catched_bober ближе к левой стороне - мышь НАЖАТА")
else:
# Ближе к правой стороне - отпускаем кнопку мыши
if mouse_pressed:
pyautogui.mouseUp(button='left')
mouse_pressed = False
print(f" → catched_bober ближе к правой стороне - мышь ОТПУЩЕНА")
previous_x = current_x
else:
# catched_bober не найден
if check_count % 50 == 0:
print(f" Проверка #{check_count}: catched_bober не найден (макс. уверенность: {catched_max_val:.2f})")
# Если мышь была нажата, отпускаем её
if mouse_pressed:
pyautogui.mouseUp(button='left')
mouse_pressed = False
print(f" → catched_bober не найден - мышь ОТПУЩЕНА")
# Небольшая задержка перед следующей проверкой
time.sleep(check_interval)
else:
print(f"Ошибка: Не удалось загрузить '{catched_bober_template_path}'")
else:
print(f"\nПредупреждение: Файл '{catched_bober_template_path}' не найден, пропускаем мониторинг.")
else:
print(f"✗ game.png НЕ найден на экране.")
print(f" Максимальная уверенность совпадения: {game_max_val:.2f} (порог: {game_threshold})")
left_side = None
right_side = None
top_side = None
bottom_side = None
else:
print(f"Ошибка: Не удалось загрузить '{game_template_path}'")
left_side = None
right_side = None
top_side = None
bottom_side = None
else:
print(f"\nПредупреждение: Файл '{game_template_path}' не найден, пропускаем поиск.")
left_side = None
right_side = None
top_side = None
bottom_side = None
else:
# Показываем прогресс каждые 10 проверок
if check_count % 10 == 0: