Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement