(python)cf Feuerlinie zielt auf den roten Namen und feuert automatisch

I. Einleitung

Dies sollte der vierte Artikel in der CF-Reihe sein. Ich habe bereits über KI-Zielen und Logitech-Mausmakros geschrieben. Die Funktionen dieses Artikels sind einfacher als die ersten beiden. Da es nicht viel Code gibt, werde ich keine Klassen und Funktionen schreiben. Ich werde direkt zu Huanglong gehen. Ich habe auch einige Hilfsskripte geschrieben, mit denen die aktuellen Koordinaten und die Farbe der Maus ermittelt und beim Ändern der Auflösung verwendet werden können.

Erforderliche Vorbereitungen : Logitech-Treiber-DLL-Datei und entsprechende Logitech-Treiberversion, ich habe den Link unten eingefügt

Link: https://pan.baidu.com/s/1pd2RjNW6QoOSDRs_3gm1Tw?pwd=6666 
Extraktionscode: 6666

Hinweis : Die Auflösung im Spiel muss hier 1280*720 betragen. Meine Positionskoordinatenparameter werden basierend auf dieser Auflösung angepasst.

2. Code

2.1 Treibercode

Dieser Teil des Codes ruft hauptsächlich die DLL-Datei auf und verwendet die darin gekapselten Methoden, z. B. Bewegen der Maus, Klicken mit der Maus, Tastatur usw. Die Hauptfunktion besteht darin, Aufnahmevorgänge auszuführen, dh automatisch auf die linke Maustaste zu klicken Taste der Maus.

import ctypes
import os


try:
    # 获取当前绝对路径
    root = os.path.abspath(os.path.dirname(__file__))
    driver = ctypes.CDLL(f'{root}/logitech.driver.dll')
    ok = driver.device_open() == 1  # 该驱动每个进程可打开一个实例
    if not ok:
        print('错误, GHUB驱动没有找到')
except FileNotFoundError:
    print(f'错误, DLL 文件没有找到')



class Logitech:

    class mouse:

        """
        code: 1:左键, 2:中键, 3:右键
        """

        @staticmethod
        def press(code):
            if not ok:
                return
            driver.mouse_down(code)

        @staticmethod
        def release(code):
            if not ok:
                return
            driver.mouse_up(code)

        @staticmethod
        def click(code):
            if not ok:
                return
            driver.mouse_down(code)
            driver.mouse_up(code)

        @staticmethod
        def scroll(a):
            """
            鼠标滚轮
            """
            if not ok:
                return
            driver.scroll(a)

        @staticmethod
        def move(x, y):
            """
            相对移动, 绝对移动需配合 pywin32 的 win32gui 中的 GetCursorPos 计算位置
            pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
            x: 水平移动的方向和距离, 正数向右, 负数向左
            y: 垂直移动的方向和距离
            """
            if not ok:
                return
            if x == 0 and y == 0:
                return
            driver.moveR(x, y, True)

    class keyboard:

        """
        键盘按键函数中,传入的参数采用的是键盘按键对应的键码
        code: 'a'-'z':A键-Z键, '0'-'9':0-9
        """

        @staticmethod
        def press(code):

            if not ok:
                return
            driver.key_down(code)

        @staticmethod
        def release(code):
            if not ok:
                return
            driver.key_up(code)

        @staticmethod
        def click(code):
            if not ok:
                return
            driver.key_down(code)
            driver.key_up(code)



class RunLogitechTwo:
    def __init__(self):
        self.log_mouse = Logitech.mouse
        pass

    def quick_move(self):
        # time.sleep(random.randint(1, 3))
        self.log_mouse.click(1)
        # print('hahaha')


2.2 Identifikationscode für den roten Namen

Code-Idee: Verwenden Sie die Funktion mss () der mss-Bibliothek, um während des Vorgangs einen Screenshot des aktuellen Bildschirms zu erstellen, und legen Sie den Wörterbuchmonitorparameter fest, der die Koordinaten der oberen linken Ecke, Breite und Höhe enthält, um den Bereich zu steuern des Screenshots. Hier zeige ich den roten Namen des Feindes an. 16 Pixel werden in der Mitte der 16 Pixel abgefangen. Zwischen diesen 16 Pixeln muss ein rotes Pixelraster vorhanden sein. Sobald einer von ihnen die RGB-Bereichsanforderungen erfüllt, Es springt aus der Schleife und führt die Beurteilung der verbleibenden Pixel nicht durch. Dies spart Ressourcen und verhindert Serienaufnahmen.

Erläuterung des for-Schleifenteils: Die zweischichtige for-Schleife dient dazu, die RGB-Werte der 16 abgefangenen Pixel zur Beurteilung zu durchlaufen. Das bgr-Attribut der zweiten for-Schleife (jedes zerlegte Pixel) enthält 4 Werte, nämlich R , B, G, Transparenz, wir nehmen nur die ersten drei. Machen Sie sich keine Sorgen um die Transparenz. np.array() teilt die 16 Pixelwerte in ein zweidimensionales Array (4 * 4) ähnlich der Form auf einer Matrix, daher sind zwei Ebenen von for-Schleifen ausreichend

Schussverzögerung : Diese Schussverzögerung muss hinzugefügt werden, sonst wird sie definitiv zu schnell. Überprüfen Sie es und Sie können die Geschwindigkeit ändern und es selbst ausprobieren. Meins ist die Verzögerung des Trolls. Die Kanone kann länger eingestellt werden, und die Schusslinie Ein Problem besteht auch darin, dass der rote Name möglicherweise angezeigt wird, wenn Sie in die Nähe dieser Person zielen. Daher müssen Sie auch die Aufnahmeverzögerung einstellen, um den automatischen Aufnahmezeitpunkt auszugleichen.

Beschwerde: Wenn Sie auf einen Feind zielen, ist sein Name ein Farbverlauf von dunkelrot-rot-hellrot-orange. Dieser RGB-Bereich macht es mir leicht, ihn zu finden.

import logitech_test
from mss import mss
import numpy as np
import time
import random




if __name__ == "__main__":
    # 设置检测区域,这里截取整个屏幕
    monitor = {"top": 405, "left": 635, "width": 4, "height": 4}
    # monitor = {"top": 490, "left": 910, "width": 200, "height": 200}  # 反人类的设计,正常左上,他上左
    obj = logitech_test.RunLogitechTwo()
    # 设置目标颜色(示例:红色)
    target_color = np.array([163, 57, 49])  # RGB颜色值
    # 创建截屏对象
    sct = mss()
    while True:
        flag=False
        # 获取屏幕截图
        screen_shot = sct.grab(monitor)
        # 展示
        scr_img = np.array(screen_shot)

        for each_pic in scr_img:
            for bgr in each_pic:
                b, g, r = bgr[:3]
                # rgb参数145,245,47,80,20,57
                if r >= 140 and r <= 245 and g >= 45 and g <= 80 and b >= 20 and b <= 60:
                    time.sleep(random.randint(2, 5) * 0.01)
                    obj.quick_move()
                    flag = True
                    break
            if flag:
                break

3. Hilfswerkzeuge

Mit dem folgenden Skript werden jederzeit die x-, y- und rgb-Koordinatenwerte der aktuellen Mausposition ermittelt und beim Ändern der Auflösung Parameter berechnet.

import pyautogui
from PIL import Image


def test_b():
    # obj = RunLogitechTwo()
    # 默认屏幕为1280 * 720,屏幕中心位置如下
    # x = 640   # 1.18
    # y = 360   # 32.66666
    # 屏幕检测区域
    # region_to_check = (590, 310, 690, 430)
    # x = 636
    # y = 410
    while True:
        x, y = pyautogui.position()  # 获取鼠标当前位置

        # region = (600, 400, 80, 20)
        im = pyautogui.screenshot()  # 返回屏幕的截图,是一个Pillow的image对象

        r,g,b = im.getpixel((x,y))
        print("x:", x, "y:", y, "r:", r,"-g:", g,"-b:", b)


        # img = Image.new('RGB', (300, 300), im.getpixel((x, y)))  # 用获取的颜色创建一张图片
        # img.show()  # 展示当前图片


if __name__ == '__main__':
    test_b()

4. Präsentation des fertigen Produkts

Weil jemand vorgeschlagen hat, dass es besser wäre, dies in eine App zu integrieren. Der Code ist nicht zu groß, also habe ich mir die Zeit genommen, ihn zu integrieren. Das Bild ist wie folgt

Hier habe ich mehrere Parameter angegeben, die geändert werden können

Spielauflösung: Da einige Leute den Standort nach dem Ändern der Auflösung möglicherweise nicht finden können, habe ich diesen Parameter hinzugefügt und er findet den Standort adaptiv. Sie können auch auf Bereich berechnen klicken, um einen roten Namensbereich zu erhalten, der für die aktuelle Situation besser geeignet ist Auflösung. 

Roter Namensbereich: Dies ist der Scanbereich. Wenn Ihre Computerkonfiguration gut ist, können Sie ihn größer einstellen, aber im Allgemeinen reicht die Berechnung des adaptiven Bereichs aus.

Feuerreaktionsrate: Dies wird verwendet, um den Zeitraum zwischen dem Erreichen des roten Namens und dem Schießen zu steuern. Wenn es zu schnell ist, können Sie für eine Stunde in einen kleinen dunklen Raum gehen, um sich abzukühlen. Wenn Sie JU, I spielen Ich empfehle 7-10, da der Mechanismus der Schusslinie Sekunden beträgt. Ein roter Name erscheint in der Nähe des Körpers der Person. Wenn Sie also JU spielen, kann es sein, dass jemand langsam herauskommt. Das erste, worauf Sie zielen, ist also die Luft. Fügen Sie also entsprechend etwas Verzögerung hinzu, und andere Gewehre und Sprühgeräte werden dies tun. Lassen Sie es einfach auf der Standardeinstellung, Sie müssen nicht darüber nachdenken

Wenn Sie interessiert sind oder Fragen dazu haben, können Sie mir schließlich eine E-Mail-Nachricht senden und ich werde antworten, sobald ich sie sehe.

 

5. Zusammenfassung

Lassen Sie mich noch etwas Wichtiges sagen. Wenn Sie meinen Code verwenden möchten, muss die Auflösung im Spiel auf 1280*720 angepasst werden, da ich die Pixelposition basierend auf dieser Auflösung nehme. Wenn Sie eine andere Auflösung verwenden möchten, re- Erstellen Sie es selbst. Berechnen Sie es einfach, es ist nicht schwierig. Finden Sie die Koordinatenposition des roten Namens in der neuen Auflösung erneut. Wenn Sie die Koordinatenposition des roten Namens in der neuen Auflösung nicht finden können, empfehle ich Ihnen, die anzupassen Die Auflösung des Computers muss mit der des Spiels übereinstimmen. Machen Sie dann einen Screenshot im Spiel, stellen Sie das Screenshot-Foto auf Vollbild ein und schalten Sie dann die Hilfswerkzeuge ein, um die Koordinaten und RGB zu erhalten, damit Sie es genau wissen können ( das habe ich getan)

Und wenn es etwas gibt, das Sie immer noch nicht verstehen, mit dem Sie Schwierigkeiten haben oder das Sie verbessern können, können Sie mich per E-Mail kontaktieren und wir können gemeinsam Fortschritte machen, [email protected]

Je suppose que tu aimes

Origine blog.csdn.net/calmdownn/article/details/132003851
conseillé
Classement