From afa65ff3603747ecadd87bb484f809f7a858d569 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 8 May 2025 12:16:14 -0700 Subject: [PATCH 1/5] Minesweeper improvements --- Metro/Metro_RP2350_Minesweeper/code.py | 4 ++- Metro/Metro_RP2350_Minesweeper/gamelogic.py | 11 ++++++- Metro/Metro_RP2350_Minesweeper/menu.py | 33 +++++++++++++++++---- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Metro/Metro_RP2350_Minesweeper/code.py b/Metro/Metro_RP2350_Minesweeper/code.py index 3f1a19f36..6e4aeded2 100755 --- a/Metro/Metro_RP2350_Minesweeper/code.py +++ b/Metro/Metro_RP2350_Minesweeper/code.py @@ -197,13 +197,15 @@ def reset(): def set_difficulty(diff): game_logic.difficulty = diff reset() + difficulty_menu.select_item(DIFFICULTIES[diff]['label'].lower().replace(" ", "_")) def hide_group(group): group.hidden = True for i, difficulty in enumerate(DIFFICULTIES): # Create a button for each difficulty - difficulty_menu.add_item((set_difficulty, i), difficulty['label']) + selected = i == game_logic.difficulty + difficulty_menu.add_item((set_difficulty, i), difficulty['label'], selected) reset_menu.add_item(reset, "OK") diff --git a/Metro/Metro_RP2350_Minesweeper/gamelogic.py b/Metro/Metro_RP2350_Minesweeper/gamelogic.py index 61a90b494..7d66fa869 100755 --- a/Metro/Metro_RP2350_Minesweeper/gamelogic.py +++ b/Metro/Metro_RP2350_Minesweeper/gamelogic.py @@ -23,6 +23,11 @@ 'grid_size': (20, 14), 'mines': 58, }, + { + 'label': "Custom", + 'grid_size': (8, 8), + 'mines': 49, + }, ) INFO_BAR_HEIGHT = 16 @@ -68,8 +73,12 @@ def reset(self): if (self.grid_width * 16 > self._display.width or self.grid_height * 16 > self._display.height - INFO_BAR_HEIGHT): raise ValueError("Grid size exceeds display size") - self._board_data = bytearray(self.grid_width * self.grid_height) self._mine_count = DIFFICULTIES[self._difficulty]['mines'] + if self._mine_count > (self.grid_width - 1) * (self.grid_height - 1): + raise ValueError("Too many mines for grid size") + if self._mine_count < 10: + raise ValueError("There must be at least 10 mines") + self._board_data = bytearray(self.grid_width * self.grid_height) self._status = STATUS_NEWGAME self._start_time = None self._end_time = None diff --git a/Metro/Metro_RP2350_Minesweeper/menu.py b/Metro/Metro_RP2350_Minesweeper/menu.py index 4b397de72..45e9ea75e 100755 --- a/Metro/Metro_RP2350_Minesweeper/menu.py +++ b/Metro/Metro_RP2350_Minesweeper/menu.py @@ -36,17 +36,29 @@ def __init__(self, label, button_width, menu_width, x, y): self._menu_items = [] self._root_button = None - def add_item(self, function, label): + def add_item(self, function, label, selected=False): + key = label.lower().replace(" ", "_") self._menu_items.append( { + "key": key, "function": function, "label": label, + "selected": selected, } ) self._render() + def select_item(self, key): + print(f"selecting {key}") + for item in self._menu_items: + if item["key"] == key: + item["selected"] = True + else: + item["selected"] = False + self._render() + @staticmethod - def _create_button(callback, label, width, x, y=0, border=True): + def _create_button(callback, label, width, x, y=0, border=True, selected=False): if border: outline_color = 0x000000 selected_outline = 0x333333 @@ -54,6 +66,11 @@ def _create_button(callback, label, width, x, y=0, border=True): outline_color = 0xEEEEEE selected_outline = 0xBBBBBB + if selected: + label_color = 0x008800 + else: + label_color = 0x333333 + button = EventButton( callback, x=x, @@ -64,13 +81,14 @@ def _create_button(callback, label, width, x, y=0, border=True): style=EventButton.RECT, fill_color=0xEEEEEE, outline_color=outline_color, - label_color=0x333333, + label_color=label_color, selected_fill=0xBBBBBB, selected_label=0x333333, selected_outline=selected_outline, ) return button + def _toggle_submenu(self): self._menu_items_group.hidden = not self._menu_items_group.hidden @@ -87,7 +105,7 @@ def _render(self): self._button_width, self._xpos, self._ypos, - border=True, + True, ) self.append(self._root_button) @@ -113,7 +131,8 @@ def _render(self): self._menu_width - 2, self._xpos + 1, self._ypos + index * MENU_ITEM_HEIGHT + self._root_button.height, - border=False, + False, + item["selected"], ) self._menu_items_group.append(button) @@ -151,3 +170,7 @@ def visible(self): @property def items_group(self): return self._menu_items_group + + @property + def items(self): + return self._menu_items From af5efebe65e2c7f8fccc0a93ec49af5416f3a03e Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 8 May 2025 12:18:44 -0700 Subject: [PATCH 2/5] Remove unused items --- Metro/Metro_RP2350_Minesweeper/gamelogic.py | 5 ----- Metro/Metro_RP2350_Minesweeper/menu.py | 4 ---- 2 files changed, 9 deletions(-) diff --git a/Metro/Metro_RP2350_Minesweeper/gamelogic.py b/Metro/Metro_RP2350_Minesweeper/gamelogic.py index 7d66fa869..5dc1cccae 100755 --- a/Metro/Metro_RP2350_Minesweeper/gamelogic.py +++ b/Metro/Metro_RP2350_Minesweeper/gamelogic.py @@ -23,11 +23,6 @@ 'grid_size': (20, 14), 'mines': 58, }, - { - 'label': "Custom", - 'grid_size': (8, 8), - 'mines': 49, - }, ) INFO_BAR_HEIGHT = 16 diff --git a/Metro/Metro_RP2350_Minesweeper/menu.py b/Metro/Metro_RP2350_Minesweeper/menu.py index 45e9ea75e..e5dc0c451 100755 --- a/Metro/Metro_RP2350_Minesweeper/menu.py +++ b/Metro/Metro_RP2350_Minesweeper/menu.py @@ -170,7 +170,3 @@ def visible(self): @property def items_group(self): return self._menu_items_group - - @property - def items(self): - return self._menu_items From f295b8b34d6c5e3ef3dfb77730e2d3dc0656957b Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 8 May 2025 12:32:32 -0700 Subject: [PATCH 3/5] Remove debug message --- Metro/Metro_RP2350_Minesweeper/menu.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Metro/Metro_RP2350_Minesweeper/menu.py b/Metro/Metro_RP2350_Minesweeper/menu.py index e5dc0c451..1e34e5398 100755 --- a/Metro/Metro_RP2350_Minesweeper/menu.py +++ b/Metro/Metro_RP2350_Minesweeper/menu.py @@ -49,7 +49,6 @@ def add_item(self, function, label, selected=False): self._render() def select_item(self, key): - print(f"selecting {key}") for item in self._menu_items: if item["key"] == key: item["selected"] = True From e467423fac2e24b06c0be87fada0798f6984a424 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 8 May 2025 13:12:58 -0700 Subject: [PATCH 4/5] Fix menu color when mouse is over --- Metro/Metro_RP2350_Minesweeper/menu.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Metro/Metro_RP2350_Minesweeper/menu.py b/Metro/Metro_RP2350_Minesweeper/menu.py index 1e34e5398..1b1dc3109 100755 --- a/Metro/Metro_RP2350_Minesweeper/menu.py +++ b/Metro/Metro_RP2350_Minesweeper/menu.py @@ -66,9 +66,9 @@ def _create_button(callback, label, width, x, y=0, border=True, selected=False): selected_outline = 0xBBBBBB if selected: - label_color = 0x008800 + selected_label = label_color = 0x008800 else: - label_color = 0x333333 + selected_label = label_color = 0x333333 button = EventButton( callback, @@ -82,7 +82,7 @@ def _create_button(callback, label, width, x, y=0, border=True, selected=False): outline_color=outline_color, label_color=label_color, selected_fill=0xBBBBBB, - selected_label=0x333333, + selected_label=selected_label, selected_outline=selected_outline, ) return button From a30d244cf1eb743d05ba064987f6ee231347946f Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 8 May 2025 13:16:51 -0700 Subject: [PATCH 5/5] Remove more debug prints --- Metro/Metro_RP2350_Minesweeper/gamelogic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Metro/Metro_RP2350_Minesweeper/gamelogic.py b/Metro/Metro_RP2350_Minesweeper/gamelogic.py index 5dc1cccae..a66157898 100755 --- a/Metro/Metro_RP2350_Minesweeper/gamelogic.py +++ b/Metro/Metro_RP2350_Minesweeper/gamelogic.py @@ -245,7 +245,6 @@ def elapsed_time(self): if self._start_time is None: return 0 if self._end_time is None: - print(ticks_ms() / 1000, self._start_time / 1000) return min(999, (ticks_ms() - self._start_time) // 1000) return min(999, (self._end_time - self._start_time) // 1000)