{-
Module: Board.
Checks involving the board and machinery for placing a wall.
-}
module Board where
import Data.Graph
import Data.List
import Data.Array
import Types
import Cell
import Action
{-
Checking if a step is valid and using it to get the reachable cells from a given cell.
-}
Check if step is contained in the board, i.e. is one of the edges.
validStep :: Board -> Step -> Bool
validStep b mv = (stepToEdge mv) `elem` (edges b)
Cells reachable from a given cell.
reachableCells :: Board -> Cell -> [Cell]
reachableCells b c = filter (c -> validStep b (c, c)) (cellsAroundInBoard c)
{-
Checking if a wall is valid.
-}
Check if the steps representing the wall are parallel.
parallelSteps :: Board -> Step -> Step -> Bool
parallelSteps b (cs, ce) (cs, ce) =
((isHorizontallyAdjacent cs cs) && (isHorizontallyAdjacent ce ce) &&
(isVerticallyAdjacent cs ce) && (isVerticallyAdjacent cs ce)) ||
((isVerticallyAdjacent cs cs) && (isVerticallyAdjacent ce ce)&&
(isHorizontallyAdjacent cs ce) && (isHorizontallyAdjacent cs ce))
Check that no wall has been placed that could interfere with the wall we want to place.
noCrossingWalls :: Board -> Step -> Step -> Bool
noCrossingWalls b (cs, ce) (cs, ce) = (validStep b (cs, cs)) && (validStep b (ce, ce))
Check if the edges corresponding to the wall we want to remove are in the board.
validWallSteps :: Board -> Wall -> Bool
validWallSteps b (s, s) = (validStep b s) && (validStep b s)
If the three conditions above are satisfied, it is a valid wall.
validWall :: Board -> Wall -> Bool
validWall b w@(s, s) =
(validWallSteps b w) && (parallelSteps b s s) && (noCrossingWalls b s s)
{-
Action of placing a wall.
-}
Remove a step (used for placing walls).
removeStep :: Board -> Step -> Board
removeStep b s =
let (cI, cI) = stepToEdge s in
b//[(cI, delete cI (b!cI)), (cI, delete cI (b!cI))]
Placing a wall is the same as removing the two steps that represent it.
placeWall :: Board -> Wall -> Board
placeWall b (mv, mv) = removeStep (removeStep b mv) mv
Reviews
There are no reviews yet.