使用 System.Console.ANSI 的 ASCII 动画
ASCII Animation Using System.Console.ANSI
这个学期我正在为我的 class 做我的第三个 Haskell 项目,我们从 hello world,到简单的数学,再到使用 Haskell 动画 ASCII 字符,我是对这个项目完全傻眼了。我的教授在他的网站上没有关于此的任何内容,System.Console.ANSI 的文档也不是很有帮助。经过广泛搜索后,我也无法在网上找到任何关于此的示例。
有没有人这样做过或者至少告诉我我的方向是否正确?
第一个问题是这个
[16] 使用System.Console.ANSI 库绘制基于框架的彩图[4]。它必须至少为 8 行 x 16 列 [4] 并且至少有 2 个帧 [8],它们应该无限交替。调用这个颜色-comic.hs.
我的颜色-comic.hs看起来像这样
module Main (
main
) where
import System.Console.ANSI
import System.IO
import Control.Concurrent
colorComic :: [IO ()]
colorComic = [printBlock, flashBlue, flashRed]
main :: IO ()
main = do
colorComic
pause :: IO ()
pause = do
hFlush stdout
-- 1 second pause
threadDelay 1000000
flashRed :: IO ()//change text color to red
flashRed = do
setSGR [SetColor Foreground Vivid Red]
pause
flashBlue :: IO ()//change text color to blue
flashBlue = do
setSGR [SetColor Foreground Vivid Blue]
pause
printBlock :: IO ()// print 8x16 block
printBlock = do
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
我不明白如何让这个 运行 无限,我得到这个错误,我不确定为什么,putStrLn
一直对我有用。我这样做正确吗?
color-comic.hs:39:5: parse error on input ‘putStrLn’
第二个问题比较难,但我想我知道怎么做了
[32] 使用 System.Console.ANSI 库以 ASCII 格式绘制彩色动画。动画应为 25 行 x 60 列 [8],帧速率为 30 Hz [4],持续时间不超过 10 秒 [4],至少使用三种颜色 [8],不能连续出现两个帧在动画中是相同的[8],并且是独一无二的[-32]。
对于上面的问题,我可以简单地以正确的尺寸制作一个 # 块,然后连续更改每一行的颜色,然后重新绘制整个块,将颜色推低一个并添加一个新颜色,然后很快。我不确定如何做帧率。
非常感谢任何帮助,我只是想学习。
我能够通过使用递归来制作无限闪光,由于某种原因,它之前没有导致它挂起。
module Main (
main
) where
import System.Console.ANSI
import System.IO
import Control.Concurrent
colorComic :: [IO ()]
colorComic = [printBlock]
main :: IO ()
main = mapM_ (\color_comic -> resetScreen >> color_comic) colorComic
resetScreen :: IO ()
resetScreen = clearScreen >> setSGR [Reset] >> setCursorPosition 0 0
pause :: IO ()
pause = do
hFlush stdout
-- 1 second pause
threadDelay 1000000
printBlock :: IO ()
printBlock = do
clearScreen >> setCursorPosition 0 0
setSGR [SetColor Foreground Vivid Red]
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
pause
clearScreen >> setCursorPosition 0 0
setSGR [SetColor Foreground Vivid Blue]
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
pause
printBlock
您可以避免在 printBlock 末尾的递归调用以及在您的代码中使用 iterateM_ 而不是 mapM_ 来避免 colorComic 函数的需要主要函数。
main :: IO ()
main = do
resetScreen
iterateM_ (\_ -> printBlock) ()
这个学期我正在为我的 class 做我的第三个 Haskell 项目,我们从 hello world,到简单的数学,再到使用 Haskell 动画 ASCII 字符,我是对这个项目完全傻眼了。我的教授在他的网站上没有关于此的任何内容,System.Console.ANSI 的文档也不是很有帮助。经过广泛搜索后,我也无法在网上找到任何关于此的示例。
有没有人这样做过或者至少告诉我我的方向是否正确?
第一个问题是这个
[16] 使用System.Console.ANSI 库绘制基于框架的彩图[4]。它必须至少为 8 行 x 16 列 [4] 并且至少有 2 个帧 [8],它们应该无限交替。调用这个颜色-comic.hs.
我的颜色-comic.hs看起来像这样
module Main (
main
) where
import System.Console.ANSI
import System.IO
import Control.Concurrent
colorComic :: [IO ()]
colorComic = [printBlock, flashBlue, flashRed]
main :: IO ()
main = do
colorComic
pause :: IO ()
pause = do
hFlush stdout
-- 1 second pause
threadDelay 1000000
flashRed :: IO ()//change text color to red
flashRed = do
setSGR [SetColor Foreground Vivid Red]
pause
flashBlue :: IO ()//change text color to blue
flashBlue = do
setSGR [SetColor Foreground Vivid Blue]
pause
printBlock :: IO ()// print 8x16 block
printBlock = do
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
我不明白如何让这个 运行 无限,我得到这个错误,我不确定为什么,putStrLn
一直对我有用。我这样做正确吗?
color-comic.hs:39:5: parse error on input ‘putStrLn’
第二个问题比较难,但我想我知道怎么做了
[32] 使用 System.Console.ANSI 库以 ASCII 格式绘制彩色动画。动画应为 25 行 x 60 列 [8],帧速率为 30 Hz [4],持续时间不超过 10 秒 [4],至少使用三种颜色 [8],不能连续出现两个帧在动画中是相同的[8],并且是独一无二的[-32]。
对于上面的问题,我可以简单地以正确的尺寸制作一个 # 块,然后连续更改每一行的颜色,然后重新绘制整个块,将颜色推低一个并添加一个新颜色,然后很快。我不确定如何做帧率。
非常感谢任何帮助,我只是想学习。
我能够通过使用递归来制作无限闪光,由于某种原因,它之前没有导致它挂起。
module Main (
main
) where
import System.Console.ANSI
import System.IO
import Control.Concurrent
colorComic :: [IO ()]
colorComic = [printBlock]
main :: IO ()
main = mapM_ (\color_comic -> resetScreen >> color_comic) colorComic
resetScreen :: IO ()
resetScreen = clearScreen >> setSGR [Reset] >> setCursorPosition 0 0
pause :: IO ()
pause = do
hFlush stdout
-- 1 second pause
threadDelay 1000000
printBlock :: IO ()
printBlock = do
clearScreen >> setCursorPosition 0 0
setSGR [SetColor Foreground Vivid Red]
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
pause
clearScreen >> setCursorPosition 0 0
setSGR [SetColor Foreground Vivid Blue]
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
putStrLn "################"
pause
printBlock
您可以避免在 printBlock 末尾的递归调用以及在您的代码中使用 iterateM_ 而不是 mapM_ 来避免 colorComic 函数的需要主要函数。
main :: IO ()
main = do
resetScreen
iterateM_ (\_ -> printBlock) ()