Merge pull request #3032 from makermelissa/main

Minesweeper improvements
This commit is contained in:
Melissa LeBlanc-Williams 2025-05-11 11:06:19 -07:00 committed by GitHub
commit 508815e216
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 9 deletions

View file

@ -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")

View file

@ -68,8 +68,12 @@ class GameLogic:
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 @@ class GameLogic:
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)

View file

@ -36,17 +36,28 @@ class SubMenu(Group):
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 @@ class SubMenu(Group):
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 @@ class SubMenu(Group):
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 @@ class SubMenu(Group):
self._button_width,
self._xpos,
self._ypos,
border=True,
True,
)
self.append(self._root_button)
@ -113,7 +130,8 @@ class SubMenu(Group):
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)