我想用无功香蕉写一个旅行者的游戏,人们可以写为机器人。 玻璃钢是完全新的给我,和我有麻烦的开始。 我创建了一个更复杂的图形,当我开始,但我在这里的目的,我试图使它尽可能简单。 我想一些指导,主要是从哪里开始,如何分解这个更大的问题分成更小的问题需要解决。 这里的初始设计。
这个想法是有的lnode的图(加权边缘,我忽略了,现在为了简单起见)。 这些的lnode我形容为Planet
秒。 该Planet
■找一个名字,在地图上的玩家的Planet
和Resource
秒。 玩家有一个ID,资源和Planet.Here的数据Structues和一些相关功能,其次是更多的讨论。
-- Graph-building records and functions
data PlanetName = Vulcan
| Mongo
| Arakis
| Dantooine
| Tatooine
deriving (Enum,Bounded,Show)
data Planet = Planet {pName :: PlanetName
,player :: IntMap Player
,resources :: Int
} deriving Show
data Player = Player {pid :: Int
,resources :: Int
} deriving Show
makePlanetNodes :: PlanetName -> [LNode Planet]
makePlanetNodes planet = Prelude.map makePlanetNodes' $
zip [planet ..] [0 ..]
where makePlanetNodes' (planet,i) =
(i,Planet {pName = planet, players = IM.empty})
makePlanetGraph p = mkGraph p [(0,1,1),(1,2,2),(2,3,4),(3,4,3),(4,0,2)]
-- Networking and command functions
prepareSocket :: PortNumber -> IO Socket
prepareSocket port = do
sock' <- socket AF_INET Stream defaultProtocol
let socketAddress = SockAddrInet port 0000
bindSocket sock' socketAddress
listen sock' 1
putStrLn $ "Listening on " ++ (show port)
return sock'
acceptConnections :: Socket -> IO ()
acceptConnections sock' = do
forever $ do
(sock, sockAddr) <- Network.Socket.accept sock'
handle <- socketToHandle sock ReadWriteMode
sockHandler sock handle
sockHandler :: Socket -> Handle -> IO ()
sockHandler sock' handle = do
hSetBuffering handle LineBuffering
forkIO $ commandProcessor handle
return ()
commandProcessor :: Handle -> IO ()
commandProcessor handle = untilM (hIsEOF handle) handleCommand >> hClose handle
where
handleCommand = do
line <- hGetLine handle
let (cmd:arg) = words line
case cmd of
"echo" -> echoCommand handle arg
"move" -> moveCommand handle arg
"join" -> joinCommand handle arg
"take" -> takeCommand handle arg
"give" -> giveCommand handle arg
_ -> do hPutStrLn handle "Unknown command"
echoCommand :: Handle -> [String] -> IO ()
echoCommand handle arg = do
hPutStrLn handle (unwords arg)
moveCommand = undefined
joinCommand = undefined
takeCommand = undefined
giveCommand = undefined
这是我目前所知,我的活动将涉及类型的Planet
和Player
。 行为将涉及移动,加盟,拿,并给予。 当玩家加入,它会创建一个新的Player
的事件和更新火神的地图与Player
。 此举将允许从一个遍历LNode
到另一个,所提供的LNode
S按一个边缘相连接。 以将删除resources
从目前的Planet
的Player
是“开”和那些添加resources
的Player
。 给却反其道而行之。
我怎样才能打破这种大问题分成更小的问题,这样我就可以解决这个东西我的头?
更新:原来亨特Wumpus是不是一个很好的选择,以帮助学习FRP,见什么FRP是一个交代在这里 。 这是由海因里希Apfelmus的响应。
这就是说,我会完全忽视网络代码现在。 我可以只写一些虚拟机器人测试时间等。
更新:有些人似乎是有意这个问题,所以我要在这里追踪相关的问题。
建立一个计时器
输入处理