1
Fork 0

#12 Add zone move constraints

This commit is contained in:
Tibo De Peuter 2022-11-14 21:35:35 +01:00
parent 5be2419163
commit d0b708db62

View file

@ -3,6 +3,9 @@ module PatienceBoard
, Board (..)
, amountOfGameStacks
, amountOfEndingStacks
, gameStacksCoord
, endingStacksCoord
, pileCoord
, handleInputs
, initGame
@ -39,6 +42,20 @@ amountOfGameStacks = 7
amountOfEndingStacks :: Int
amountOfEndingStacks = 4
-- Coordinate of the GameStacks
gameStacksCoord :: Coordinate
gameStacksCoord = (0, 0)
-- Coordinate of the EndingStacks
endingStacksCoord :: Coordinate
endingStacksCoord = (x, 1)
where x = amountOfGameStacks - amountOfEndingStacks
-- Coordinate of the Pile
pileCoord :: Coordinate
pileCoord = (0, 1)
-- Step size to rotate the pile of the game
rotateStep :: Int
rotateStep = 3
@ -86,7 +103,7 @@ canPlayOn :: Card -> Stack -> Bool
canPlayOn (_,King,_) [] = True
canPlayOn (t1,v1,_) ((t2,v2,_):cs) = differentColor && predValue
where differentColor = t1 /= t2 && fromEnum t1 + fromEnum t2 `elem` [1,2,4,5]
predValue = fromEnum v1 + 1 == fromEnum v2
predValue = succ v1 == v2
canPlayOn _ _ = False
-- Check if a card can be played ontop of an EndingStack.
@ -94,7 +111,7 @@ canFinishOn :: Card -> Stack -> Bool
canFinishOn (_,Ace,_) [] = True
canFinishOn (t1,v1,_) ((t2,v2,_):cs) = sameType && succValue
where sameType = t1 == t2
succValue = fromEnum v1 == fromEnum v2 + 1
succValue = v1 == succ v2
canFinishOn _ _ = False
-- Move a card to a GameStack. Move all the cards below the given card
@ -116,9 +133,37 @@ moveToES from to
------------------------------ Input ---------------------------------
-- Check if a coordinate is in the pile.
isInPile :: Coordinate -> Bool
isInPile = (pileCoord == )
-- Check if a coordinate is in an endingStack.
isInEnding :: Coordinate -> Bool
isInEnding (x, y) = leftBound && rightBound && yCheck
where leftBound = fst endingStacksCoord <= x
rightBound = x < amountOfGameStacks
yCheck = y == snd endingStacksCoord
-- Check if a coordinate is in a GameStack.
isInGame :: Coordinate -> Game -> Bool
isInGame (x, y) g = horizontalCheck && verticalCheck
where horizontalCheck = leftBound && rightBound
verticalCheck = upBound && downBound
leftBound = fst gameStacksCoord <= x
rightBound = x < amountOfGameStacks
upBound = y <= snd gameStacksCoord
downBound = negate y < length (gameStacks (board g) !! x)
-- Check if moving in a direction is legal.
isLegalMove :: Direction -> Game -> Bool
isLegalMove dir g = isInPile coord || isInEnding coord || isInGame coord g
where coord = position $ move dir $ selector g
-- Move the selector of the game. (Wrapper)
moveSelector :: Direction -> Game -> Game
moveSelector dir g@Game{ selector = s } = g{ selector = move dir s }
moveSelector dir g@Game{ selector = s }
| isLegalMove dir g = g{ selector = move dir s }
| otherwise = g
-- Toggle selector. (Wrapper)
toggleSelector :: Game -> Game