main.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. from collections import namedtuple
  9. cv2.namedWindow('View', cv2.WINDOW_NORMAL)
  10. DEFAULT_MONITOR = 3
  11. DEBUG = True
  12. scheduler = sched.scheduler(time, sleep)
  13. dilation_kernel = np.array([[0,0,0], [1, 1, 1], [0,0,0]]).astype('uint8')
  14. def take_screenshot(sct, monitor=DEFAULT_MONITOR):
  15. monitor = sct.monitors[monitor]
  16. image = np.array(sct.grab(monitor))
  17. return image
  18. def take_binaryScreenshot(sct, monitor: dict):
  19. image = np.array(sct.grab(monitor))
  20. binaryScreen = np.zeros(image.shape[:-1])
  21. binaryScreen[np.all(image == (83, 83, 83, 0), axis=2)] = 1
  22. binaryScreen = cv2.erode(binaryScreen, None, iterations=1)
  23. binaryScreen = cv2.dilate(binaryScreen, None, iterations=1)
  24. return binaryScreen
  25. def binary_to_RGB(image):
  26. rgb_image = np.zeros((*image.shape, 3))
  27. rgb_image[image == 1] = (255, 255, 255)
  28. return rgb_image
  29. def open_dino(sct):
  30. prevScreen = take_screenshot(sct)
  31. webbrowser.open('https://chromedino.com/')
  32. sleep(1)
  33. Screen = take_screenshot(sct)
  34. while np.any(Screen != prevScreen):
  35. cv2.imshow('View', Screen)
  36. cv2.waitKey(1)
  37. sleep(1)
  38. prevScreen = Screen.copy()
  39. Screen = take_screenshot(sct)
  40. print('loaded')
  41. def shortest_jump():
  42. with gui.hold('space'):
  43. sleep(0.1)
  44. take_down()
  45. def short_jump():
  46. with gui.hold('space'):
  47. sleep(0.15)
  48. take_down()
  49. def long_jump():
  50. with gui.hold('space'):
  51. sleep(0.2)
  52. take_down()
  53. def take_down():
  54. with gui.hold('down'):
  55. sleep(0.04)
  56. def jump(sec):
  57. print('jump suka jump')
  58. with gui.hold('space'):
  59. sleep(sec)
  60. take_down()
  61. def get_playing_bbox(sct):
  62. Screen = take_screenshot(sct)
  63. binaryScreen = np.zeros(Screen.shape[:-1])
  64. binaryScreen[np.all(Screen == (83, 83, 83, 0), axis=2)] = 1
  65. short_jump()
  66. sleep(1)
  67. binScreen = take_binaryScreenshot(sct, sct.monitors[DEFAULT_MONITOR])
  68. x, y = np.where(binScreen == 1)
  69. mw = (y.max()-y.min()) // 100
  70. mh = (x.max()-x.min()) // 100
  71. 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}
  72. return playing_bbox, mw, mh
  73. def to_bbox(bin_image):
  74. bin_image = cv2.dilate(bin_image, dilation_kernel, iterations=4)
  75. labels, labeledScreen = cv2.connectedComponents(bin_image.astype('uint8'))
  76. for label in range(1, labels):
  77. x,y = np.where(labeledScreen==label)
  78. bin_image[x.min():x.max()+1, y.min():y.max()+1] = 1
  79. return bin_image
  80. if __name__ == '__main__':
  81. sct = mss()
  82. open_dino(sct)
  83. gui.hotkey('fn', 'f11')
  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. coef = 1.2
  94. trigger_second = (int(dino_pos[0].mean()), int(dino_max_x + int(coef*10)*pw))
  95. trigger_first = (int(dino_pos[0].mean()), int(75*pw))
  96. jumping = False
  97. taking = False
  98. start = time()
  99. cv2.imshow('View', rgbScreen)
  100. while cv2.waitKey(1) != ord('q'):
  101. binScreen = take_binaryScreenshot(sct, playing_bbox)
  102. binScreen = to_bbox(binScreen)
  103. labels, labeledScreen = cv2.connectedComponents(binScreen.astype('uint8'))
  104. if not taking and not jumping and binScreen[trigger_second] != 0:
  105. print('jumping')
  106. gui.keyDown('space')
  107. jumping = True
  108. elif jumping and binScreen[trigger_second[0], trigger_second[1]-pw] == 0:
  109. print('landing')
  110. gui.keyUp('space')
  111. gui.keyDown('down')
  112. jumping = False
  113. taking = True
  114. elif taking and binScreen[dino_min_y, dino_max_x] != 0:
  115. print('landed')
  116. gui.keyUp('down')
  117. taking = False
  118. if time() - start > 10:
  119. print(time() - start)
  120. coef += 0.1
  121. trigger_second = (trigger_second[0], trigger_second[1]+pw)
  122. # trigger_first = (trigger_first[0], trigger_first[0]+int(pw))
  123. start = time()
  124. if DEBUG:
  125. rgbScreen = binary_to_RGB(binScreen)
  126. cv2.circle(rgbScreen, trigger_second[::-1], radius=2, color=(0, 255, 0), thickness=2)
  127. cv2.circle(rgbScreen, trigger_first[::-1], radius=2, color=(0, 0, 255), thickness=2)
  128. cv2.imshow('View', rgbScreen)
  129. cv2.destroyAllWindows()