#1 Handle all inputs
This commit is contained in:
parent
df3b6ae092
commit
6dbedddb7b
1 changed files with 24 additions and 41 deletions
|
@ -115,7 +115,9 @@ isInGame (x, y) g = horizontalCheck && verticalCheck
|
|||
leftBound = fst gameStacksCoord <= x
|
||||
rightBound = x < amountOfGameStacks
|
||||
upBound = y <= snd gameStacksCoord
|
||||
downBound = negate y < length (gameStacks (board g) !! x)
|
||||
xStack = gameStacks (board g) !! x
|
||||
downBound = zero || negate y < length xStack
|
||||
zero = y == 0 && length xStack == 0
|
||||
|
||||
-- Get the zone number from a coordinate.
|
||||
getZoneFromCoord :: Game -> Coordinate -> Zone
|
||||
|
@ -155,50 +157,31 @@ rotatePile g@Game{ board = b } = g{ board = rotatedBoard }
|
|||
(head, tail) = splitAt rotateStep $ pile b
|
||||
|
||||
-- Check if a card can be placed ontop of a gameStack.
|
||||
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]
|
||||
canPlayOn :: Stack -> Int -> Stack -> Bool
|
||||
canPlayOn [] _ _ = False
|
||||
canPlayOn cs index [] = v1 == King && vis == Visible
|
||||
where (_,v1,vis) = cs !! index
|
||||
canPlayOn cs index ((t2,v2,_):_) = differentColor && predValue && visibility
|
||||
where (t1,v1,vis) = cs !! index
|
||||
differentColor = t1 /= t2 && (fromEnum t1 + fromEnum t2) `elem` [1,2,4,5]
|
||||
predValue = succ v1 == v2
|
||||
canPlayOn _ _ = False
|
||||
visibility = vis == Visible
|
||||
|
||||
-- Check if a card can be played ontop of an EndingStack.
|
||||
canFinishOn :: Card -> Stack -> Bool
|
||||
canFinishOn (_,Ace,_) [] = True
|
||||
canFinishOn (t1,v1,_) ((t2,v2,_):cs) = sameType && succValue
|
||||
where sameType = t1 == t2
|
||||
canFinishOn :: Stack -> Int -> Stack -> Bool
|
||||
canFinishOn [] _ _ = False
|
||||
canFinishOn cs index [] = v1 == Ace && vis == Visible
|
||||
where (_,v1,vis) = cs !! index
|
||||
canFinishOn cs index ((t2,v2,_):_) = sameType && succValue && visibility
|
||||
where (t1,v1,vis) = cs !! index
|
||||
sameType = t1 == t2
|
||||
succValue = v1 == succ v2
|
||||
canFinishOn _ _ = False
|
||||
|
||||
-- Move a card to a GameStack. Move all the cards below the given card
|
||||
-- on the 'from' stack as well.
|
||||
moveBetweenGS :: Int -> Stack -> Stack -> (Stack,Stack)
|
||||
moveBetweenGS index from to
|
||||
| canPlayOn (from !! index) to = (showFirst removed, added)
|
||||
| otherwise = (from,to)
|
||||
where (diff,removed) = splitAt (index + 1) from
|
||||
added = diff ++ to
|
||||
|
||||
-- Move a card to an EndingStack. This can only be a single card at once.
|
||||
moveToES :: Int -> Stack -> Stack -> (Stack,Stack)
|
||||
moveToES _ from to
|
||||
| canFinishOn (head from) to = (showFirst removed, added)
|
||||
| otherwise = (from,to)
|
||||
where (diff,removed) = splitAt 1 from
|
||||
added = diff ++ to
|
||||
|
||||
-- Move from an EndingStack to GameStack.
|
||||
moveESToGS :: Int -> Stack -> Stack -> (Stack,Stack)
|
||||
moveESToGS _ from to
|
||||
| canPlayOn (head from) to = (cs, added)
|
||||
| otherwise = (from, to)
|
||||
where (c:cs) = from
|
||||
added = c:to
|
||||
visibility = vis == Visible
|
||||
|
||||
-- Move from one gameStack to another.
|
||||
moveGS2GS :: Coordinate -> Int -> Board -> Board
|
||||
moveGS2GS fromCoord toStackNr board
|
||||
| canPlayOn (from !! (index - 1)) to = newBoard
|
||||
| canPlayOn from (index - 1) to = newBoard
|
||||
| otherwise = board
|
||||
where (fromStackNr, negIndex) = fromCoord
|
||||
fromAmount = length from
|
||||
|
@ -214,7 +197,7 @@ moveGS2GS fromCoord toStackNr board
|
|||
|
||||
moveGS2ES :: Coordinate -> Int -> Board -> Board
|
||||
moveGS2ES fromCoord toIndex board
|
||||
| canFinishOn (head from) to = newBoard
|
||||
| canFinishOn from 0 to = newBoard
|
||||
| otherwise = board
|
||||
where (fromIndex, _) = fromCoord
|
||||
oldGS = gameStacks board
|
||||
|
@ -230,7 +213,7 @@ moveGS2ES fromCoord toIndex board
|
|||
-- Move a card between pile and endingStacks.
|
||||
moveP2ES :: Coordinate -> Int -> Board -> Board
|
||||
moveP2ES _ toIndex board
|
||||
| canFinishOn (head oldPile) to = newBoard
|
||||
| canFinishOn oldPile 0 to = newBoard
|
||||
| otherwise = board
|
||||
where oldPile = pile board
|
||||
oldES = endingStacks board
|
||||
|
@ -243,7 +226,7 @@ moveP2ES _ toIndex board
|
|||
-- Move a card between pile and gameStacks.
|
||||
moveP2GS :: Coordinate -> Int -> Board -> Board
|
||||
moveP2GS _ toStackNr board
|
||||
| canPlayOn (head oldPile) to = newBoard
|
||||
| canPlayOn oldPile 0 to = newBoard
|
||||
| otherwise = board
|
||||
where oldPile = pile board
|
||||
oldGS = gameStacks board
|
||||
|
@ -255,7 +238,7 @@ moveP2GS _ toStackNr board
|
|||
|
||||
moveES2GS :: Coordinate -> Int -> Board -> Board
|
||||
moveES2GS fromCoord toStackNr board
|
||||
| canPlayOn (head from) to = newBoard
|
||||
| canPlayOn from 0 to = newBoard
|
||||
| otherwise = board
|
||||
where (tempIndex, _) = fromCoord
|
||||
fromIndex = tempIndex - (amountOfGameStacks - amountOfEndingStacks)
|
||||
|
|
Reference in a new issue