add first strategy
[hs-pgms.git] / src / Strategies.hs
blob881c6ce6337f5a1dd96db5e050133247acf438b2
1 module Strategies (
2 strat1,
3 ) where
5 import Mine
6 import System.Random
7 import Data.Array
8 import Data.List
10 strat1 :: StdGen -> Strategy String
11 strat1 gen = do
12 cfg <- getConfig
13 strat1_worker gen cfg
14 strat1_worker gen Config { cSize = Pos sX sY } = strat1_worker' gen []
15 where
16 strat1_worker' :: StdGen -> [Pos] -> Strategy String
17 strat1_worker' gen [] = do
18 vw <- getView
19 let (x, gen') = randomR (1, sX) gen
20 (y, gen'') = randomR (1, sY) gen'
21 p = Pos x y
22 if vw ! p == Hidden then
23 move p >> strat1_worker' gen'' [p]
24 else
25 strat1_worker' gen'' []
26 strat1_worker' gen (p : ps) = do
27 vw <- getView
28 let Exposed i = vw ! p
29 a = neighbours p
30 m = [q | q <- a, Marked <- [vw ! q]]
31 u = [q | q <- a, Hidden <- [vw ! q]]
32 if length m == i then do
33 mapM_ move u
34 strat1_worker' gen ([r | q <- u, r <- neighbours q, Exposed _ <- [vw ! r]] ++ u ++ ps)
35 else if length u + length m == i then do
36 mapM_ mark u
37 strat1_worker' gen ([r | q <- u, r <- neighbours q, Exposed _ <- [vw ! r]] ++ ps)
38 else
39 strat1_worker' gen ps
40 neighbours (Pos x y) =
41 [ Pos (x + dx) (y + dy)
42 | dx <- [if x == 1 then 0 else -1 .. if x == sX then 0 else 1],
43 dy <- [if y == 1 then 0 else -1 .. if y == sY then 0 else 1],
44 dx /= 0 || dy /= 0]