From 0d03bb1831f2f2c7dfdd6500a4702e0c712fbaa6 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 15 Nov 2020 20:52:55 +0100 Subject: [PATCH] next mistake --- katrain/__main__.py | 7 +++++-- katrain/core/constants.py | 2 +- katrain/core/game.py | 16 +++++++++++++--- katrain/gui.kv | 10 ++++------ katrain/gui/kivyutils.py | 1 + katrain/img/Next-Mistake.png | Bin 0 -> 19035 bytes 6 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 katrain/img/Next-Mistake.png diff --git a/katrain/__main__.py b/katrain/__main__.py index 3d35056..9cf8936 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -159,7 +159,6 @@ class KaTrainGui(Screen, KaTrainBase): self.board_controls.mid_circles_container.clear_widgets() self.board_controls.mid_circles_container.add_widget(bot) self.board_controls.mid_circles_container.add_widget(top) - self.board_controls.branch.disabled = not cn.parent or len(cn.parent.children) <= 1 self.controls.players["W"].captures = prisoners["W"] self.controls.players["B"].captures = prisoners["B"] @@ -295,6 +294,10 @@ class KaTrainGui(Screen, KaTrainBase): self.board_gui.animating_pv = None self.game.redo(n_times) + def _do_next_mistake(self): + self.board_gui.animating_pv = None + self.game.redo(999, stop_on_mistake=self.config("trainer/eval_thresholds")[-4]) + def _do_cycle_children(self, *args): self.board_gui.animating_pv = None self.game.cycle_children(*args) @@ -358,7 +361,7 @@ class KaTrainGui(Screen, KaTrainBase): self.ai_settings_popup.content.popup = self.ai_settings_popup self.ai_settings_popup.open() - def load_sgf_file(self, file, fast=False, rewind=False): + def load_sgf_file(self, file, fast=False, rewind=True): try: move_tree = KaTrainSGF.parse_file(file) except ParseError as e: diff --git a/katrain/core/constants.py b/katrain/core/constants.py index 5dea88c..39c8c2f 100644 --- a/katrain/core/constants.py +++ b/katrain/core/constants.py @@ -47,7 +47,7 @@ AI_STRATEGIES_RECOMMENDED_ORDER = [ AI_RANK, AI_HANDICAP, AI_SIMPLE_OWNERSHIP, - AI_SETTLE_STONES, + # AI_SETTLE_STONES, AI_SCORELOSS, AI_POLICY, AI_WEIGHTED, diff --git a/katrain/core/game.py b/katrain/core/game.py index 91b7ce9..71f72f5 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -185,12 +185,22 @@ class Game: cn = cn.parent self.set_current_node(cn) - def redo(self, n_times=1): + def redo(self, n_times=1, stop_on_mistake=None): cn = self.current_node # avoid race conditions - for _ in range(n_times): + for move in range(n_times): if cn.children: cn = cn.ordered_children[0] - self.set_current_node(cn) + if ( + move > 0 + and stop_on_mistake is not None + and cn.points_lost is not None + and cn.points_lost >= stop_on_mistake + and self.katrain.players_info[cn.player].player_type != PLAYER_AI + ): + self.set_current_node(cn.parent) + return + if stop_on_mistake is None: + self.set_current_node(cn) def cycle_children(self, direction): cn = self.current_node # avoid race conditions diff --git a/katrain/gui.kv b/katrain/gui.kv index 2854836..bf220d9 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -126,7 +126,7 @@ pos: [root.pos[i] + (root.size[i] - root.icon_size[i])/2 for i in [0,1]] source: root.icon mipmap: True - color: [1,1,1,0.4] if root.disabled else [1,1,1,1] + color: [1,1,1,0.4] if root.disabled else root.color : @@ -185,7 +185,6 @@ : katrain: app.gui - branch: branch circles: [black_circle,white_circle] mid_circles_container: mid_circles_container pass_btn: pass_btn @@ -236,10 +235,9 @@ icon: 'img/Next-End.png' on_press: root.katrain('redo',999) NavIconButton: - id: branch - icon: 'img/Branch.png' - on_press: root.katrain('cycle-children',1) - disabled: True + icon: 'img/Next-Mistake.png' + color: [0.65,0.05,0.05,1] + on_press: root.katrain('next-mistake') ClickableLabel: pos_hint: {'center_x': 0.85,'center_y':0.5} size_hint: None, 1 diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index f16985b..f8f3dc9 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -112,6 +112,7 @@ class AutoSizedRectangleToggleButton(ToggleButtonMixin, AutoSizedRectangleButton class TransparentIconButton(CircularRippleBehavior, Button): + color = ListProperty([1, 1, 1, 1]) icon_size = ListProperty([25, 25]) icon = StringProperty("") disabled = BooleanProperty(False) diff --git a/katrain/img/Next-Mistake.png b/katrain/img/Next-Mistake.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ccfb74350c7c4e6df992343e7af6803ab97491 GIT binary patch literal 19035 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