module Main (main) where import Game.Spacegoo import Data.List import Control.Monad (msum) main = client 6000 "spacegoo.gpn.entropia.de" "username" "password" myStrategy exampleStrategy :: Strategy exampleStrategy s = do me <- playerId `fmap` find itsme (players s) let he = 3 - me aPlanet <- find (\p -> planetOwner p == me) (planets s) otherPlanet <- find (\p -> planetOwner p == he) (planets s) return (planetId aPlanet, planetId otherPlanet, planetShips aPlanet) planetCompareShips :: Planet -> Planet -> Ordering planetCompareShips p1 p2 = compare (numShips p1) (numShips p2) where numShips Planet {planetShips = (a, b, c)} = a + b + c isUnattacked :: [Fleet] -> Planet -> Bool isUnattacked fleets Planet{planetId = pid} = notElem pid $ map target fleets comparePlanetDistance :: Planet -> Planet -> Planet -> Ordering comparePlanetDistance p0 p1 p2 = compare (distance p0 p1) (distance p0 p2) safeHead :: [a] -> Maybe a safeHead [] = Nothing safeHead (h:_) = Just h safeMaximumBy f [] = Nothing safeMaximumBy f l = Just $ maximumBy f l myId :: State -> Maybe Int myId s = playerId `fmap` find itsme (players s) strongestPlanet :: [Planet] -> Maybe Planet strongestPlanet = safeMaximumBy planetCompareShips fullForceStrategy :: Strategy fullForceStrategy s = do me <- myId s let ownPlanets = filter (\p -> planetOwner p == me) $ planets s let unattacked = filter (isUnattacked $ fleets s) ownPlanets strongest <- strongestPlanet unattacked let hostilePlanets = sortBy (comparePlanetDistance strongest) $ filter (\p -> planetOwner p /= me && planetOwner p /= 0) $ planets s let beatable = filter (\p -> planetCompareShips strongest p == GT) hostilePlanets target <- safeHead beatable return (planetId strongest, planetId target, (1000, 1000, 1000)) oneShip :: Strategy oneShip s = do me <- myId s let ownPlanets = filter (\p -> planetOwner p == me) $ planets s strongest <- strongestPlanet ownPlanets let otherPlanets = sortBy (comparePlanetDistance strongest) $ filter (\p -> planetOwner p /= me) $ planets s target <- safeHead otherPlanets return (planetId strongest, planetId target, (1, 1, 1)) myStrategy :: Strategy myStrategy s = msum [fullForceStrategy s, oneShip s]