module AI (aimove) where import Eval import Lambda import GoalTransform import qualified Data.Array.IO as A cannon 1 = "dec" cannon 2 = "S dec dec" cannon n = "S(" ++ cannon (n-1) ++ ") dec" keepalive func 0 = "S(" ++ func ++ ")(get)0" keepalive func 1 = "S(K(S(" ++ func ++ ")(get)))(succ)0" keepalive func slot = "S(" ++ func ++ ")(S (K get) (K " ++ show slot ++ "))0" findAliveSlot :: (Game -> Player) -> Turn Int findAliveSlot player = do game <- getGame slots <- liftIO $ A.getAssocs (fields $ player game) let (slot, _):_ = filter (\(_, (_, vit)) -> vit > 0) slots return slot findHighAliveSlot :: (Game -> Player) -> Turn Int findHighAliveSlot player = do game <- getGame slots <- liftIO $ A.getAssocs (fields $ player game) let (slot, _):_ = filter (\(_, (_, vit)) -> vit > 0) $ reverse slots return slot aimove :: Turn Goal aimove = do target <- findAliveSlot opponent let l = if (target == 255) then "S(dec)(S(get)(I))" else "S(S(K(dec))(K(" ++ show (255-target) ++ ")))(S(get)(I))" -- let l = if (target == 255) then "S(dec)(S(get)(I))" else "S(K(S(dec)(S(get)(I))))(K(" ++ show (255-target) ++ "))" let pos = 1 -- if (target == 255) then 1 else 255-target haveLoop <- satGoal (0, read l) if haveLoop then do haveLoop <- satGoal (pos, read l) if haveLoop then do return (Just pos, read (l ++ "0")) else return (Just pos, read "get 0") else do return (Just 0, read l)