我想用反應香蕉來寫一個旅行者遊戲,人們可以編寫機器人。 FRP對我來說是全新的,而且我很難開始。我開始時創建了一個更精細的Graph,但爲了我的目的,我試圖儘可能簡化它。 我想要一些指導,主要是從哪裏開始,以及如何將這個更大的問題分解成更小的問題來解決。這是最初的設計。功能香蕉旅行者遊戲 - 令人反感和瘋狂
這個想法是有一個LNodes圖(爲了簡單起見,我現在忽略了加權邊緣)。這些LNodes我描述爲Planet
s。 Planet
有一個名字,玩家地圖Planet
和Resource
s。玩家有一個ID,資源和一個Planet.Here的數據結構和一些相關的功能,然後進行更多的討論。
-- 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
更新Vulcan上的地圖。移動將允許從一個 LNode
穿越到另一個,只要LNode
s通過邊緣連接。 Take將從當前的Planet
中刪除resources
,Player
爲「on」並將那些resources
添加到 Player
。 Give會做相反的事情。
我該如何將這個大問題分解成更小的問題,以便我能夠解決這個問題?
更新:結果尋找Wumpus不是一個很好的選擇來幫助學習FRP,請參閱對於here FRP的解釋。這是Heinrich Apfelmus的迴應。
這就是說,我現在完全忽略網絡代碼。我只能寫一些虛擬機器人來測試時間等。
更新:有些人似乎對這個問題感興趣,所以我要在這裏跟蹤相關的問題。
啊狩獵的wumpus!是的,開始較小的聲音就像是一個好的舉動。 –