working nicely now, split func into module

This commit is contained in:
Jack Harley 2021-01-28 14:45:23 +00:00
parent 65c8035820
commit 413893d7bc
3 changed files with 55 additions and 48 deletions

View File

@ -16,6 +16,7 @@ build-type: Simple
executable Minesweeper
main-is: Main.hs
other-modules:
Minesweeper
Paths_Minesweeper
hs-source-dirs:
src

View File

@ -1,55 +1,9 @@
module Main where
import Minesweeper
import System.Random
main :: IO ()
main = do
rng <- newStdGen
putStrLn (printBoard $ createBoard 12 0.2 rng)
type Square = (Int, Int)
type Grid = [[Bool]]
data Board = Board { size :: Int
, mines :: Grid
, uncovered :: Grid
, flagged :: Grid
} deriving (Show)
-- Creates a board given a size (width/height), mine ratio and random generator
createBoard :: Int -> Float -> StdGen -> Board
createBoard size mineRatio rng = Board size (seedGrid rng mineRatio (createGrid size)) (createGrid size) (createGrid size)
-- Creates a 2D list of booleans of given size, initialised to False
createGrid :: Int -> Grid
createGrid size = replicate size (replicate size False)
-- Seeds True statuses to a 2D grid randomly with a given probability, requires a random generator
seedGrid :: StdGen -> Float -> Grid -> Grid
seedGrid _ _ [] = []
seedGrid rng p (l:ls) = newL : seedGrid newRng p ls
where (newL, newRng) = seedList rng p l
seedList :: StdGen -> Float -> [Bool] -> ([Bool], StdGen)
seedList rng p (l:ls) = (newBool : seedListDiscard newRng p ls, newRng)
where (newBool, newRng) = randomlyTrue rng p
seedListDiscard :: StdGen -> Float -> [Bool] -> [Bool]
seedListDiscard _ _ [] = []
seedListDiscard rng p (l:ls) = newBool : seedListDiscard newRng p ls
where (newBool, newRng) = randomlyTrue rng p
randomlyTrue :: StdGen -> Float -> (Bool, StdGen)
randomlyTrue rng p = let (generatedFloat, newRng) = randomR (0.0, 1.0) rng
in (generatedFloat <= p, newRng)
printBoard :: Board -> String
printBoard b = printBoardGrid (mines b)
printBoardGrid :: Grid -> String
printBoardGrid [] = ""
printBoardGrid (l:ls) = printBoardLine l ++ "\n" ++ printBoardGrid ls
printBoardLine :: [Bool] -> String
printBoardLine [] = ""
printBoardLine (x:xs) = (if x then " x" else " .") ++ printBoardLine xs
putStrLn (printBoard $ createBoard 20 0.1 rng)

52
src/Minesweeper.hs Normal file
View File

@ -0,0 +1,52 @@
module Minesweeper where
import System.Random
type Square = (Int, Int)
type Grid = [[Bool]]
data Board = Board { size :: Int
, mines :: Grid
, uncovered :: Grid
, flagged :: Grid
} deriving (Show)
-- Creates a board given a size (width/height), mine ratio and random generator
createBoard :: Int -> Float -> StdGen -> Board
createBoard size mineRatio rng = Board size (seedGrid rng mineRatio (createGrid size)) (createGrid size) (createGrid size)
-- Creates a 2D list of booleans of given size, initialised to False
createGrid :: Int -> Grid
createGrid size = replicate size (replicate size False)
-- Functions relating to seeding a grid with mines
seedGrid :: StdGen -> Float -> Grid -> Grid
seedGrid _ _ [] = []
seedGrid rng p (l:ls) = newL : seedGrid rng2 p ls
where (rng1, rng2) = split rng
(newL, _) = seedList rng1 p l
seedList :: StdGen -> Float -> [Bool] -> ([Bool], StdGen)
seedList rng p (l:ls) = (newBool : seedList2 newRng p ls, newRng)
where (newBool, newRng) = randomlyTrue rng p
seedList2 :: StdGen -> Float -> [Bool] -> [Bool]
seedList2 _ _ [] = []
seedList2 rng p (l:ls) = newBool : seedList2 newRng p ls
where (newBool, newRng) = randomlyTrue rng p
randomlyTrue :: StdGen -> Float -> (Bool, StdGen)
randomlyTrue rng p = (generatedFloat <= p, newRng)
where (generatedFloat, newRng) = randomR (0.0, 1.0) rng
-- Functions for turning a board into a string for debug purposes
printBoard :: Board -> String
printBoard b = printBoardGrid (mines b)
printBoardGrid :: Grid -> String
printBoardGrid [] = ""
printBoardGrid (l:ls) = printBoardLine l ++ "\n" ++ printBoardGrid ls
printBoardLine :: [Bool] -> String
printBoardLine [] = ""
printBoardLine (x:xs) = (if x then " x" else " .") ++ printBoardLine xs