programgames/minesweeper/minesweeper.xtl

source · imports m: games/minesweeper/Mines.xtl

s : Int

value · line 6
s ← ᵐn̲ew 0

p : Int

value · line 13
p ← 0 c̲at₂ (0 c̲at (ᵐm̲ines s) c̲at 0) c̲at₂ 0

ᵘs̲teps : (Num a, Truthy a) => a -> a

function · line 19

Opening a square with no mine around it floods: watch the opened region grow, one ring of neighbors at a time, until it stops.

ᵘs̲teps ← { o →
  said ← p̲rint! '+ r̲/ r̲avel o
  more ← 1 × (o ∨ 0 < ᵐa̲round o ∧ 0 = ᵐc̲ounts s) ∧ n̲ot ᵐm̲ines s
  more m̲atch o ? o
  ᵘs̲teps more
}
Used in: ᵘs̲teps, grown

start : Int

value · line 25
start ← 1 × 9 9 r̲eshape 37 = r̲ange 81         ⍝ row 5, column 1
Used in: grown

grown : Int

value · line 26
grown ← ᵘs̲teps start

ᵘc̲lear : (Num a, Truthy a) => a -> Int -> a

function · line 30

Open every safe square, one after another: the field is cleared.

ᵘc̲lear ← { s v →
  0 = t̲ally v ? s
  next ← s ᵐr̲eveal (1 + ((f̲irst v) − 1) d̲iv 9) c̲at 1 + ((f̲irst v) − 1) m̲od 9
  next ᵘc̲lear 1 d̲rop v
}
Used in: ᵘc̲lear, done

done : Int

value · line 35
done ← s ᵘc̲lear w̲here n̲ot r̲avel ᵐm̲ines s

pic : Char

value · line 38
pic ← ⎕S̲HOW ᵐp̲icture done

ok : Unit

value · line 43
ok ← "10 = '+ r_/ r_avel m:m_ines s" a̲ssert< "ten mines"
a̲ssert< expands to
({ @ → (10 = '+ r̲/ r̲avel ᵐm̲ines s) ? @◆ ⎕E̲RR "assertion failed: 10 = '+ r_/ r_avel m:m_ines s (ten mines) [games/minesweeper/minesweeper.xtl:43]"◆ @ } @)

ok : Unit

value · line 44
ok ← "1 = m:s_tatus done" a̲ssert< "opening every safe square wins"
a̲ssert< expands to
({ @ → (1 = ᵐs̲tatus done) ? @◆ ⎕E̲RR "assertion failed: 1 = m:s_tatus done (opening every safe square wins) [games/minesweeper/minesweeper.xtl:44]"◆ @ } @)