From d0b708db62725b90f28334471eb46132b295d1a5 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 14 Nov 2022 21:35:35 +0100 Subject: [PATCH] #12 Add zone move constraints --- lib/PatienceBoard.hs | 51 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/lib/PatienceBoard.hs b/lib/PatienceBoard.hs index 6785968..e3dfd91 100644 --- a/lib/PatienceBoard.hs +++ b/lib/PatienceBoard.hs @@ -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