リアクティブバナナを使用して、ボットを作成できるトラベラーゲームを作成したいと思います。FRPは私にとってまったく新しいものであり、私はスタートを切るのに苦労しています。始めたときはもっと手の込んだグラフを作成しましたが、ここでの目的のために、できるだけシンプルにするように努めました。主にどこから始めればよいか、そしてこの大きな問題を小さな問題に分解して解決する方法について、いくつかのガイダンスが必要です。これが初期設計です。
アイデアは、LNodeのグラフを作成することです(簡単にするために、今のところ無視している重み付きエッジを使用します)。私がsとして説明するこれらのLNode Planet
。には名前があり、とPlanet
のプレイヤーのマップがあります。プレイヤーはID、リソース、惑星を持っています。ここにデータ構造といくつかの関連する機能があり、その後にさらに議論が続きます。Planet
Resource
-- 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
場合に、1つから別のトラバーサルを許可します
。Takeは、現在の「オン」からLNode
削除し、それらをに
追加します。Giveは反対のことをします。resources
Planet
Player
resources
Player
この大きな問題を小さな問題に分割して、この問題に頭を悩ませることができるようにするにはどうすればよいですか?
更新:ハント・ザ・ワンパスはFRPの学習に役立つ良い選択ではないことが判明しました。ここで、FRPの目的の説明を参照してください。これは、ハインリッヒ・アフェルムスによる回答です。
そうは言っても、今のところネットワークコードは完全に無視します。タイミングなどをテストするために、ダミーのボットをいくつか書くことができます。
更新:一部の人々はこの問題に興味を持っているようですので、ここで関連する質問を追跡します。