main.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import webbrowser
  2. from mss import mss
  3. import numpy as np
  4. from time import sleep, time
  5. import pyautogui as gui
  6. import sched
  7. import cv2
  8. cv2.namedWindow('View', cv2.WINDOW_NORMAL)
  9. DEFAULT_MONITOR = 3
  10. DEBUG = True
  11. scheduler = sched.scheduler(time, sleep)
  12. dilation_kernel = np.array([[0,0,0], [1, 1, 1], [0,0,0]]).astype('uint8')
  13. def take_screenshot(sct, monitor=DEFAULT_MONITOR):
  14. monitor = sct.monitors[monitor]
  15. image = np.array(sct.grab(monitor))
  16. return image
  17. def take_binaryScreenshot(sct, monitor: dict):
  18. image = np.array(sct.grab(monitor))
  19. binaryScreen = np.zeros(image.shape[:-1])
  20. binaryScreen[np.all(image == (83, 83, 83, 0), axis=2)] = 1
  21. binaryScreen = cv2.erode(binaryScreen, None, iterations=1)
  22. binaryScreen = cv2.dilate(binaryScreen, None, iterations=1)
  23. return binaryScreen
  24. def binary_to_RGB(image):
  25. rgb_image = np.zeros((*image.shape, 3))
  26. rgb_image[image == 1] = (255, 255, 255)
  27. return rgb_image
  28. def open_dino(sct):
  29. prevScreen = take_screenshot(sct)
  30. webbrowser.open('https://chromedino.com/')
  31. sleep(1)
  32. Screen = take_screenshot(sct)
  33. while np.any(Screen != prevScreen):
  34. cv2.imshow('View', Screen)
  35. cv2.waitKey(1)
  36. sleep(1)
  37. prevScreen = Screen.copy()
  38. Screen = take_screenshot(sct)
  39. print('loaded')
  40. def shortest_jump():
  41. with gui.hold('space'):
  42. sleep(0.1)
  43. take_down()
  44. def short_jump():
  45. with gui.hold('space'):
  46. sleep(0.15)
  47. take_down()
  48. def long_jump():
  49. with gui.hold('space'):
  50. sleep(0.2)
  51. take_down()
  52. def take_down():
  53. with gui.hold('down'):
  54. sleep(0.04)
  55. def jump(sec):
  56. print('jump suka jump')
  57. with gui.hold('space'):
  58. sleep(sec)
  59. take_down()
  60. def get_playing_bbox(sct):
  61. Screen = take_screenshot(sct)
  62. binaryScreen = np.zeros(Screen.shape[:-1])
  63. binaryScreen[np.all(Screen == (83, 83, 83, 0), axis=2)] = 1
  64. short_jump()
  65. sleep(1)
  66. binScreen = take_binaryScreenshot(sct, sct.monitors[DEFAULT_MONITOR])
  67. x, y = np.where(binScreen == 1)
  68. mw = (y.max()-y.min()) // 100
  69. mh = (x.max()-x.min()) // 100
  70. playing_bbox = {'left':y.min()-2*mw, 'top':x.min()+15*mh, 'width':(y.max()-y.min())+4*mw, 'height':(x.max()-x.min())+10*mh}
  71. return playing_bbox, mw, mh
  72. def to_bbox(bin_image):
  73. bin_image = cv2.dilate(bin_image, dilation_kernel, iterations=4)
  74. labels, labeledScreen = cv2.connectedComponents(bin_image.astype('uint8'))
  75. for label in range(1, labels):
  76. x,y = np.where(labeledScreen==label)
  77. bin_image[x.min():x.max()+1, y.min():y.max()+1] = 1
  78. return bin_image
  79. if __name__ == '__main__':
  80. with mss() as sct:
  81. open_dino(sct)
  82. gui.hotkey('fn', 'f11')
  83. sleep(0.1)
  84. playing_bbox, pw, ph = get_playing_bbox(sct)
  85. binScreen = take_binaryScreenshot(sct, playing_bbox)
  86. binScreen = to_bbox(binScreen)
  87. labels, labeledScreen = cv2.connectedComponents(binScreen.astype('uint8'))
  88. if DEBUG: rgbScreen = binary_to_RGB(binScreen)
  89. dino_label = min(range(1,labels), key=lambda x: np.where(labeledScreen==x)[1].min())
  90. dino_pos = np.where(labeledScreen==dino_label)
  91. dino_max_x = dino_pos[1].max()
  92. dino_min_y = dino_pos[0].max()
  93. dino_max_y = dino_pos[0].min()
  94. dino_min_x = dino_pos[1].min()
  95. coef = 3
  96. trigger_time = (int(dino_pos[0].mean()), dino_max_x + 18*pw)
  97. trigger_jump = (int(dino_pos[0].mean()), dino_max_x + 8*pw)
  98. trigger_feather_time = (dino_max_y-5*ph, dino_max_x + 23*pw)
  99. trigger_feather_take = (dino_max_y-5*ph, dino_max_x + 13*pw)
  100. enter_time = None
  101. enter_time_feather = None
  102. jump_time = None
  103. take_time = None
  104. start = time()
  105. start2 = time()
  106. last_screen = None
  107. speed = 0
  108. stop_speeding = False
  109. if DEBUG: cv2.imshow('View', rgbScreen)
  110. while True:
  111. binScreen = take_binaryScreenshot(sct, playing_bbox)
  112. binScreen = to_bbox(binScreen)
  113. labels, labeledScreen = cv2.connectedComponents(binScreen.astype('uint8'))
  114. if not enter_time and binScreen[trigger_time] != 0:
  115. enter_time = time()
  116. elif enter_time and binScreen[trigger_time] == 0:
  117. jump_time = (time() - enter_time) / coef
  118. enter_time = None
  119. if binScreen[trigger_jump] != 0:
  120. gui.press('space')
  121. if jump_time:
  122. sleep(jump_time)
  123. gui.press('down')
  124. jump_time = None
  125. if not enter_time_feather and binScreen[trigger_feather_time] != 0:
  126. enter_time_feather = time()
  127. elif enter_time_feather and binScreen[trigger_feather_time] == 0:
  128. take_time = time() - enter_time_feather
  129. enter_time_feather = None
  130. if binScreen[trigger_feather_take] != 0:
  131. print('take')
  132. print(take_time)
  133. with gui.hold('down'):
  134. sleep(take_time*4)
  135. take_time = None
  136. if (time() - start)*coef > 25*3.3 and stop_speeding == False:
  137. if (time() - start) < 10.2: stop_speeding = True
  138. print(time() - start)
  139. trigger_jump = (trigger_jump[0], trigger_jump[1]+pw)
  140. trigger_time = (trigger_time[0], trigger_time[1]+pw)
  141. trigger_feather_take = (trigger_feather_take[0], trigger_feather_take[1]+int(pw*1.4))
  142. trigger_feather_time = (trigger_feather_time[0], trigger_feather_time[1]+int(pw*1.4))
  143. start = time()
  144. if (time() - start2)*coef > 9*3.3 and stop_speeding == False:
  145. print(time() - start2)
  146. coef += 0.2
  147. start2 = time()
  148. if DEBUG:
  149. rgbScreen = binary_to_RGB(binScreen)
  150. cv2.circle(rgbScreen, trigger_time[::-1], radius=2, color=(255, 0, 0), thickness=2)
  151. cv2.circle(rgbScreen, trigger_jump[::-1], radius=2, color=(0, 255, 0), thickness=2)
  152. cv2.circle(rgbScreen, trigger_feather_time[::-1], radius=2, color=(255, 0, 0), thickness=2)
  153. cv2.circle(rgbScreen, trigger_feather_take[::-1], radius=2, color=(0, 255, 0), thickness=2)
  154. cv2.imshow('View', rgbScreen)
  155. if cv2.waitKey(1) == ord('q'): break
  156. # print(speed)
  157. # last_screen = binScreen.copy()
  158. cv2.destroyAllWindows()