- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
灵感来自 Brent Yorgey 的
adventure game ,
我一直在编写一个基于文本的小型冒险游戏(la Zork),它使用
MonadPrompt
图书馆。使用它来分离 IO 后端相当简单
从控制游戏玩法的实际功能,但我现在正在尝试做
一些更复杂的东西。
基本上,我想启用撤消和重做作为游戏的一项功能。我的策略
因为这一直是保持游戏状态的 zipper (包括最后一个
输入是)。因为我希望能够在重新加载时保持历史记录
游戏,保存文件只是玩家执行的所有输入的列表
会影响游戏状态(因此不包括检查库存,
说)。这个想法是从保存中的输入快速重播最后一场比赛
加载游戏时的文件(跳过输出到终端,并从
文件中的列表),从而建立完整的游戏状态历史。
这是一些基本显示我的设置的代码(我为长度道歉,但这比实际代码简化了很多):
data Action = UndoAction | RedoAction | Go Direction -- etc ...
-- Actions are what we parse user input into, there is also error handling
-- that I left out of this example
data RPGPrompt a where
Say :: String -> RPGPrompt ()
QueryUser :: String -> RPGPrompt Action
Undo :: RPGPrompt ( Prompt RPGPrompt ())
Redo :: RPGPrompt ( Prompt RPGPrompt ())
{-
... More prompts like save, quit etc. Also a prompt for the play function
to query the underlying gamestate (but not the GameZipper directly)
-}
data GameState = GameState { {- hp, location etc -} }
data GameZipper = GameZipper { past :: [GameState],
present :: GameState,
future :: [GameState]}
play :: Prompt RPGPrompt ()
play = do
a <- prompt (QueryUser "What do you want to do?")
case a of
Go dir -> {- modify gamestate to change location ... -} >> play
UndoAction -> prompt (Say "Undo!") >> join (prompt Undo)
...
parseAction :: String -> Action
...
undo :: GameZipper -> GameZipper
-- shifts the last state to the present state and the current state to the future
basicIO :: RPGPrompt a -> StateT GameZipper IO a
basicIO (Say x) = putStrLn x
basicIO (QueryUser query) = do
putStrLn query
r <- parseAction <$> getLine
case r of
UndoAction -> {- ... check if undo is possible etc -}
Go dir -> {- ... push old gamestate into past in gamezipper,
create fresh gamestate for present ... -} >> return r
...
basicIO (Undo) = modify undo >> return play
...
replayIO :: (RPGPrompt a -> StateT GameZipper IO a) ->
[Action] ->
RPGPrompt a ->
StateT GameZipper IO a
replayIO _ _ (Say _) = return () -- don't output anything
replayIO resume [] (QueryUser t) = resume (QueryUser t)
replayIO _ (action:actions) (Query _) =
case action of
... {- similar to basicIO here, but any non-gamestate-affecting
actions are no-ops (though the save file shouldn't record them
technically) -}
...
replayIO
的这个实现但不起作用,因为
replayIO
不是
replayIO
.它从函数中获取初始操作列表
GameState
中回放操作.我不喜欢这个,因为这意味着我不能
basicIO
和
replayIO
.我想要
replayIO
处理其
basicIO
对于该列表
runPromptM
从 MonadPrompt 包中使用 Prompt
最佳答案
据我所知,没有办法在运行 Prompt
中途切换提示处理程序。 Action ,因此您将需要一个处理程序来处理仍有 Action 要重播的情况以及恢复正常播放的情况。
我认为解决此问题的最佳方法是添加另一个 StateT
转换到您的堆栈以存储要执行的剩余操作列表。这样,回放逻辑可以与 basicIO
中的主游戏逻辑分开。 ,并且您的重播处理程序可以调用 lift . basicIO
当没有任何 Action 时,不执行任何操作或从状态中选择 Action 。
关于haskell - 使用 MonadPrompt 实现回放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8203745/
我有一个 cvMat 类型的 vector ,我一直在其中存储从我的计算机网络摄像头拍摄的帧。存储 100 帧后,我想回放这些帧。如果 record 是我的 cvMats vector ,我想这可能是
我正在尝试设置一个将重播最新值的 Angular2 Observable。 import {Injectable} from 'angular2/core'; import {Observable}
如何在没有 IDE 的情况下回放 Rational Functional Tester 8.1 而使用命令提示符请提供命令 最佳答案 在以下链接中搜索“命令行”: http://publib.boul
我想知道是否有人在录音(从用户浏览器上的麦克风)和从基于网络的应用程序(Ruby/RoR)回放方面取得了成功? 到目前为止我发现了什么 - 我可以编写一个 flex/flash 应用程序来录制音频,然
我正在使用以下代码来实现实时录制和回放系统: import android.media.*; class Rec { static boolean m_isRun = true; static int
假设我想通过设置所有内容并在我的输入回调中接收音频数据的常规过程来记录到我的输入队列中。我不想将其写入文件,而是想在某个地方开始短暂地缓冲它,然后将其提供给输出队列,输出队列将在我的输入队列后不久开始
我是一名优秀的程序员,十分优秀!