From 578983a5de699647c12295a8ea460aa2b558f23f Mon Sep 17 00:00:00 2001 From: Galamian <63856130+galamian@users.noreply.github.com> Date: Sat, 22 Mar 2025 15:06:06 +0100 Subject: [PATCH 1/5] reuse boardClass in GUI --- minesweeper.py | 16 ++++++++-- minesweeperGUI.py | 77 ++--------------------------------------------- requirements.txt | 3 +- 3 files changed, 18 insertions(+), 78 deletions(-) diff --git a/minesweeper.py b/minesweeper.py index 0595dd8..30ff810 100644 --- a/minesweeper.py +++ b/minesweeper.py @@ -1,4 +1,5 @@ import random +import numpy as np class boardSpot(object): @@ -19,10 +20,17 @@ def isMine(self): class boardClass(object): - def __init__(self, m_boardSize, m_numMines): + def __init__(self, m_boardSize: int, m_numMines: int, dim: int=2): + if dim > 2: + raise ValueError(f"Only one or two dimensions supported, got {dim}") + self.board = [[boardSpot() for i in range(m_boardSize)] for j in range(m_boardSize)] self.boardSize = m_boardSize self.numMines = m_numMines + self.shape = (m_boardSize,) * dim + + self.values = np.zeros(self.shape) + self.selectableSpots = m_boardSize * m_boardSize - m_numMines i = 0 while i < m_numMines: @@ -102,9 +110,10 @@ def isWinner(self): def playGame(): boardSize = int(input("Choose the Width of the board: ")) numMines = int(input("Choose the number of mines: ")) + dim = int(input("Choose dimensions of board.")) gameOver = False winner = False - Board = boardClass(boardSize, numMines) + Board = boardClass(boardSize, numMines, dim=dim) while not gameOver: print(Board) print("Make your move:") @@ -122,4 +131,5 @@ def playGame(): else: print("You hit a mine, Game Over!") -playGame() +if __name__ == "__main__": + playGame() diff --git a/minesweeperGUI.py b/minesweeperGUI.py index 4b2f546..78f0fc9 100644 --- a/minesweeperGUI.py +++ b/minesweeperGUI.py @@ -1,41 +1,10 @@ import random import eel +from minesweeper import boardClass -class boardSpot(object): - value = 0 - selected = False - mine = False - - def __init__(self): - self.selected = False - - def __str__(self): - return str(boardSpot.value) - - def isMine(self): - if boardSpot.value == -1: - return True - return False - - -class boardClass(object): - def __init__(self, m_boardSize, m_numMines): - self.board = [[boardSpot() for i in range(m_boardSize)] - for j in range(m_boardSize)] - self.boardSize = m_boardSize - self.numMines = m_numMines - self.selectableSpots = m_boardSize * m_boardSize - m_numMines - i = 0 - while i < m_numMines: - x = random.randint(0, self.boardSize-1) - y = random.randint(0, self.boardSize-1) - if not self.board[x][y].mine: - self.addMine(x, y) - i += 1 - else: - i -= 1 +class GUIBoardClass(boardClass): def __str__(self): returnString = "" for y in range(0, self.boardSize): @@ -51,46 +20,6 @@ def __str__(self): returnString += "E" return returnString - def addMine(self, x, y): - self.board[x][y].value = -1 - self.board[x][y].mine = True - for i in range(x-1, x+2): - if i >= 0 and i < self.boardSize: - if y-1 >= 0 and not self.board[i][y-1].mine: - self.board[i][y-1].value += 1 - if y+1 < self.boardSize and not self.board[i][y+1].mine: - self.board[i][y+1].value += 1 - if x-1 >= 0 and not self.board[x-1][y].mine: - self.board[x-1][y].value += 1 - if x+1 < self.boardSize and not self.board[x+1][y].mine: - self.board[x+1][y].value += 1 - - def makeMove(self, x, y): - self.board[x][y].selected = True - self.selectableSpots -= 1 - if self.board[x][y].value == -1: - return False - if self.board[x][y].value == 0: - for i in range(x-1, x+2): - if i >= 0 and i < self.boardSize: - if y-1 >= 0 and not self.board[i][y-1].selected: - self.makeMove(i, y-1) - if y+1 < self.boardSize and not self.board[i][y+1].selected: - self.makeMove(i, y+1) - if x-1 >= 0 and not self.board[x-1][y].selected: - self.makeMove(x-1, y) - if x+1 < self.boardSize and not self.board[x+1][y].selected: - self.makeMove(x+1, y) - return True - else: - return True - - def hitMine(self, x, y): - return self.board[x][y].value == -1 - - def isWinner(self): - return self.selectableSpots == 0 - #### For UI #### eel.init('.//UI') # path of the webpage folder @@ -124,7 +53,7 @@ def clickedOnTheCell(x, y): def makeBoard(boardSize, numMines): global BOARD del BOARD - BOARD = boardClass(boardSize, numMines) + BOARD = GUIBoardClass(boardSize, numMines) web_app_options = { diff --git a/requirements.txt b/requirements.txt index b81a462..2abcaf0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -eel==0.14.0 \ No newline at end of file +eel==0.14.0 +numpy==2.2.4 \ No newline at end of file From 53cbf9eed54a1994c3a4620dfb27c16d8fd7c5c9 Mon Sep 17 00:00:00 2001 From: Galamian <63856130+galamian@users.noreply.github.com> Date: Sat, 22 Mar 2025 17:29:11 +0100 Subject: [PATCH 2/5] use numpy --- minesweeper.py | 101 +++++++++++++++++++++------------------------- minesweeperGUI.py | 6 +-- 2 files changed, 48 insertions(+), 59 deletions(-) diff --git a/minesweeper.py b/minesweeper.py index 30ff810..5b41d12 100644 --- a/minesweeper.py +++ b/minesweeper.py @@ -1,46 +1,42 @@ import random import numpy as np - -class boardSpot(object): - value = 0 - selected = False - mine = False - - def __init__(self): - self.selected = False - - def __str__(self): - return str(boardSpot.value) - - def isMine(self): - if boardSpot.value == -1: - return True - return False - - class boardClass(object): def __init__(self, m_boardSize: int, m_numMines: int, dim: int=2): if dim > 2: raise ValueError(f"Only one or two dimensions supported, got {dim}") - self.board = [[boardSpot() for i in range(m_boardSize)] for j in range(m_boardSize)] self.boardSize = m_boardSize self.numMines = m_numMines self.shape = (m_boardSize,) * dim - self.values = np.zeros(self.shape) + self.values = np.zeros(self.shape, dtype=int) - self.selectableSpots = m_boardSize * m_boardSize - m_numMines - i = 0 - while i < m_numMines: - x = random.randint(0, self.boardSize-1) - y = random.randint(0, self.boardSize-1) - if not self.board[x][y].mine: - self.addMine(x, y) - i += 1 - else: - i -= 1 + mine_indices = np.array(np.unravel_index(np.random.choice(self.values.size, size=m_numMines, replace=False), self.values.shape)) + + self.values[*mine_indices] = -1 + + self.selected = np.zeros(shape=self.values.shape, dtype=bool) + + + for m in range(mine_indices.shape[-1]): + mine_index = mine_indices[:, m] + current_index = mine_index.copy() + for k in range(dim): + for a in [-1, 0, 1]: + if mine_index[k] + a >= self.values.shape[k] or mine_index[k] + a < 0: + continue + current_index[k] = mine_index[k] + a + for j in range(k): + for b in [-1, 0, 1]: + if mine_index[j] + b >= self.values.shape[j] or mine_index[j] + b < 0: + continue + current_index[j] = mine_index[j] + b + self.values[*current_index] += 1 if self.values[*current_index] >= 0 else 0 + + + + self.selectableSpots = (m_boardSize ** dim) - m_numMines def __str__(self): returnString = " " @@ -55,56 +51,49 @@ def __str__(self): for y in range(0, self.boardSize): returnString += str(y) for x in range(0, self.boardSize): - if self.board[x][y].mine and self.board[x][y].selected: - returnString += " |" + str(self.board[x][y].value) - elif self.board[x][y].selected: - returnString += " | " + str(self.board[x][y].value) + if self.values[x, y] < 0 and self.selected[x, y]: + returnString += " |" + str(self.values[x, y]) + elif self.selected[x, y]: + returnString += " | " + str(self.values[x, y]) else: returnString += " | " returnString += " |" returnString += divider return returnString - def addMine(self, x, y): - self.board[x][y].value = -1 - self.board[x][y].mine = True - for i in range(x-1, x+2): - if i >= 0 and i < self.boardSize: - if y-1 >= 0 and not self.board[i][y-1].mine: - self.board[i][y-1].value += 1 - if y+1 < self.boardSize and not self.board[i][y+1].mine: - self.board[i][y+1].value += 1 - if x-1 >= 0 and not self.board[x-1][y].mine: - self.board[x-1][y].value += 1 - if x+1 < self.boardSize and not self.board[x+1][y].mine: - self.board[x+1][y].value += 1 - def makeMove(self, x, y): - self.board[x][y].selected = True + self.selected[x, y] = True self.selectableSpots -= 1 - if self.board[x][y].value == -1: + if self.values[x, y] == -1: return False - if self.board[x][y].value == 0: + if self.values[x, y] == 0: for i in range(x-1, x+2): if i >= 0 and i < self.boardSize: - if y-1 >= 0 and not self.board[i][y-1].selected: + if y-1 >= 0 and not self.selected[i, y-1]: self.makeMove(i, y-1) - if y+1 < self.boardSize and not self.board[i][y+1].selected: + if y+1 < self.boardSize and not self.selected[i, y+1]: self.makeMove(i, y+1) - if x-1 >= 0 and not self.board[x-1][y].selected: + if x-1 >= 0 and not self.selected[x-1,y]: self.makeMove(x-1, y) - if x+1 < self.boardSize and not self.board[x+1][y].selected: + if x+1 < self.boardSize and not self.selected[x+1, y]: self.makeMove(x+1, y) return True else: return True def hitMine(self, x, y): - return self.board[x][y].value == -1 + return self.values[x, y] == -1 def isWinner(self): return self.selectableSpots == 0 +def increment_tuple(t: tuple, index: int = 0, value: int = 1) -> tuple: + if not t or index < 0 or index >= len(t): + return t # Return original tuple if empty or index is out of range + + t_list = list(t) + t_list[index] += value + return tuple(t_list) #play game def playGame(): diff --git a/minesweeperGUI.py b/minesweeperGUI.py index 78f0fc9..e1616df 100644 --- a/minesweeperGUI.py +++ b/minesweeperGUI.py @@ -10,12 +10,12 @@ def __str__(self): for y in range(0, self.boardSize): # returnString += str(y) for x in range(0, self.boardSize): - if self.board[x][y].mine and self.board[x][y].selected: + if self.values[x, y] == -1 and self.selected[x, y]: returnString += 'B' # returnString += str(self.board[x][y].value) - elif self.board[x][y].selected: - returnString += str(self.board[x][y].value) + elif self.selected[x, y]: + returnString += str(self.values[x, y]) else: # empthy cell returnString += "E" return returnString From fb1d24366cfcbff51c60b840124a49f21828f21b Mon Sep 17 00:00:00 2001 From: Galamian <63856130+galamian@users.noreply.github.com> Date: Sat, 22 Mar 2025 18:56:41 +0100 Subject: [PATCH 3/5] add possibility to show the field open --- UI/app.js | 3 +- UI/index.html | 2 ++ __pycache__/minesweeper.cpython-312.pyc | Bin 0 -> 7425 bytes minesweeper.py | 39 +++++++++++++++--------- minesweeperGUI.py | 20 ++++++++++-- 5 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 __pycache__/minesweeper.cpython-312.pyc diff --git a/UI/app.js b/UI/app.js index 19d2553..c75b44d 100644 --- a/UI/app.js +++ b/UI/app.js @@ -9,6 +9,7 @@ function startNew(mode) { // hard -> 18X32=576 -> 100 bombs | 24 -> 100 bombs // extreme-> 26X50=1300 -> 220 bombs | 30 -> 200 bombs // const mode = element.value; + isOpen = document.getElementById('isOpen').checked; if (mode === "easy") { size = 10; bombs = 15; @@ -32,7 +33,7 @@ function startNew(mode) { document.getElementById("h1").classList.remove("won"); document.getElementById("h1").classList.remove("lost"); document.getElementById("h1").innerHTML = `Minesweeper`; - eel.makeBoard(size, bombs)(); //size, bombs + eel.makeBoard(size, bombs, isOpen)(); //size, bombs drawFirst(); } diff --git a/UI/index.html b/UI/index.html index a7d8222..dcad8c1 100644 --- a/UI/index.html +++ b/UI/index.html @@ -11,6 +11,8 @@

Minesweeper

+ Show Open +
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 B7F+-T literal 0 HcmV?d00001 diff --git a/minesweeper.py b/minesweeper.py index 5b41d12..e097b60 100644 --- a/minesweeper.py +++ b/minesweeper.py @@ -1,24 +1,26 @@ import random +import math import numpy as np class boardClass(object): - def __init__(self, m_boardSize: int, m_numMines: int, dim: int=2): + def __init__(self, m_boardSize: int | tuple[int, ...], m_numMines: int, dim: int=2): + if isinstance(m_boardSize, tuple): + dim = len(m_boardSize) + self.shape = m_boardSize + else: + self.shape = (m_boardSize,) * dim + if dim > 2: raise ValueError(f"Only one or two dimensions supported, got {dim}") - self.boardSize = m_boardSize self.numMines = m_numMines - self.shape = (m_boardSize,) * dim - + self.values = np.zeros(self.shape, dtype=int) + self.selected = np.zeros(shape=self.values.shape, dtype=bool) mine_indices = np.array(np.unravel_index(np.random.choice(self.values.size, size=m_numMines, replace=False), self.values.shape)) - self.values[*mine_indices] = -1 - self.selected = np.zeros(shape=self.values.shape, dtype=bool) - - for m in range(mine_indices.shape[-1]): mine_index = mine_indices[:, m] current_index = mine_index.copy() @@ -35,17 +37,24 @@ def __init__(self, m_boardSize: int, m_numMines: int, dim: int=2): self.values[*current_index] += 1 if self.values[*current_index] >= 0 else 0 + self.selectableSpots = self.values.size - m_numMines - self.selectableSpots = (m_boardSize ** dim) - m_numMines - + @property + def boardSize(self): + return self.values.shape[0] # TODO generalize + def __str__(self): + if dim > 2: + raise ValueError(f"Only one or two dimensions supported, got {dim}") returnString = " " divider = "\n---" - for i in range(0, self.boardSize): - returnString += " | " + str(i) - divider += "----" - divider += "\n" + if len(self.values.shape > 1): + + for i in range(0, self.values.shape[0]): + returnString += " | " + str(i) + divider += "----" + divider += "\n" returnString += divider for y in range(0, self.boardSize): @@ -99,7 +108,7 @@ def increment_tuple(t: tuple, index: int = 0, value: int = 1) -> tuple: def playGame(): boardSize = int(input("Choose the Width of the board: ")) numMines = int(input("Choose the number of mines: ")) - dim = int(input("Choose dimensions of board.")) + dim = int(input("Choose dimensions of board: ")) gameOver = False winner = False Board = boardClass(boardSize, numMines, dim=dim) diff --git a/minesweeperGUI.py b/minesweeperGUI.py index e1616df..d75c287 100644 --- a/minesweeperGUI.py +++ b/minesweeperGUI.py @@ -21,6 +21,19 @@ def __str__(self): return returnString +class OpenGUIBoardClass(boardClass): + def __str__(self): + returnString = "" + for y in range(0, self.boardSize): + # returnString += str(y) + for x in range(0, self.boardSize): + if self.values[x, y] == -1: + returnString += str(0) + else: + returnString += str(self.values[x, y]) + return returnString + + #### For UI #### eel.init('.//UI') # path of the webpage folder @@ -50,10 +63,13 @@ def clickedOnTheCell(x, y): @eel.expose -def makeBoard(boardSize, numMines): +def makeBoard(boardSize, numMines, isOpen=False): global BOARD del BOARD - BOARD = GUIBoardClass(boardSize, numMines) + if isOpen: + BOARD = OpenGUIBoardClass(boardSize, numMines) + else: + BOARD = GUIBoardClass(boardSize, numMines) web_app_options = { From 1e0e34378b69945ba4c5188c47d5d334ff5c66ec Mon Sep 17 00:00:00 2001 From: Galamian <63856130+galamian@users.noreply.github.com> Date: Sat, 22 Mar 2025 20:18:31 +0100 Subject: [PATCH 4/5] ruff fixes --- minesweeper.py | 9 ++++----- minesweeperGUI.py | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/minesweeper.py b/minesweeper.py index e097b60..20f7c4e 100644 --- a/minesweeper.py +++ b/minesweeper.py @@ -1,5 +1,3 @@ -import random -import math import numpy as np class boardClass(object): @@ -13,6 +11,7 @@ def __init__(self, m_boardSize: int | tuple[int, ...], m_numMines: int, dim: int if dim > 2: raise ValueError(f"Only one or two dimensions supported, got {dim}") + self.dim = dim self.numMines = m_numMines self.values = np.zeros(self.shape, dtype=int) @@ -44,8 +43,8 @@ def boardSize(self): return self.values.shape[0] # TODO generalize def __str__(self): - if dim > 2: - raise ValueError(f"Only one or two dimensions supported, got {dim}") + if self.dim > 2: + raise ValueError(f"Only one or two dimensions supported, got {self.dim}") returnString = " " divider = "\n---" @@ -119,7 +118,7 @@ def playGame(): y = int(input("y: ")) Board.makeMove(x, y) gameOver = Board.hitMine(x, y) - if Board.isWinner() and gameOver == False: + if Board.isWinner() and gameOver is False: gameOver = True winner = True diff --git a/minesweeperGUI.py b/minesweeperGUI.py index d75c287..c1c160c 100644 --- a/minesweeperGUI.py +++ b/minesweeperGUI.py @@ -1,4 +1,3 @@ -import random import eel from minesweeper import boardClass @@ -51,7 +50,7 @@ def clickedOnTheCell(x, y): if GO_IN: BOARD.makeMove(x, y) GAME_OVER = BOARD.hitMine(x, y) - if BOARD.isWinner() and GAME_OVER == False: + if BOARD.isWinner() and GAME_OVER is False: GAME_OVER = True WINNER = True print("Won") @@ -69,7 +68,7 @@ def makeBoard(boardSize, numMines, isOpen=False): if isOpen: BOARD = OpenGUIBoardClass(boardSize, numMines) else: - BOARD = GUIBoardClass(boardSize, numMines) + BOARD = GUIBoardClass(boardSize, numMines) # noqa: F841 web_app_options = { From 1e56bd4c3bd4a9aefc0537065b6dc4b6cb6bfe9a Mon Sep 17 00:00:00 2001 From: Galamian <63856130+galamian@users.noreply.github.com> Date: Sat, 22 Mar 2025 21:21:09 +0100 Subject: [PATCH 5/5] ignore pycache --- .gitignore | 2 ++ __pycache__/minesweeper.cpython-312.pyc | Bin 7425 -> 0 bytes 2 files changed, 2 insertions(+) create mode 100644 .gitignore delete mode 100644 __pycache__/minesweeper.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43ae0e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*.py[cod] diff --git a/__pycache__/minesweeper.cpython-312.pyc b/__pycache__/minesweeper.cpython-312.pyc deleted file mode 100644 index 944d3e91de5a2a0a3f006f6ca5854011766bbeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7425 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 B7F+-T