Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос по коду, помогите найти ошибки

Vlad Fudinfa Ученик (205), открыт 1 неделю назад
import cv2
import numpy as np
import pyautogui
import time
import mss

# Параметры для цвета
GREEN_LOWER = np.array([40, 100, 100]) # Нижний предел для зеленого цвета в HSV
GREEN_UPPER = np.array([80, 255, 255]) # Верхний предел для зеленого цвета в HSV
RED_LOWER = np.array([0, 100, 100]) # Нижний предел для красного цвета в HSV
RED_UPPER = np.array([10, 255, 255]) # Верхний предел для красного цвета в HSV
RED_LOWER2 = np.array([160, 100, 100]) # Нижний предел для второго диапазона красного цвета
RED_UPPER2 = np.array([180, 255, 255]) # Верхний предел для второго диапазона красного цвета

# Функция для захвата экрана и поиска целей по цвету
def find_targets(color_lower, color_upper):
# Захват экрана
with mss.mss() as sct:
screenshot = sct.grab(sct.monitors[1])
img = np.array(screenshot)

# Преобразование в формат BGR
img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)

# Преобразование в цветовое пространство HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Создание маски для определенного цвета
mask = cv2.inRange(hsv, color_lower, color_upper)

# Для красного цвета используем два диапазона
if (np.array_equal(color_lower, RED_LOWER) or np.array_equal(color_lower, RED_LOWER2)):
mask2 = cv2.inRange(hsv, RED_LOWER2, RED_UPPER2)
mask = cv2.bitwise_or(mask, mask2)

# Нахождение контуров
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

targets = []
for contour in contours:
if cv2.contourArea(contour) > 500: # Игнорируем маленькие контуры
M = cv2.moments(contour)
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
targets.append((cX, cY)) # Центр контура

return targets
Дополнен 1 неделю назад
# Функция для движения к союзнику

def follow_ally(ally_positions):

if ally_positions:

ally_position = ally_positions[0] # Берем первую найденную позицию союзника

current_position = pyautogui.position() # Получаем текущие координаты мыши



# Движение к союзнику

if current_position[0] < ally_position[0]:

pyautogui.keyDown('d') # Двигаемся вправо

time.sleep(0.5)

pyautogui.keyUp('d')

elif current_position[0] > ally_position[0]:

pyautogui.keyDown('a') # Двигаемся влево

time.sleep(0.5)

pyautogui.keyUp('a')



if current_position[1] < ally_position[1]:

pyautogui.keyDown('s') # Двигаемся вниз

time.sleep(0.5)

pyautogui.keyUp('s')

elif current_position[1] > ally_position[1]:

pyautogui.keyDown('w') # Двигаемся вверх

time.sleep(0.5)

pyautogui.keyUp('w')



# Функция для стрельбы по врагам

def shoot_at_enemies(enemy_positions):

for enemy in enemy_positions:

pyautogui.moveTo(enemy) # Перемещаем курсор к врагу

shoot() # Стреляем

time.sleep(0.2) # Небольшая задержка между выстрелами



# Функция для стрельбы (эмулируем нажатие кнопки мыши)

def shoot():

pyautogui.click() # Эмулируем клик мыши
Дополнен 1 неделю назад
# Основной цикл бота
def main():
while True:
ally_positions = find_targets(GREEN_LOWER, GREEN_UPPER) # Поиск союзников
enemy_positions = find_targets(RED_LOWER, RED_UPPER) # Поиск врагов

follow_ally(ally_positions) # Следуем за союзником

if enemy_positions: # Если есть враги
shoot_at_enemies(enemy_positions) # Стреляем по врагам

time.sleep(1) # Задержка перед следующим действием

if __name__ == "__main__":
time.sleep(5) # Время для переключения на игру
main()
3 ответа
Ey Ye Ученик (127) 1 неделю назад
пипец я поражаюсь теми кто шарит в писании кода, мегамозги
ᅠ ᅠ Гуру (3657) 1 неделю назад
В чем ошибка? Откуда хоть код взял?
safsr sdfdsfff Ученик (189) 1 неделю назад
Ваша программа для поиска целей по цвету и управления мышью выглядит вполне убедительно, однако я замечаю несколько возможных ошибок и улучшений.

Первоначально, ваше определение «mask» в функции find_targets для красного цвета неправильно обрабатывает оба диапазона: сначала создается маска для первого диапазона, но затем, если текущий цвет также красный, создается вторая маска. Я рекомендую использовать cv2.add вместо cv2.bitwise_or для сочетания двух масок.

Также вы можете столкнуться с проблемой, если количество контуров в contours будет равно нулю в функции find_targets. Это может вызвать ошибку, если вы попытаетесь обратиться к элементам ally_positions без проверки его длины.

Наконец, в функции follow_ally стоит добавить задержку после движения, чтобы обеспечить более плавное движение. При текущем подходе могут быть непредсказуемые результаты, если последовательно вызывать keyDown и keyUp.

В дальнейшем вам стоит рассмотреть использование исключений для улавливания и обработки возможных ошибок.
Похожие вопросы