3 -- Copyright : (c) 2008 Bertram Felgenhauer
6 -- Maintainer : Bertram Felgenhauer <int-e@gmx.de>
7 -- Stability : experimental
8 -- Portability : portable
10 -- This module is part of Haskell PGMS.
12 -- A simple minesweeper strategy.
15 module Strat1
(strat1
) where
19 import Data
.Array.IArray
23 strat1
= defaultStrategy
{
25 sAuthor
= "Bertram Felgenhauer <int-e@gmx.de>",
27 "A first attempt at implementing the Single Point Strategy. It's \
28 \missing some forced inferences though.",
29 sRun
= \s
-> getConfig
>>= \c
-> worker c s
32 worker
:: Config
-> StdGen -> StrategyM
String
33 worker cfg
@Config
{ cSize
= Pos sX sY
} gen
= worker
' gen
[]
35 worker
' :: StdGen -> [Pos
] -> StrategyM
String
38 let (x
, gen
') = randomR (1, sX
) gen
39 (y
, gen
'') = randomR (1, sY
) gen
'
41 if vw
! p
== Hidden
then
42 move p
>> worker
' gen
'' [p
]
45 worker
' gen
(p
: ps
) = do
47 let Exposed i
= vw
! p
49 m
= [q | q
<- a
, Marked
<- [vw
! q
]]
50 u
= [q | q
<- a
, Hidden
<- [vw
! q
]]
51 if length m
== i
then do
53 worker
' gen
([r | q
<- u
, r
<- neighbours cfg q
,
54 Exposed _
<- [vw
! r
]] ++ u
++ ps
)
55 else if length u
+ length m
== i
then do
57 worker
' gen
([r | q
<- u
, r
<- neighbours cfg q
,
58 Exposed _
<- [vw
! r
]] ++ ps
)