working nicely now, split func into module
This commit is contained in:
parent
65c8035820
commit
413893d7bc
|
@ -16,6 +16,7 @@ build-type: Simple
|
||||||
executable Minesweeper
|
executable Minesweeper
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
other-modules:
|
other-modules:
|
||||||
|
Minesweeper
|
||||||
Paths_Minesweeper
|
Paths_Minesweeper
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
src
|
src
|
||||||
|
|
50
src/Main.hs
50
src/Main.hs
|
@ -1,55 +1,9 @@
|
||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
|
import Minesweeper
|
||||||
import System.Random
|
import System.Random
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
rng <- newStdGen
|
rng <- newStdGen
|
||||||
putStrLn (printBoard $ createBoard 12 0.2 rng)
|
putStrLn (printBoard $ createBoard 20 0.1 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
|
|
|
@ -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
|
Loading…
Reference in New Issue