영광에 누울 수있는이 비법을 배우는 것은 문제가되지 않습니다

 

컴퓨터 게임을 해본 학생들은 확실히 플러그인에 익숙하지 않지만, 플러그인을 사용할 때 플러그인을 만드는 방법에 대해 생각해 본 적이 있는가? 그런 다음 파이썬으로 플러그인을 만드는 방법을 살펴 보자.

컴퓨터 게임을 해본 급우들은 확실히 플러그인에 익숙하지 않지만 플러그인을 사용할 때 어떻게 만드는지 생각해 본 적이 있습니까? (물론 플러그인을 사용하는 것은 그다지 도덕적이지 않습니다. 하하) 그러면 파이썬을 사용하여 플러그인을 만드는 방법을 살펴 보겠습니다. . . .

4399 미니 게임 네트워크를 열고 알 수없는 게임을 클릭했습니다. 음, 스시가 옆에 있습니다. 옆에 재료가 있습니다. 손님이 다가 오면 요구 사항을 알려주세요. 메뉴에 따라 그에게 주면됩니다. ~ 왜 그렇게 어려운가요? 8 가지 메뉴가 기억 나지 않아서 잘못된 메뉴 만 클릭하면 마우스가 근육의 긴장이나 부상을 입힐만큼 좋지 않습니다 ...

우선 여기에있는 게임 플러그인의 개념이 대형 온라인 게임의 플러그인과 다르다는 점을 말해야합니다. 자동으로 몬스터를 죽일 수없고, 마약을 마실 수없고, GM을 피할 수 없습니다. 이 플러그인을 사용 하시겠습니까? 좋은 질문입니다. 쓸모가 없습니다. 시간을 낭비하고 프로그래밍 기술을 향상시키고 플러그인 기반에 약간을 추가하는 것 외에는 쓸모가 없습니다. 슈퍼 신의 플러그인을 목표로 설정하면 실망 하실까 봐 걱정 되니 최대한 빨리 우회 해주세요. 제 목적은 매우 간단합니다.이 작은 게임을 자동으로 플레이하는 것입니다.

도구 준비

autopy 및 PIL 및 pywin32 패키지를 설치해야합니다. Autopy는 일부 마우스 및 키보드 이벤트를 시뮬레이션하고 화면에 액세스 할 수있는 자동화 된 작업을위한 Python 라이브러리입니다. 원래는 입력 이벤트를 시뮬레이션하기 위해 win32api를 사용하고 싶었습니다.이 방법이 비교적 사용하기 쉽다는 것을 알았습니다. 문제는 크로스 플랫폼이라는 것입니다. 네, 검색하고 설치하십시오 .PIL은 Python 이미지 처리의 No.1로 유명합니다. 다음에서는이를 사용하여 수행 할 작업을 설명합니다 .pywin32는 실제로 필요하지 않지만 편의상 ( 마우스가 저절로 움직입니다. 끝내는 방법 음), 설치하는 것이 좋습니다. 예, win 플랫폼에서 수행했습니다. 플러그인은 Windows 사용자에게만 필요합니까?

화면 캡처 및 이미지 처리 도구

화면 캡처는 게임 힌트 분석을위한 게임 이미지를 얻기위한 것으로, 실제로 화면을 직접 인쇄하여 이미지 처리 도구에 붙여 넣을 수있는 특별한 도구는 없습니다. 저는 사용하기 매우 쉬운 PicPick을 사용하고 있으며 개인 사용자에게는 무료이며, 영상 처리는 다양한 정보를 얻기위한 것입니다. 주문 이미지를 얻기 위해 사용하고 외부 분석과 판단을 위해 저장해야합니다. 저는 PhotoShop을 사용합니다 ... 사실, PicPick에 내장 된 이미지 편집기로 충분합니다. 이미지 좌표를보고 사진을 클립 할 수있는 한 배고프지 만 익숙합니다. 추신 ~

편집자

나는 이것에 대해 말할 필요가 없습니다. 코드를 작성하려면 편집기가 필요합니다! 워드 패드를 사용하려면 VIM을 사용합니다.

원리 분석

플러그인의 역사에 대해 이야기하고 싶지 않습니다. 관심이 있으시면 Google 또는 Du Niang으로 문의하십시오 (참고 : 기술적 인 문제가 아닌 경우 Baidu를 사용할 수 있음).

이 게임을 보면 8 가지 종류의 요리가 있고, 각각의 요리는 고정 된 방법이 있습니다. 고객이 앉으면 머리 위에 그림이 보일 것입니다. 그림을보고 그가 주문하고 싶은 요리를 알 수 있습니다. 왼쪽에있는 원재료 부분을 클릭 한 후 클릭 ...… 이름을 모르겠어요, 대나무 전표 같고, 접시가 완성 된 다음 준비된 음식을 고객에게 드래그합니다.

고객의 머리에 표시되는 사진의 위치는 고정되어 있고 총 4 개의 위치 만 있습니다. 하나씩 분석이 가능하고 원재료의 위치도 고정되어 있습니다. 각 접시의 방법이 더 명확 해져 이 프로그램은 우리가 맛있는 요리를 만들고 하나씩 제공하는 데 도움이 될 수 있습니다.

autopy 소개

github에 대한 아주 좋은 입문 기사가 있습니다. 영어로되어 있지만 매우 간단하지만 이번에는 제가 매우 열심히 일하고 있음을 보여주기 위해 몇 가지 설명을하겠습니다.

마우스 이동

import autopy
autopy.mouse.move(100, 100) # 移动鼠标
autopy.mouse.smooth_move(400, 400) # 平滑移动鼠标(上面那个是瞬间的)

이 명령은 마우스를 지정된 화면 좌표로 빠르게 이동시킵니다. 화면 좌표가 무엇인지 알고 있습니까? 왼쪽 상단 모서리는 (0,0)이고 오른쪽 아래로 증가하므로 오른쪽 아래의 좌표가 1024 × 768 화면의 모서리는 ... 당신은 당신이 그것을 짐작했습니다, 그렇습니다 (1023,767).

안타깝게도 실제로이 명령을 사용하고 autopy.mouse.get_pos ()를 사용하여 현재 좌표를 얻으면 (100,100)이 아니라 더 작다는 것을 알 수 있습니다. 기계., 99), 해상도와 관련이 있습니다. 이 움직임은 사용자와 윈도우의 mouse_event 함수를 기반으로합니다. API를 모르는 경우이를 아는 것이 좋지만 좌표가 정확하지 않습니다. 저처럼 궁금하다면 autopy의 소스 코드를 읽을 수 있습니다. 절대 좌표를 계산하는 그의 알고리즘이 문제가 있음을 발견했습니다.

point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);

먼저 나누고 여기에서 곱하십시오. 약간의 계산 방법을 배운 사람들은 정수 연산의 경우 곱하고 나누기, 그렇지 않으면 상대적으로 큰 오류가 발생한다는 것을 알아야합니다.

point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);

이론적으로는 조금 느리지 만 좀 더 정확 하겠지만 코드를 변경하고 다시 컴파일하기에는 너무 게으르다. 몇 픽셀이 짧아서 우리에게별로 영향을주지 않을 것이다 ~ 우리 교훈을 배우자.

마우스 클릭

#引入autopy模块
# ***
import autopy
autopy.mouse.click() # 单击
autopy.mouse.toggle(True) # 按下左键
autopy.mouse.toggle(False) # 松开左键

 

이것은 비교적 간단하지만 여기에서의 작업은 매우 매우 빠르다는 것을 기억하십시오. 게임이 반응하지 않고 끝낸 후 실패 할 수 있습니다 ... 그러니 필요하다면 잠시 잠을 자세요.

키보드 작동

어떻게하나요? 고객의 머릿속에서 이미지를 분석하기 만하면 이미지 획득부터 시작하겠습니다 ~

좋아하는 이미지 편집기를 열고 측정을 시작하세요 ~ 화면에서 이미지의 특정 위치를 알아야합니다. 자로 측정 할 수 있습니다. 직접 측정도 가능하지만 왼쪽 상단 모서리에있는 위치를 사용했습니다. 화면 (즉, 점 1).) 기준 위치로 사진이 변경되면 한 점의 좌표 만 수정하면됩니다. 그렇지 않으면 각 점을 다시 쓰는 것이 행복하지 않습니다.

가장 왼쪽에있는 고객 아바타의 이미지를 보면이 범위를 결정하기 위해 두 개의 포인트가 필요합니다. 즉, 이미지의 왼쪽 상단 모서리와 오른쪽 하단 모서리, 즉 포인트 2와 포인트 3입니다. 뒷면에는 세 개의 고객 위치가 있으며 단순히 증분 만 추가하면됩니다. for 루프가 탄생했습니다!

마찬가지로 원재료의 위치, "대나무 매트"의 위치 등을 모두이 방법으로 얻을 수 있습니다. 얻은 모든 것은 게임 화면의 왼쪽 상단 모서리에 상대적인 위치입니다. 이미지 캡처 방법은 PIL의 ImageGrab이 사용하기 매우 쉽고 autopy도 이미지를 캡처 할 수 있습니다. 사용하지 않는 이유는 다음과 같습니다.

이미지 분석

플러그인에서 매우 어려운 질문이 생겼습니다. 우리가 얻은 이미지가 어떤 요리인지 어떻게 알 수 있습니까? 인간의 눈은 ... 개 눈도 "한 눈에 알 수 있습니다"라는 매우 쉬운 질문입니다! 예, 여기가 인간이 기계보다 나은 곳입니다 우리는 아주 단순한 일을하지만 컴퓨터는 어리 석고 불분명합니다.

Autopy 이미지 제한

autopy api를 읽었다면 큰 이미지에서 작은 샘플 이미지를 찾는 find_bitmap 메소드가있는 비트 맵 패키지가 있음을 알 수 있습니다. 현명합니다. 생각할 수 있습니다. 전체 게임 화면을 잘라낸 다음이 방법을 사용하여 모든 요리의 작은 이미지를 준비하여 어떤 요리가 호출되었는지 알아낼 수 있습니다. 사실 처음에는이 작업을하고 싶은 충동이 있었지만 즉시 포기했습니다.이 방법은 속도는 말할 것도없고 "정확히 일치"라는 조건이있는 이미지를 찾습니다. 이미지에 픽셀이 있습니다. RGB 값이 1 씩 다릅니다. 알 수 없습니다. 우리는 플래시가 벡터 드로잉이라는 것을 알고 있습니다. 확대 / 축소 후 화면에 도트 매트릭스 그림을 표시합니다. 여기에있는 변수는 매우 큽니다. 이론적으로 동일한 입력과 동일한 알고리즘의 결과는 동일해야하지만 그리기 배경 기다림의 관계에는 항상 약간의 차이가있을 것이며,이 멋진 기능을 사용할 수 없게 만드는 것은이 작은 차이입니다 ...

글쎄, 그것을 사용하지 않는 것이 좋은 것입니다. 그렇지 않으면 어떻게 우리의 스마트 이미지 분석 알고리즘으로 이어질 수 있습니까?

유사성 이미지 검색 원리

Google의 "이미지로 검색"기능을 사용 했음이 틀림 없다고 생각합니다. 그렇지 않다면 오래된 것입니다. 그림을 입력하면이 그림과 유사한 모든 이미지가 보여 지므로 마음에 드는 그림을 찾았고 너무 작다고 생각되면 기본적으로이 방법을 사용하여 올바른 그림을 찾을 수 있습니다.

def get_hash(self, img):
   #使用PIL模块缩放图片,***
  image = img.resize((18, 13), Image.ANTIALIAS).convert("L")
   pixels = list(image.getdata())
  avg = sum(pixels) / len(pixels)
   return "".join(map(lambda p : "1" if p > avg else "0", pixels))

이것은 클래스의 메소드이기 때문에 self 매개 변수가 있고 무시합니다. 여기에있는 img는 이미지 객체로 전달되어야합니다. 이미지 파일을 읽거나 스크린 샷을 찍은 결과 일 수 있습니다. 크기 (18,13)는 고객의 아바타에있는 요리의 이미지가 기본적으로이 비율이기 때문에 실제 상황에 따라 제가 결정합니다. 사실은이 비율이 여전히 매우 중요하다는 것을 증명했습니다. 왜냐하면 우리의 요리는 약간 비슷하기 때문입니다. 비율이 적절하지 않으면 압축 후에 왜곡되고 오판하기 쉽습니다 (이전에 겪었습니다).

그림의 "지문"을 얻은 후 표준 그림 지문과 비교할 수 있으며,이를 비교하려면 두 문자열의 해당 위치에있는 서로 다른 문자의 수인 "해밍 거리"를 사용해야합니다. 구현도 매우 간단합니다 ...

def hamming_dist(self, hash1, hash2):
return sum(itertools.imap(operator.ne, hash1, hash2))

자, 준비된 표준 이미지를 사용하여 미리 계산 된 기능 코드를 읽고 저장 한 다음 스크린 샷과 비교해 볼 수 있습니다. 거리가 가장 작은 것이 해당 요리입니다. 코드는 다음과 같습니다.

def order(self, i):
    l, t = self.left + i * self.step, self.top
    r, b = l + self.width, t + self.height
    hash2 = self.get_hash(ImageGrab.grab((l, t, r, b)))
    (mi, dist) = None, 50
    for i, hash1 in enumerate(self.maps):
      if hash1 is None:
        continue
      this_dist = self.hamming_dist(hash1, hash2)
      if this_dist < dist:
        mi = i
        dist = this_dist
    return mi

초기 거리는 50입니다. 캡처 한 이미지가 메뉴와 비교하여 50보다 큰 경우 어떤 의미입니까? 그 위치의 이미지는 요리가 아니라는 것을 설명합니다. 즉, 고객이 아직 그 위치에 앉지 않았거나 게임을 최소화했습니다 (상사가오고 있음). 처리하는 것이 매우 중요합니다. 가장 가까운 것을 무작위로 찾으십시오. 그러나 전혀 아닙니다. 반찬이 처리됩니다.

자동 조리

문제는 매우 간단합니다. 메뉴의 재료를 기록하고 해당 위치를 클릭하기 만하면됩니다. 호출 할 클래스로 작성했습니다.

class Menu:
  def __init__(self):
    self.stuff_pos = []
    self.recipes = [None] * 8
    self.init_stuff()
    self.init_recipe()
  def init_stuff(self):
    for i in range(9):
      self.stuff_pos.append( (L + 102 + (i % 3) * 42, T + 303 + (i / 3) * 42) )
  def init_recipe(self):
    self.recipes[0] = (1, 2)
    self.recipes[1] = (0, 1, 2)
    self.recipes[2] = (5, 1, 2)
    self.recipes[3] = (3, 0, 1, 2)
    self.recipes[4] = (4, 1, 2)
    self.recipes[5] = (7, 1, 2)
    self.recipes[6] = (6, 1, 2)
    self.recipes[7] = (8, 1, 2)
  def click(self, i):
    autopy.mouse.move(self.stuff_pos[i][0] + 20, self.stuff_pos[i][1] + 20)
    autopy.mouse.click()
  def make(self, i):
    for x in self.recipes[i]:
      self.click(x)
    autopy.mouse.move(L + 315, T + 363)
    autopy.mouse.click()

오늘 공유 한 콘텐츠입니다. 관심이 있으시면 시도해보세요.

저는 Python 개발 엔지니어이며 웹 개발, 크롤러, 데이터 분석, 데이터 시각화, 기계 학습 및 인터뷰 컬렉션에 대한 기본 Python 스크립트를 포함하여 최신 Python 시스템 학습 자습서 세트를 컴파일했습니다. 이 자료를 원하는 사람들은 편집자에게주의를 기울이고 Q skirt 851211580을 추가하여 Python 학습 자료와 학습 비디오를 선택하고 위대한 신의 온라인 안내를받을 수 있습니다!

 

추천

출처blog.csdn.net/pyjishu/article/details/105417674