bot.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/usr/bin/env python3
  2. import os
  3. import time
  4. from collections import deque
  5. from itertools import count
  6. from Xlib import error
  7. from strategy import State
  8. from interaction import get_exapunks_window, focus_window, screenshot_board, \
  9. press_keys, listen_keys, KEY_DELAY
  10. MAX_SPEED_ROWS = 3
  11. def save_screenshot(win):
  12. board = screenshot_board(win).convert('RGB')
  13. os.makedirs('screens', exist_ok=True)
  14. for i in count(1):
  15. path = 'screens/board%d.png' % i
  16. if not os.path.exists(path):
  17. print('save screenshot in', path)
  18. board.save(path)
  19. break
  20. if __name__ == '__main__':
  21. try:
  22. win = get_exapunks_window()
  23. focus_window(win)
  24. listen_keys({'s': lambda: save_screenshot(win)})
  25. solutions = deque([], maxlen=3)
  26. while True:
  27. try:
  28. board = screenshot_board(win)
  29. state = State.detect(board)
  30. print('\033c', end='')
  31. print('parsed:')
  32. state.print()
  33. print()
  34. start = time.time()
  35. solution = state.solve()
  36. end = time.time()
  37. print('thought for', round((end - start) * 1000, 1), 'milliseconds')
  38. except (TypeError, AssertionError):
  39. print('\rerror during parsing, wait for a bit...', end='')
  40. time.sleep(0.05)
  41. continue
  42. except error.BadMatch:
  43. print('\rEXAPUNKS window lost, wait for a bit...', end='')
  44. time.sleep(0.5)
  45. continue
  46. if len(solutions) == 3 and solution.loops(solutions.popleft()):
  47. print('\rloop detected, wait for a bit...', end='')
  48. time.sleep(0.03)
  49. elif solution.moves:
  50. print('moves:', solution.keys())
  51. print(' score:', solution.score)
  52. if solutions:
  53. print('prev score:', solutions[-1].score)
  54. print()
  55. print('target after moves:')
  56. solution.newstate.print()
  57. press_keys(win, solution.keys())
  58. keys_delay = len(solution.moves) * 2 * KEY_DELAY
  59. moves_delay = max(0, solution.delay() - keys_delay)
  60. print('wait for', moves_delay, 'ms')
  61. time.sleep(moves_delay / 1000)
  62. elif state.nrows() - 2 <= MAX_SPEED_ROWS:
  63. print('no moves, speed up')
  64. press_keys(win, 'l')
  65. time.sleep(0.03)
  66. else:
  67. print('no moves')
  68. solutions.append(solution)
  69. except KeyboardInterrupt:
  70. print('interrupted, quitting')