Minesweeper game: Difference between revisions

m
Line 3,362:
import Control.Lens ((%~), (&), (.~), (^.), (^?), Lens', Traversal', _1, _2,
anyOf, filtered, folded, lengthOf, makeLenses, makePrisms,
preview, to, view )
import Data.List (find, groupBy, nub, delete, sortBy)
import Data.Maybe (isJust)
Line 3,400:
-- Adjust row and column size to your preference.
totalRows, totalCols :: Int
totalRows = 404
totalCols = 406
 
emptyBoard :: Board
Line 3,409:
, _cellId = n}) <$> zip [1..] positions
where
positions = (,) <$> [1..totalRowstotalCols] <*> [1..totalColstotalRows]
 
updateCell :: Cell -> Board -> Board
Line 3,419:
okToOpen :: [Cell] -> [Cell]
okToOpen = filter (\c -> c ^? coveredLens == Just (False, False))
 
isFirstMove :: Board -> Bool
isFirstMove = (== totalCols * totalRows)
. lengthOf (folded . coveredFlaggedLens . filtered (== False))
 
openUnMined :: Cell -> Cell
Line 3,466 ⟶ 3,462:
 
adjacentCells :: Cell -> Board -> [Cell]
adjacentCells Cell { _pos = c@(x1, y1)} = filter (\c -> c ^. pos `elem` positions)
where
f n = [pred n, n, succ n]
positions = delete c $ [(x, y) | x <- f x1, x > 0, y <- f y1, y > 0]
 
isLoss, isWin, allUnMinedOpen, allMinesFlagged, isFirstMove :: Board -> Bool
isLoss = anyOf (traverse . unCoveredLens) (== True)
 
isWin :: Board -> Bool
isWin b = allUnMinedOpen b || allMinesFlagged b
 
allUnMinedOpen :: Board -> Bool
allUnMinedOpen = (== 0) . lengthOf (traverse . coveredMinedLens . filtered (== False))
 
allMinesFlagged :: Board -> Bool
allMinesFlagged b = minedCount b == flaggedMineCount b
where
minedCount = lengthOf (traverse . coveredMinedLens . filtered (== True))
flaggedMineCount = lengthOf (traverse . coveredLens . filtered (== (True, True)))
 
isFirstMove = (== totalCols * totalRows)
. lengthOf (folded . coveredFlaggedLens . filtered (== False))
 
groupedByRows :: Board -> [Board]
Line 3,496 ⟶ 3,490:
| c ^? unCoveredLens == Just True = "X"
| c ^? coveredFlaggedLens == Just True = "?"
| c ^? (unCoveredLens . to not) == Just True =
if c ^. adjacentMines > 0 then show $ c ^. adjacentMines else "▢"
then show $ c ^. adjacentMines
else "▢"
| otherwise = "."
 
Line 3,637 ⟶ 3,629:
startGame p b = gameLoop . openCell p <$> mineBoard p b</lang>
{{out}}
<pre> Mines: 0 Covered: 24 Flagged: 0
<pre>
╰─$ minesweeper
Mines: 0 Covered: 24 Flagged: 0
 
1 2 3 4 5 6
Line 3,651 ⟶ 3,641:
 
1 2 3 4 5 6
1 1 . . . . .
2 . . . . . .
3 . . . . . .
4 . . . . . .
 
Pick a cell: of 1 42
Mines: 2 Covered: 2223 Flagged: 01
 
1 2 3 4 5 6
1 1 . . . . .
2 .? . . . . .
3 . . . . . .
4 1. . . . . .
 
Pick a cell: of 16 6
Mines: 2 Covered: 2223 Flagged: 01
 
1 2 3 4 5 6
1 1 . . . . .
2 ? . . . . .
3 . . . . . .
4 . . . . . .
 
Pick a cell: f 6 4
Mines: 2 Covered: 23 Flagged: 2
 
1 2 3 4 5 6
1 ▢ . . . . .
2 ? . . . . .
3 . . . . . .
4 . . . . . ?
 
Pick a cell: f 1 2
Mines: 2 Covered: 23 Flagged: 1
 
1 2 3 4 5 6
1 ▢ . . . . .
2 . . . . . .
3 . . . . . .
4 1. . . . . .?
 
Pick a cell: o 1 2
Mines: 2 Covered: 14 Flagged: 1
 
1 2 3 4 5 6
1 ▢ 1 . . . .
2 ▢ 1 . . . .
3 ▢ 1 2 . . .
4 ▢ ▢ 1 . . ?
 
Pick a cell: o 6 1
Mines: 2 Covered: 34 Flagged: 01
 
1 2 3 4 5 6
1 1 . 1 ▢ ▢
2 . 21 1. 1 ▢ ▢
3 . 1 2 2 1
4 1 1 1 . 1 ?
 
Pick a cell: f 24 14
Mines: 2 Covered: 34 Flagged: 12
 
1 2 3 4 5 6
1 1 ?1 1. 1 ▢ ▢
2 . 21 1. 1 ▢ ▢
3 . 1 2 2 1
4 1 1 1 ? 1 ?
 
Pick a cell: f 1o 3 2
Mines: 20 Covered: 32 Flagged: 21
 
1 2 3 4 5 6
1 1 ?1 1. 1 ▢ ▢
2 . 21 1X 1 ▢ ▢
3 ? 1 2 2 1
4 1 1 1 X 1 ?
 
You WinLose.</pre>
</pre>
 
=={{header|J}}==
Anonymous user