hw12: solution to exercise 2
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Mon, 29 Dec 2014 07:02:21 +0000 (12:32 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Mon, 29 Dec 2014 07:02:21 +0000 (12:32 +0530)
hw12/Risk.hs

index b78ac1002e30e094e6fa72e989a578dd84d2d69a..965c7c7887e20104d57d52fadb23021d7f7e3c6e 100644 (file)
@@ -5,7 +5,7 @@ module Risk where
 import Control.Applicative
 import Control.Monad.Random
 import Control.Monad(replicateM, liftM)
-import Data.List(sort)
+import Data.List(sortBy)
 
 ------------------------------------------------------------
 -- Die values
@@ -30,10 +30,17 @@ type Army = Int
 
 data Battlefield = Battlefield { attackers :: Army, defenders :: Army }
 
--- battle :: Battlefield -> Rand StdGen Battlefield
+newBattlefield :: Battlefield -> [DieValue] -> [DieValue] -> Battlefield
+newBattlefield battlefield rollA rollB =
+    let pairList = zip (sortBy (flip compare) rollA) (sortBy (flip compare) rollB)
+    in
+      foldr (\(a, d) acc -> if a > d then Battlefield (attackers acc) ((defenders acc) - 1)
+                            else Battlefield ((attackers acc) - 1)  (defenders acc)) battlefield pairList
+
+
+battle :: Battlefield -> Rand StdGen Battlefield
 battle (Battlefield {attackers = a, defenders = d}) =
   let rolla = replicateM (min (a - 1) 3) die
       rolld = replicateM (min d 2) die
-      zipped = liftA2 zip rolla rolld
   in
-   
+    liftA2 (newBattlefield (Battlefield a d)) rolla rolld