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]