نكتب روبوت الصيد في لعبة ألبيون على الإنترنت في بيثون

صورة

مرحباً بالجميع ، أنا مستخدم سعيد لنظام التشغيل GNU / Linux ، وكما يعلم الكثير من الناس ، هناك عدد أقل بكثير من الألعاب التي تذهب إلى Linux دون رقصات إضافية مع الدف في نظام Windows.

وحتى عدد أقل من الألعاب في هذا النوع من الألعاب.

ومع ذلك ، قبل حوالي نصف عام أو عام ، اكتشفت أن لعبة Albion Online كانت موصولة بنظام Linux.
اللعبة مسلية للغاية ، ولكنها تستغرق وقتًا كبيرًا إلى حد ما. ولكي لا أضيع ساعات حياتي الثمينة عبثًا ، قررت أن أكتب روبوتًا. الذي سوف تزرع لي الموارد بينما أذهب عن عملي.

تحتوي اللعبة على العديد من أنواع الحرف ، يمكنك قص الخشب وحفر الأحجار وحتى زراعة الحدائق ، لكن خياري كان صالحًا لصيد الأسماك.

لذلك ، فإن جوهر الصيد في ألبيون عبر الإنترنت بسيط ، خذ قضيب صيد ، اذهب إلى البركة ، استمر في الضغط على الزر لرمي الطعم ، انتظر وقتًا معينًا.

صورة

عند النقر ، يجب عليك مرة أخرى الضغط على الأزرار ولعب لعبة صغيرة.

هنا سوف تحتاج إلى سحب بالتناوب ، ثم لا تسحب قضيب الصيد ، وهذا يتوقف على حركات العائمة. يتحرك العائم دائمًا بشكل عشوائي ، مع تتابعات وسرعات مختلفة. وإذا فعلت كل شيء بشكل صحيح ولم يتجاوز العائم المنطقة المسموح بها ، فسوف تصطاد السمك.

لذلك ، فإننا سوف أتمتة كل هذا العمل. عن طريق لغة الكمبيوتر بيثون. قررت أن أبدأ من أصعب الأمور ، أي منذ اللحظة التي تبدأ فيها اللعبة بالطفو. هنا مرة أخرى ، جاءت مكتبة رؤية الكمبيوتر OpenCV المفضلة لإنقاذي . من خلال إطلاقه ، يمكننا اكتشاف الكائنات ، على سبيل المثال ، في الصور. ومع ذلك ، فإن المكتبة نفسها لا تعرف بالضبط ما نحتاج إلى اكتشافه. بالطبع ، هناك العديد من الأنماط حيث يتم تقديم كائنات مختلفة لتحديدها. ومع ذلك ، لا يوجد بالتأكيد عوامات لـ Albion Online.

ولكن في هذه المكتبة هناك وظيفة بحث رائعة لقالب معين. وكقالب ، أخذت للتو لقطة من تعويمنا.

صورة

وكما نرى تم العثور على كل شيء تماما في الصورة.

والفرق بين الصورة والفيديو المتدفق ليس كبيرًا ، لأنه في الحقيقة مجرد دفق من الصور بسرعة كبيرة جدًا ، وبضعة أسطر من الشفرات. والآن يمكننا أن نجد بالفعل تعويم على دفق الفيديو.

قانون
import numpy as np import cv2 from mss.linux import MSS as mss from PIL import Image import time import pyautogui as pg import cv2 import mss import numpy template = cv2.imread("2019-07-02_06-55_1.png", cv2.IMREAD_GRAYSCALE) w, h = template.shape[::-1] with mss.mss() as sct: monitor = {"top": 40, "left": 0, "width": 800, "height": 640} while "Screen capturing": last_time = time.time() img = numpy.array(sct.grab(monitor)) cv2.imshow("OpenCV/Numpy normal", img) print("fps: {}".format(1 / (time.time() - last_time))) gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(gray_frame, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= 0.7) for pt in zip(*loc[::-1]): cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3) cv2.imshow("Frame", img) key = cv2.waitKey(1) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() break 


نذهب أبعد من ذلك. يتحرك العوم نفسه ذهابًا وإيابًا ونحتاج أيضًا إلى تحريكه عن طريق الضغط على الزر الموجود بالماوس.

وبالتالي ، نحن بحاجة إلى إحداثياتها. ولهذا ، فإن هذه الخطوط تساعدنا.

 for p in img: pts = (pt[0],pt[1]) x = (pt[0]) y = (pt[1]) print (x) cv2.circle(template,pts,5,(200,0,0),2) cv2.putText(img, "%d-%d" % (x,y), (x+10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2) 

ثم نستخدم مكتبة PyAutoGUI ، والتي ستحكم زر الماوس وتضغط عليه بتردد معين.

 if 100 < x < 500: pyautogui.mouseDown(button='left') time.sleep(1) pyautogui.mouseUp(button='left') x = 0 

واللعبة المصغرة نفسها فازت بنجاح.

صورة

نضع كل شيء في وظيفة ونتركها الآن.

ثم نعود إلى الجزء الأصلي ، حيث يجب علينا مراقبة التعويم.

الأمر مختلف تمامًا ، على سبيل المثال ، يمكننا تحديد مكان طرح الطفو ومحاولة تحليل هذا الجزء من الشاشة لوجود الطفو. ومع ذلك ، فإن تعويم ألقيت في الماء يظهر في زوايا مختلفة ويتأرجح باستمرار.

في هذه الحالة ، سنتخذ هذه الطريقة مختلفة قليلاً. جوهرها هو أننا نحلل ، دعنا نقول الفرق في بكسل داخل جزء مجنزرة. الذي ، إذا لم يكن هناك تعويم ، يقترب من الصفر.

نتيجةً لذلك ، تم العثور على القيمة المثلى التي يمكننا من خلالها تنفيذ الإجراءات مع اختفاء العائمة.

قانون
 def screen_record(): sct = mss.mss() last_time = time.time() while(True): img = sct.grab(mon) print('loop took {} seconds'.format(time.time() - last_time)) last_time = time.time() img = np.array(img) processed_image = process_image(img) mean = np.mean(processed_image) print('mean = ', mean) if mean <= float(0.11): print('SSSSSSSS ') pyautogui.click(button='left') break return else: time.sleep(0.01) continue return if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break 


ونحن ننتجها ، أي النقر على زر الماوس. نحن أيضا وضع هذا في وظيفة.

وأخيراً ، في الختام ، نكتب ببساطة نصًا حيث في حلقة لا نهائية نلقي بقضيب صيد ونقوم بالوظائف الأولى والثانية بالتناوب.

 while "": time.sleep(1) pyautogui.moveTo(431,175,duration=1) pyautogui.mouseDown(button='left') pyautogui.moveTo(450.200,duration=1) pyautogui.mouseUp(button='left') time.sleep(2) screen_record() time.sleep(0.01) ss() 

إليك تعليمات فيديو كاملة ومثال عن عمل هذا الروبوت:


هناك بالفعل بعض الفروق الدقيقة التي تحتاج إلى إزالتها باستخدام الأرقام ، حيث يتم تحديد هذه الأرقام لجهاز العرض والموقع والشخصية والمعدات. لكنني أعتقد أن هذا لن يكون مشكلة بالنسبة للثعبان المختص.

النص كله:

قانون
 import numpy as np import cv2 from mss.linux import MSS as mss from PIL import Image import time import pyautogui as pg import imutils import mss import numpy import pyautogui template = cv2.imread("2019-07-02_06-55_1.png", cv2.IMREAD_GRAYSCALE) w, h = template.shape[::-1] color_yellow = (0,255,255) mon = {'top': 80, 'left': 350, 'width': 100, 'height': 100} def process_image(original_image): processed_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) processed_image = cv2.Canny(processed_image, threshold1=200, threshold2=300) return processed_image def ss(): op = 1 with mss.mss() as sct: monitor = {"top": 40, "left": 0, "width": 800, "height": 640} while "Screen capturing": last_time = time.time() img = numpy.array(sct.grab(monitor)) gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(gray_frame, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= 0.7) op += 1 print (op) for pt in zip(*loc[::-1]): cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3) for p in img: pts = (pt[0],pt[1]) x = (pt[0]) y = (pt[1]) print (x) if 100 < x < 490: pyautogui.mouseDown(button='left') time.sleep(2) pyautogui.mouseUp(button='left') x = 0 break else: continue break else: continue break key = cv2.waitKey(1) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() if op > 35: return def screen_record(): sct = mss.mss() last_time = time.time() while(True): img = sct.grab(mon) print('loop took {} seconds'.format(time.time() - last_time)) last_time = time.time() img = np.array(img) processed_image = process_image(img) mean = np.mean(processed_image) print('mean = ', mean) if mean <= float(0.11): print('SSSSSSSS ') pyautogui.click(button='left') break return else: time.sleep(0.01) continue return if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break while "": time.sleep(1) pyautogui.moveTo(431,175,duration=1) pyautogui.mouseDown(button='left') pyautogui.moveTo(450.200,duration=1) pyautogui.mouseUp(button='left') time.sleep(2) screen_record() time.sleep(0.01) ss() 


أولئك الذين يحبون أن يقولوا أن هذا مضيعة للوقت ، وسوف ألاحظ أن هذه ليست سوى أداة ، يمكنك استخدام هذه المكتبات في مشاريع أخرى. تستخدم رؤية الكمبيوتر نفسها في تحريك الصواريخ الباليستية وفي البرامج لمساعدة الأشخاص ذوي الإعاقة. حيث تقرر تطبيقها ، فقط رغبتك.

شكرا لكم جميعا على اهتمامكم.

Source: https://habr.com/ru/post/ar459110/


All Articles