You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.5 KiB
75 lines
1.5 KiB
|
|
|
|
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
|
|
|