| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #!/usr/bin/env python3
- import os
- import time
- from collections import deque
- from itertools import count
- from Xlib import error
- from strategy import State
- from interaction import get_exapunks_window, focus_window, screenshot_board, \
- press_keys, listen_keys, KEY_DELAY
- MAX_SPEED_ROWS = 3
- def save_screenshot(win):
- board = screenshot_board(win).convert('RGB')
- os.makedirs('screens', exist_ok=True)
- for i in count(1):
- path = 'screens/board%d.png' % i
- if not os.path.exists(path):
- print('save screenshot in', path)
- board.save(path)
- break
- if __name__ == '__main__':
- try:
- win = get_exapunks_window()
- focus_window(win)
- listen_keys({'s': lambda: save_screenshot(win)})
- solutions = deque([], maxlen=3)
- while True:
- try:
- board = screenshot_board(win)
- state = State.detect(board)
- print('\033c', end='')
- print('parsed:')
- state.print()
- print()
- start = time.time()
- solution = state.solve()
- end = time.time()
- print('thought for', round((end - start) * 1000, 1), 'milliseconds')
- except (TypeError, AssertionError):
- print('\rerror during parsing, wait for a bit...', end='')
- time.sleep(0.05)
- continue
- except error.BadMatch:
- print('\rEXAPUNKS window lost, wait for a bit...', end='')
- time.sleep(0.5)
- continue
- if len(solutions) == 3 and solution.loops(solutions.popleft()):
- print('\rloop detected, wait for a bit...', end='')
- time.sleep(0.03)
- elif solution.moves:
- print('moves:', solution.keys())
- print(' score:', solution.score)
- if solutions:
- print('prev score:', solutions[-1].score)
- print()
- print('target after moves:')
- solution.newstate.print()
- press_keys(win, solution.keys())
- keys_delay = len(solution.moves) * 2 * KEY_DELAY
- moves_delay = max(0, solution.delay() - keys_delay)
- print('wait for', moves_delay, 'ms')
- time.sleep(moves_delay / 1000)
- elif state.nrows() - 2 <= MAX_SPEED_ROWS:
- print('no moves, speed up')
- press_keys(win, 'l')
- time.sleep(0.03)
- else:
- print('no moves')
- solutions.append(solution)
- except KeyboardInterrupt:
- print('interrupted, quitting')
|