From a8ead54831b7be2f7557cafb66c23a6b0c52b60c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Wed, 12 Feb 2020 00:53:02 +0100 Subject: [PATCH] Formatting --- .../card_detection/board_parser.py | 2 +- .../card_detection/card_finder.py | 3 ++- shenzhen_solitaire/clicker/main.py | 14 ++++++++++--- shenzhen_solitaire/solver/solver.py | 21 +++++++------------ tools/assistant.py | 14 ++++++++----- tools/generate/field.py | 1 - tools/generate/goal.py | 7 ++++++- 7 files changed, 36 insertions(+), 26 deletions(-) diff --git a/shenzhen_solitaire/card_detection/board_parser.py b/shenzhen_solitaire/card_detection/board_parser.py index 297754d..2e35a97 100644 --- a/shenzhen_solitaire/card_detection/board_parser.py +++ b/shenzhen_solitaire/card_detection/board_parser.py @@ -219,7 +219,7 @@ def parse_goal(image: np.ndarray, conf: Configuration) -> List[Optional[NumberCa parse_goal_field(square, conf.catalogue, conf.green_card) for square in goal_squares ] - + return goal_list diff --git a/shenzhen_solitaire/card_detection/card_finder.py b/shenzhen_solitaire/card_detection/card_finder.py index c664612..58e78ac 100644 --- a/shenzhen_solitaire/card_detection/card_finder.py +++ b/shenzhen_solitaire/card_detection/card_finder.py @@ -26,6 +26,7 @@ def get_field_squares( squares.append(get_square(adjustment, index_x, index_y)) return _extract_squares(image, squares) + def catalogue_cards(squares: List[np.ndarray]) -> List[Tuple[np.ndarray, Card]]: """Run manual cataloging for given squares""" cv2.namedWindow("Catalogue", cv2.WINDOW_NORMAL) @@ -33,7 +34,7 @@ def catalogue_cards(squares: List[np.ndarray]) -> List[Tuple[np.ndarray, Card]]: result: List[Tuple[np.ndarray, Card]] = [] print("Card ID is [B]ai, [Z]hong, [F]a, [H]ua, [R]ed, [G]reen, [B]lack") print("Numbercard e.g. R3") - abort_row = 'a' + abort_row = "a" special_card_map = { "b": SpecialCard.Bai, "z": SpecialCard.Zhong, diff --git a/shenzhen_solitaire/clicker/main.py b/shenzhen_solitaire/clicker/main.py index 683d845..401b7e8 100644 --- a/shenzhen_solitaire/clicker/main.py +++ b/shenzhen_solitaire/clicker/main.py @@ -12,8 +12,12 @@ def drag( ) -> None: pyautogui.moveTo(x=src[0] + offset[0], y=src[1] + offset[1]) - pyautogui.dragTo(x=dst[0] + offset[0], y=dst[1] + offset[1], - duration=0.4, tween=lambda x: 0 if x < 0.5 else 1) + pyautogui.dragTo( + x=dst[0] + offset[0], + y=dst[1] + offset[1], + duration=0.4, + tween=lambda x: 0 if x < 0.5 else 1, + ) def click(point: Tuple[int, int], offset: Tuple[int, int] = (0, 0)) -> None: @@ -22,6 +26,7 @@ def click(point: Tuple[int, int], offset: Tuple[int, int] = (0, 0)) -> None: time.sleep(0.2) pyautogui.mouseUp() + def handle_action( action: board_actions.Action, offset: Tuple[int, int], @@ -68,7 +73,10 @@ def handle_action( index_x=0, index_y=dragon_sequence.index(action.dragon), ) - click((field_x + (size_x - field_x) // 2, field_y + (size_y - field_y) // 2), offset) + click( + (field_x + (size_x - field_x) // 2, field_y + (size_y - field_y) // 2), + offset, + ) time.sleep(0.5) return if isinstance(action, board_actions.GoalAction): diff --git a/shenzhen_solitaire/solver/solver.py b/shenzhen_solitaire/solver/solver.py index 4349f34..f5a32c6 100644 --- a/shenzhen_solitaire/solver/solver.py +++ b/shenzhen_solitaire/solver/solver.py @@ -3,15 +3,12 @@ from typing import List, Iterator, Optional from ..board import Board from . import board_actions from .board_possibilities import possible_actions -from .board_actions import ( - MoveAction, - GoalAction, - HuaKillAction, - DragonKillAction) +from .board_actions import MoveAction, GoalAction, HuaKillAction, DragonKillAction class ActionStack: """Stack of chosen actions on the board""" + iterator_stack: List[Iterator[board_actions.Action]] action_stack: List[Optional[board_actions.Action]] index_stack: List[int] @@ -61,15 +58,13 @@ def solve(board: Board) -> Iterator[List[board_actions.Action]]: stack.pop() assert stack.action_stack[-1] is not None stack.action_stack[-1].undo(board) - assert (board.state_identifier - in state_set) + assert board.state_identifier in state_set def _backtrack_action() -> None: stack.pop() assert stack.action_stack[-1] is not None stack.action_stack[-1].undo(board) - assert (board.state_identifier - in state_set) + assert board.state_identifier in state_set def _skip_loop_move(action: board_actions.Action) -> bool: if isinstance(action, MoveAction): @@ -88,8 +83,7 @@ def solve(board: Board) -> Iterator[List[board_actions.Action]]: # _limit_stack_size(80) - assert (board.state_identifier == - stack.state_stack[-1]) + assert board.state_identifier == stack.state_stack[-1] action = stack.get() if not action: @@ -105,9 +99,8 @@ def solve(board: Board) -> Iterator[List[board_actions.Action]]: yield stack.action_stack stack.action_stack[-1].undo(board) while isinstance( - stack.action_stack[-1], (GoalAction, - HuaKillAction, - DragonKillAction)): + stack.action_stack[-1], (GoalAction, HuaKillAction, DragonKillAction) + ): stack.pop() stack.action_stack[-1].undo(board) continue diff --git a/tools/assistant.py b/tools/assistant.py index ea8494b..41a5699 100644 --- a/tools/assistant.py +++ b/tools/assistant.py @@ -12,7 +12,8 @@ import time OFFSET = (0, 0) SIZE = (2560, 1440) -NEW_BUTTON=(1900,1100) +NEW_BUTTON = (1900, 1100) + def debug_screenshot(image): cv2.namedWindow("Name", cv2.WINDOW_KEEPRATIO) @@ -21,14 +22,15 @@ def debug_screenshot(image): input() cv2.destroyAllWindows() + def solve() -> None: screenshot_dir = Path(tempfile.mkdtemp()) - screenshot_file = screenshot_dir / 'screenshot.png' + screenshot_file = screenshot_dir / "screenshot.png" screenshot = pyautogui.screenshot(region=(*OFFSET, *SIZE)) screenshot.save(screenshot_file) image = cv2.imread(str(screenshot_file)) # debug_screenshot() - + print("Solving") conf = configuration.load("test_config.zip") board = parse_board(image, conf) @@ -38,14 +40,16 @@ def solve() -> None: time.sleep(1) for step in solution: print(step) - #time.sleep(0.5) + # time.sleep(0.5) clicker.handle_action(step, OFFSET, conf) clicker.click(NEW_BUTTON, OFFSET) time.sleep(10) + + def main() -> None: time.sleep(3) while True: - solve() + solve() if __name__ == "__main__": diff --git a/tools/generate/field.py b/tools/generate/field.py index 516deb9..bf844f9 100644 --- a/tools/generate/field.py +++ b/tools/generate/field.py @@ -13,4 +13,3 @@ def main() -> None: if __name__ == "__main__": main() - diff --git a/tools/generate/goal.py b/tools/generate/goal.py index e0e90af..9cdd6cd 100644 --- a/tools/generate/goal.py +++ b/tools/generate/goal.py @@ -15,7 +15,12 @@ def main() -> None: image = cv2.imread("pictures/specific/BaiShiny.jpg") goal_adjustment = adjustment.adjust_squares( - image, count_x=3, count_y=1, adjustment=adjustment.Adjustment(**{"x": 1490, "y": 310, "w": 19, "h": 21, "dx": 152, "dy": 0}) + image, + count_x=3, + count_y=1, + adjustment=adjustment.Adjustment( + **{"x": 1490, "y": 310, "w": 19, "h": 21, "dx": 152, "dy": 0} + ), ) print(json.dumps(dataclasses.asdict(goal_adjustment)))