76 lines
1.5 KiB
Haskell
76 lines
1.5 KiB
Haskell
|
|
|
|
module Client where
|
|
|
|
import Eval
|
|
import Lambda
|
|
import AI
|
|
import GoalTransform
|
|
|
|
import System.IO
|
|
import System.Environment
|
|
import Control.Monad
|
|
|
|
import qualified Data.Array.IO as A
|
|
|
|
readMove :: Turn Move
|
|
readMove = do
|
|
lr <- liftIO getLine
|
|
sf <- liftIO getLine
|
|
st <- liftIO getLine
|
|
if (lr == "1") then (do
|
|
let f = read sf :: Card
|
|
let t = read st :: Int
|
|
return $ MoveLeft f t
|
|
) else (do
|
|
let f = read sf :: Int
|
|
let t = read st :: Card
|
|
return $ MoveRight f t
|
|
)
|
|
|
|
stepClient :: Turn ()
|
|
stepClient = readMove >>= runMove
|
|
|
|
stepAI :: Turn Goal -> Turn ()
|
|
stepAI ai = do
|
|
try (do
|
|
goal <- ai
|
|
move <- moveGoal goal
|
|
liftIO $ printMove move
|
|
runMove move
|
|
) (\s -> do
|
|
liftIO $ hPutStrLn stderr $ "Error calculating move"
|
|
game <- getGame
|
|
ownfields <- liftIO $ A.getAssocs (fields $ proponent game)
|
|
let (a, _):_ = filter (\(_, (_, v)) -> v > 0) ownfields
|
|
liftIO $ hPutStrLn stderr $ "=> I " ++ show a
|
|
liftIO $ printMove (MoveLeft Card_I a)
|
|
runMove (MoveLeft Card_I a)
|
|
)
|
|
|
|
run :: Turn Goal -> Bool -> IO ()
|
|
run ai firstPlayer = do
|
|
hSetBuffering stdin NoBuffering
|
|
hSetBuffering stdout NoBuffering
|
|
game <- initGame
|
|
runTurn _loop1 game
|
|
return ()
|
|
where
|
|
_loop1 :: Turn ()
|
|
_loop1 = do
|
|
when (firstPlayer) (stepAI ai)
|
|
_loop
|
|
_loop :: Turn ()
|
|
_loop = do
|
|
stepClient
|
|
stepAI ai
|
|
_loop
|
|
|
|
|
|
getArgsFirstPlayer :: IO Bool
|
|
getArgsFirstPlayer = do
|
|
arg:_ <- getArgs
|
|
return $ arg == "0"
|
|
|
|
main = getArgsFirstPlayer >>= run aimove
|