lumberjackBot/lumberjackBot.py
2021-02-26 21:28:07 +08:00

72 lines
2.6 KiB
Python

import pyautogui
import time
from PIL import ImageGrab
# monkey patch
pyautogui.pyscreeze.ImageGrab = ImageGrab
pyautogui.pyscreeze.screenshot = pyautogui.pyscreeze._screenshot_win32
class lumberjackBot():
__author__ = "EnriqueMoran"
def __init__(self, x, y):
self.branch_width = 60
self.vertical_branch_distance = 70
self.to_match = (169, 113, 65)
self.speed = 0.08
self.sleep = 0.083
self.sleep_min = 0.078
self.sleep_max = 0.090
self.xl = x - self.branch_width
self.xr = x + self.branch_width
self.y = y
def get_pixel(self):
scrshot = ImageGrab.grab()
m = lambda x: scrshot.getpixel(x) == self.to_match
match_l = any(filter(m, [(self.xl, self.y-offset) for offset in range(self.vertical_branch_distance)]))
match_r = any(filter(m, [(self.xr, self.y-offset) for offset in range(self.vertical_branch_distance)]))
return (match_l, match_r)
def play(self):
last = [True]*5
pyautogui.typewrite(['right', 'right'], self.speed)
while True:
match_l, match_r = self.get_pixel()
if match_l:
print('left match')
pyautogui.typewrite(['right', 'right'], self.speed)
elif match_r:
print('right match')
pyautogui.typewrite(['left', 'left'], self.speed)
else:
if not last[-1]:
pyautogui.typewrite(['right', 'right'], self.speed)
print('!! no match')
last.append(match_l or match_r)
while len(last) > 5:
del last[0]
stutter = len(list(filter(lambda x: not x, last)))
if stutter == 0 and self.sleep > self.sleep_min:
self.sleep -= 0.001
print('dec sleep', self.sleep)
elif stutter > 1 and self.sleep < self.sleep_max:
self.sleep += 0.001
print('inc sleep', self.sleep)
if not any(filter(lambda x: x, last)):
print('dead')
break
time.sleep(self.sleep)
if __name__ == "__main__":
pyautogui.PAUSE = 0
print("Running in 3 seconds, minimize this windows. To stop the program drag the mouse to the top-left corner of your screen.")
time.sleep(3)
x, y = pyautogui.locateCenterOnScreen('branch.png')
pyautogui.moveTo(x, y)
time.sleep(0.3)
print("Im playing...")
lumberjack = lumberjackBot(x, y)
lumberjack.play()