Anonymous user
Minesweeper game: Difference between revisions
m
→{{header|Haskell}}
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 =
totalCols =
emptyBoard :: Board
Line 3,409:
, _cellId = n}) <$> zip [1..] positions
where
positions = (,) <$> [1..
updateCell :: Cell -> Board -> Board
Line 3,419:
okToOpen :: [Cell] -> [Cell]
okToOpen = filter (\c -> c ^? coveredLens == Just (False, False))
isFirstMove = (== totalCols * totalRows)▼
. lengthOf (folded . coveredFlaggedLens . filtered (== False))▼
openUnMined :: Cell -> Cell
Line 3,466 ⟶ 3,462:
adjacentCells :: Cell -> Board -> [Cell]
adjacentCells Cell {
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 b = allUnMinedOpen b || allMinesFlagged b
allUnMinedOpen = (== 0) . lengthOf (traverse . coveredMinedLens . filtered (== False))
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 "▢"
| otherwise = "."
Line 3,637 ⟶ 3,629:
startGame p b = gameLoop . openCell p <$> mineBoard p b</lang>
{{out}}
<pre> Mines: 0 Covered: 24 Flagged: 0▼
▲ Mines: 0 Covered: 24 Flagged: 0
1 2 3 4 5 6
Line 3,651 ⟶ 3,641:
1 2 3 4 5 6
1
2 . . . . . .
3 . . . . . .
4 . . . . . .
Pick a cell:
Mines: 2 Covered:
1 2 3 4 5 6
1
2
3 . . . . . .
4
Pick a cell:
Mines: 2 Covered:
1 2 3 4 5 6
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
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:
1 2 3 4 5 6
1 ▢ 1 . 1
2
3
4
Pick a cell: f
Mines: 2 Covered:
1 2 3 4 5 6
1
2
3
4
Pick a cell:
Mines:
1 2 3 4 5 6
1
2
3
4
You
=={{header|J}}==
|