diff --git a/vm/VM.hs b/vm/VM.hs index f0e54bd..3efeac2 100644 --- a/vm/VM.hs +++ b/vm/VM.hs @@ -51,10 +51,10 @@ clearLines (Board width height filled) = let (newFilled, linesDeleted) = tryToDe in Set.map (\(x, y) -> if y < l then (x, y + 1) else (x, y)) deleted lockUnit :: Game -> Game -lockUnit (Game board (u:us) _ oldLines oldPoints) = Game newBoard us (Set.fromList []) newLines (newPoints + oldPoints) where +lockUnit (Game board (u:us) _ oldLines oldPoints) = Game newBoard us (Set.fromList []) newLines (newPoints + lineBonus + oldPoints) where tempBoard = board { boardFilled = Set.union (unitMembers u) (boardFilled board) } (newBoard, newLines) = clearLines tempBoard - newPoints = (Set.size (unitMembers u)) + (100 * (1 + newLines) * newLines `div` 2) + lineBonus + newPoints = (Set.size (unitMembers u)) + (100 * (1 + newLines) * newLines `div` 2) lineBonus = if oldLines > 1 then floor (fromIntegral ((oldLines - 1) * newPoints) / 10) else 0 @@ -63,6 +63,18 @@ testStep = let unit = Unit (Set.fromList [(2,9)]) (0,0) board = Board 5 10 (Set.fromList [(0,8),(1,8),(0,9),(1,9),(4,8),(3,9),(4,9)]) in step (Game board [unit] (Set.fromList []) 0 0) MoveSW +testStep2 = let unit = Unit (Set.fromList [(0,3),(1,3),(2,3),(3,3),(1,4),(2,4),(3,4), (1,5),(2,5),(2,6)]) (2,4) + board = Board 6 10 (Set.fromList [(0,8),(0,9),(4,6),(3,7),(4,7),(3,8),(4,8),(2,9),(3,9),(4,9),(5,8),(5,9)]) + (g1, n1) = step (Game board [unit] (Set.fromList []) 2 0) MoveSW + (g2, n2) = step g1 MoveSE + (g3, n3) = step g2 MoveSW + (g4, n4) = step g3 MoveSW + in (g4, n4) + +testStep3 = let unit = Unit (Set.fromList [(2,9)]) (0,0) + board = Board 5 10 (Set.fromList [(0,8),(1,8),(0,9),(1,9),(4,8),(3,9),(4,9)]) + in step (Game board [unit] (Set.fromList []) 0 0) MoveSW + step :: Game -> Command -> (Game, Notes) step game@(Game _ [] _ _ _) command = (game, ErrorZero) step game@(Game board (unit:us) oldPositions o l) command =