implement custom config dialog
[hs-pgms.git] / src / Strat1.hs
blobb93ecbd7546a3092dca27cd77a190b8cfd2cf521
1 {-
2 - beginner: ~55%
3 - intermediate: ~24%
4 - expert: ~ 0.3%
5 -}
7 module Strat1 (strat1) where
9 import Mine
10 import Data.Array
11 import System.Random
13 strat1 :: Strategy
14 strat1 = defaultStrategy {
15 sName = "Strategy One",
16 sAuthor = "Bertram Felgenhauer <int-e@gmx.de>",
17 sDescription =
18 "A first attempt at implementing the Single Point Strategy. It's \
19 \missing some forced inferences though.",
20 sRun = worker
23 worker :: Config -> StdGen -> StrategyM String
24 worker cfg@Config { cSize = Pos sX sY } gen = worker' gen []
25 where
26 worker' :: StdGen -> [Pos] -> StrategyM String
27 worker' gen [] = do
28 vw <- getView
29 let (x, gen') = randomR (1, sX) gen
30 (y, gen'') = randomR (1, sY) gen'
31 p = Pos x y
32 if vw ! p == Hidden then
33 move p >> worker' gen'' [p]
34 else
35 worker' gen'' []
36 worker' gen (p : ps) = do
37 vw <- getView
38 let Exposed i = vw ! p
39 a = neighbours cfg p
40 m = [q | q <- a, Marked <- [vw ! q]]
41 u = [q | q <- a, Hidden <- [vw ! q]]
42 if length m == i then do
43 mapM_ move u
44 worker' gen ([r | q <- u, r <- neighbours cfg q, Exposed _ <- [vw ! r]] ++ u ++ ps)
45 else if length u + length m == i then do
46 mapM_ mark u
47 worker' gen ([r | q <- u, r <- neighbours cfg q, Exposed _ <- [vw ! r]] ++ ps)
48 else
49 worker' gen ps