Mostly report stuff
This commit is contained in:
parent
0ba5b018ec
commit
31e5ceb0a9
|
@ -20,6 +20,7 @@ extra-source-files:
|
||||||
executable Minesweeper
|
executable Minesweeper
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
other-modules:
|
other-modules:
|
||||||
|
Autosolver
|
||||||
Minesweeper
|
Minesweeper
|
||||||
Paths_Minesweeper
|
Paths_Minesweeper
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
|
|
Binary file not shown.
|
@ -54,7 +54,9 @@
|
||||||
\setlength{\parskip}{1em}
|
\setlength{\parskip}{1em}
|
||||||
|
|
||||||
\section{Introduction}
|
\section{Introduction}
|
||||||
I have implemented a fully functional Minesweeper game in Haskell with the Threepenny GUI serving the interface.
|
I have implemented a fully functional Minesweeper game in Haskell with the Threepenny GUI serving the interface, and also a probability based autosolver which can perform a move by clicking an "Autoplay" button.
|
||||||
|
|
||||||
|
The code is well commented and I have also documented and explained key parts of it in this PDF.
|
||||||
|
|
||||||
Stack successfully builds and executes the solution binary, serving the GUI at \url{http://localhost:8023}.
|
Stack successfully builds and executes the solution binary, serving the GUI at \url{http://localhost:8023}.
|
||||||
|
|
||||||
|
@ -72,7 +74,7 @@ data Board = Board { size :: Int, mines :: Grid, uncovered :: Grid, flagged :: G
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
\textbf{size} defines the horizontal and vertical length in squares of the game grid (all grids are squares).
|
\textbf{size} defines the horizontal and vertical length in squares of the game grid (all grids are squares).
|
||||||
\textbf{mines}, \textbf{uncovered} and \textbf{flagged} hold a data structure indicating the squares that respectively have mines, have been uncovered by the user and have been flagged by the user.
|
\textbf{mines}, \textbf{uncovered} and \textbf{flagged} hold data structures that respectively indicate the squares that have mines, have been uncovered by the user and have been flagged by the user.
|
||||||
|
|
||||||
The Grid type is a 2D list of Booleans with the outer list denoting rows and the inner list denoting columns:
|
The Grid type is a 2D list of Booleans with the outer list denoting rows and the inner list denoting columns:
|
||||||
|
|
||||||
|
@ -80,12 +82,12 @@ data Board = Board { size :: Int, mines :: Grid, uncovered :: Grid, flagged :: G
|
||||||
type Grid = [[Bool]]
|
type Grid = [[Bool]]
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
For example, you could determine whether the 2nd row down, 4th column across has a mine with the following expression: (N.B. rows and columns are 0-indexed)
|
With this structure, you can determine whether the 2nd row down, 4th column across has a mine with the following simple expression: (N.B. rows and columns are 0-indexed)
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
(mines !! 1) !! 3
|
(mines !! 1) !! 3
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
And indeed this is how the hasMine function is implemented:
|
And indeed this is how the hasMine function is implemented in my code:
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
hasMine :: Board -> Square -> Bool
|
hasMine :: Board -> Square -> Bool
|
||||||
hasMine b (r,c) | validSquare b (r,c) = (mines b !! r) !! c
|
hasMine b (r,c) | validSquare b (r,c) = (mines b !! r) !! c
|
||||||
|
@ -109,7 +111,7 @@ createBoard size mineRatio rng = Board size (seedGrid rng mineRatio (createGrid
|
||||||
(createGrid False size)
|
(createGrid False size)
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
The function requires a size (number of squares in both horizontal and vertical directions), a "mine ratio" and a random number generator instance. It then produces a Board type with three initialised grids. The uncovered and flagged grids are initialised with all False values (since the user will not have uncovered or flagged any squares yet).
|
The function requires a size (number of squares in both horizontal and vertical directions), a "mine ratio" and a random number generator instance. It then produces a Board instance with three initialised grids. The uncovered and flagged grids are initialised with all False values (since the user will not have uncovered or flagged any squares yet).
|
||||||
|
|
||||||
The mines grid is initialised with all False values, but then the seedGrid function is used to randomly seed mines into the grid by making a random decision with probability of the provided mineRatio for every square on the grid.
|
The mines grid is initialised with all False values, but then the seedGrid function is used to randomly seed mines into the grid by making a random decision with probability of the provided mineRatio for every square on the grid.
|
||||||
|
|
||||||
|
@ -267,7 +269,4 @@ refresh iob = do
|
||||||
|
|
||||||
I found working with ThreePenny difficult initially, there are limited examples on the web for usage and it took me quite a bit of time wrestling with it before I had some code with a reasonable structure for the main interface setup section. I would've liked to see a method of including static HTML into a page without having to write all of it in the ThreePenny eDSL and an ability to prevent the default action triggered by a browser event occurring (in my case right click opening a context menu) without having to embed a custom script.
|
I found working with ThreePenny difficult initially, there are limited examples on the web for usage and it took me quite a bit of time wrestling with it before I had some code with a reasonable structure for the main interface setup section. I would've liked to see a method of including static HTML into a page without having to write all of it in the ThreePenny eDSL and an ability to prevent the default action triggered by a browser event occurring (in my case right click opening a context menu) without having to embed a custom script.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
Binary file not shown.
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
@ -0,0 +1,7 @@
|
||||||
|
module Autosolver where
|
||||||
|
|
||||||
|
import Minesweeper
|
||||||
|
|
||||||
|
probabilityOfMine :: Board -> Square -> Float
|
||||||
|
probabilityOfMine _ _ = 1.0
|
||||||
|
|
Loading…
Reference in New Issue