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..a66157898 100755 --- a/Metro/Metro_RP2350_Minesweeper/gamelogic.py +++ b/Metro/Metro_RP2350_Minesweeper/gamelogic.py @@ -68,8 +68,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 @@ -241,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) diff --git a/Metro/Metro_RP2350_Minesweeper/menu.py b/Metro/Metro_RP2350_Minesweeper/menu.py index 4b397de72..1b1dc3109 100755 --- a/Metro/Metro_RP2350_Minesweeper/menu.py +++ b/Metro/Metro_RP2350_Minesweeper/menu.py @@ -36,17 +36,28 @@ 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): + 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 +65,11 @@ def _create_button(callback, label, width, x, y=0, border=True): outline_color = 0xEEEEEE selected_outline = 0xBBBBBB + if selected: + selected_label = label_color = 0x008800 + else: + selected_label = label_color = 0x333333 + button = EventButton( callback, x=x, @@ -64,13 +80,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_label=selected_label, selected_outline=selected_outline, ) return button + def _toggle_submenu(self): self._menu_items_group.hidden = not self._menu_items_group.hidden @@ -87,7 +104,7 @@ def _render(self): self._button_width, self._xpos, self._ypos, - border=True, + True, ) self.append(self._root_button) @@ -113,7 +130,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)