bot.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env python3
  2. import sys
  3. from os.path import dirname, join
  4. sys.path.insert(0, join(dirname(__file__), 'python-xlib'))
  5. import os
  6. import time
  7. from collections import deque
  8. from itertools import count
  9. from Xlib import error
  10. from detection import NOBLOCK
  11. from interaction import get_exapunks_window, focus_window, screenshot_board, \
  12. press_keys, listen_keys
  13. from strategy import State
  14. MAX_SPEED_ROWS = 3
  15. if __name__ == '__main__':
  16. verbose = '-q' not in sys.argv[1:]
  17. try:
  18. win = get_exapunks_window()
  19. focus_window(win)
  20. buf = deque([], maxlen=3)
  21. def vprint(*args, **kwargs):
  22. if verbose:
  23. print(*args, **kwargs)
  24. def vprint_state(state):
  25. if verbose:
  26. state.print()
  27. while True:
  28. try:
  29. board = screenshot_board(win)
  30. start = time.time()
  31. state = State.detect(board)
  32. end = time.time()
  33. vprint('\033c', end='')
  34. vprint('parsed in', round((end - start) * 1000, 1), 'ms:')
  35. vprint_state(state)
  36. vprint()
  37. if state.exa is None:
  38. raise AssertionError
  39. except (TypeError, AssertionError):
  40. vprint('\rerror during parsing, wait for a bit...', end='')
  41. time.sleep(0.050)
  42. continue
  43. except error.BadMatch:
  44. vprint('\rEXAPUNKS window lost, wait for a bit...', end='')
  45. time.sleep(0.500)
  46. continue
  47. try:
  48. start = time.time()
  49. newstate = state.solve()
  50. end = time.time()
  51. vprint('thought for', round((end - start) * 1000, 1), 'ms')
  52. except AssertionError:
  53. print('error board 99:')
  54. state.print()
  55. board.convert('RGB').save('screens/board99.png')
  56. break
  57. if state.held == NOBLOCK and any(map(newstate.loops, buf)):
  58. vprint('\rloop detected, wait for a bit...', end='')
  59. time.sleep(0.03)
  60. elif newstate.moves:
  61. vprint('moves:', newstate.keys())
  62. vprint('score:', newstate.score)
  63. vprint()
  64. vprint('target after moves:')
  65. vprint_state(newstate)
  66. press_keys(win, newstate.keys())
  67. #keys_delay = len(newstate.moves) * 2 * KEY_DELAY
  68. #moves_delay = max(0, newstate.delay() - keys_delay)
  69. #vprint('wait for', moves_delay, 'ms')
  70. #time.sleep(moves_delay / 1000)
  71. time.sleep(0.080)
  72. elif state.nrows - 2 <= MAX_SPEED_ROWS:
  73. vprint('no moves, speed up')
  74. press_keys(win, 'l')
  75. time.sleep(0.030)
  76. else:
  77. vprint('no moves')
  78. buf.append(newstate)
  79. except KeyboardInterrupt:
  80. print('interrupted, quitting')