mirror of
https://github.com/neoarz/Syntrel.git
synced 2025-12-25 11:40:12 +01:00
feat(minesweeper): auto complete with 0
This commit is contained in:
@@ -82,6 +82,10 @@ class RowButton(discord.ui.Button):
|
|||||||
view.GetBoardPos(pos)
|
view.GetBoardPos(pos)
|
||||||
] = str(number) if number > 0 else "0"
|
] = str(number) if number > 0 else "0"
|
||||||
view.moves.append(pos)
|
view.moves.append(pos)
|
||||||
|
|
||||||
|
if number == 0:
|
||||||
|
await view.auto_reveal_safe_squares(rawpos, interaction)
|
||||||
|
|
||||||
if len(view.moves) + len(self.bombs) == 25:
|
if len(view.moves) + len(self.bombs) == 25:
|
||||||
await view.EndGame()
|
await view.EndGame()
|
||||||
else:
|
else:
|
||||||
@@ -108,7 +112,6 @@ class MsView(discord.ui.View):
|
|||||||
self.last_interaction = 0
|
self.last_interaction = 0
|
||||||
|
|
||||||
def generate_bombs(self, first_move_pos):
|
def generate_bombs(self, first_move_pos):
|
||||||
"""Generate bombs excluding the first clicked position"""
|
|
||||||
bombpositions = []
|
bombpositions = []
|
||||||
excluded_positions = [0, 4, 20, 24, first_move_pos]
|
excluded_positions = [0, 4, 20, 24, first_move_pos]
|
||||||
|
|
||||||
@@ -164,6 +167,85 @@ class MsView(discord.ui.View):
|
|||||||
raise
|
raise
|
||||||
self.stop()
|
self.stop()
|
||||||
|
|
||||||
|
async def auto_reveal_safe_squares(self, center_pos, interaction):
|
||||||
|
positions_to_check = [center_pos]
|
||||||
|
revealed_positions = set()
|
||||||
|
|
||||||
|
while positions_to_check:
|
||||||
|
current_pos = positions_to_check.pop(0)
|
||||||
|
if current_pos in revealed_positions:
|
||||||
|
continue
|
||||||
|
|
||||||
|
revealed_positions.add(current_pos)
|
||||||
|
|
||||||
|
adjacent_positions = []
|
||||||
|
pos = self.GetBoardPos(current_pos)
|
||||||
|
|
||||||
|
if pos > 0 and current_pos - 1 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos - 1)
|
||||||
|
if pos < 4 and current_pos + 1 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos + 1)
|
||||||
|
if current_pos >= 5 and current_pos - 5 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos - 5)
|
||||||
|
if current_pos <= 19 and current_pos + 5 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos + 5)
|
||||||
|
if pos > 0 and current_pos >= 5 and current_pos - 6 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos - 6)
|
||||||
|
if pos < 4 and current_pos >= 5 and current_pos - 4 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos - 4)
|
||||||
|
if pos > 0 and current_pos <= 19 and current_pos + 4 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos + 4)
|
||||||
|
if pos < 4 and current_pos <= 19 and current_pos + 6 not in self.bombs:
|
||||||
|
adjacent_positions.append(current_pos + 6)
|
||||||
|
|
||||||
|
for adj_pos in adjacent_positions:
|
||||||
|
if adj_pos not in self.moves and adj_pos not in revealed_positions:
|
||||||
|
adj_count = []
|
||||||
|
adj_pos_obj = self.GetBoardPos(adj_pos)
|
||||||
|
|
||||||
|
def checkpos_adj(count, rawpos, pos):
|
||||||
|
pos = self.GetBoardPos(rawpos)
|
||||||
|
if not rawpos - 1 in self.bombs or pos == 0:
|
||||||
|
count.append(rawpos - 1)
|
||||||
|
if not rawpos + 1 in self.bombs or pos == 4:
|
||||||
|
count.append(rawpos + 1)
|
||||||
|
if not rawpos - 6 in self.bombs or pos == 0:
|
||||||
|
count.append(rawpos - 6)
|
||||||
|
if not rawpos - 4 in self.bombs or pos == 4:
|
||||||
|
count.append(rawpos - 4)
|
||||||
|
if not rawpos + 6 in self.bombs or pos == 4:
|
||||||
|
count.append(rawpos + 6)
|
||||||
|
if not rawpos + 4 in self.bombs or pos == 0:
|
||||||
|
count.append(rawpos + 4)
|
||||||
|
if not rawpos - 5 in self.bombs:
|
||||||
|
count.append(rawpos - 5)
|
||||||
|
if not rawpos + 5 in self.bombs:
|
||||||
|
count.append(rawpos + 5)
|
||||||
|
return count
|
||||||
|
|
||||||
|
adj_count = checkpos_adj(adj_count, adj_pos, adj_pos_obj)
|
||||||
|
adj_number = 8 - len(adj_count)
|
||||||
|
|
||||||
|
for button in self.children:
|
||||||
|
if int(button.custom_id[5:]) == adj_pos:
|
||||||
|
button.label = str(adj_number) if adj_number > 0 else "0"
|
||||||
|
button.style = discord.ButtonStyle.green
|
||||||
|
break
|
||||||
|
|
||||||
|
self.board[self.GetBoardRow(adj_pos)][self.GetBoardPos(adj_pos)] = str(adj_number) if adj_number > 0 else "0"
|
||||||
|
self.moves.append(adj_pos)
|
||||||
|
|
||||||
|
if adj_number == 0:
|
||||||
|
positions_to_check.append(adj_pos)
|
||||||
|
|
||||||
|
try:
|
||||||
|
await interaction.edit_original_response(view=self)
|
||||||
|
except discord.errors.HTTPException as e:
|
||||||
|
if e.status == 429:
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
def GetBoardRow(self, pos):
|
def GetBoardRow(self, pos):
|
||||||
if pos in [0, 1, 2, 3, 4]:
|
if pos in [0, 1, 2, 3, 4]:
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Reference in New Issue
Block a user