2017-02-23 14 views
2

Ich bin in diesem Semester an meinem dritten Haskell-Projekt für meine Klasse und wir gingen von Hallo Welt zu einfacher Mathematik, um ASCII-Zeichen mit Haskell zu animieren und ich bin völlig verblüfft für dieses Projekt. Mein Professor hat dazu nichts auf seiner Website und die Dokumentation zu System.Console.ANSI ist nicht sehr hilfreich. Nach ausführlichen Recherchen kann ich dazu keine Beispiele finden.ASCII-Animation mit System.Console.ANSI

Hat jemand das getan oder zumindest sagen Sie mir, ob ich in die richtige Richtung gehe?

Die erste Frage ist


[16] Die System.Console.ANSI Bibliothek verwenden einen Rahmen-basierten Farb Zeichnung [4] zu ziehen. Es muss mindestens 8 Reihen mal 16 Spalten [4] haben und mindestens 2 Rahmen [8] haben, die sich unendlich abwechseln sollten. Nenne diese Farbe-comic.hs.


meine farb comic.hs sieht aus wie diese

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 "################" 

Ich verstehe nicht, wie das läuft unendlich lassen, und ich diesen Fehler und ich bin nicht sicher, warum, hat putStrLn immer gearbeitet für mich. Gehe ich das richtig?

farb comic.hs: 39: 5: Parsen Fehler bei der Eingabe

die zweite Frage ‚putStrLn‘ ist viel härter, aber ich denke, ich habe eine Idee, wie man diese

tun

[32] Verwenden Sie die System.Console.ANSI-Bibliothek, um eine farbige Animation in ASCII zu zeichnen. Die Animation sollte 25 Reihen x 60 Spalten [8] sein, eine Framerate von 30 Hz [4] haben, zuletzt für nicht mehr als 10 Sekunden [4], mindestens drei Farben verwenden [8], so sein, dass keine zwei aufeinanderfolgenden Frames in der Animation sind die gleichen [8], und einzigartig [-32].


Für die obige Frage ich einfach einen Block von # in den richtigen Dimensionen machen könnte, und dann die Farbe nacheinander jede Zeile ändern und dann mit der Farbe nach unten gedrückt ein und eine neuen Farbe den ganzen Block neu zeichnen hinzugefügt und so weiter. Ich bin mir nicht sicher, wie Frame-Rate zu tun ist.

Jede Hilfe wird sehr geschätzt, ich versuche nur zu lernen.

+1

Wenn Sie tatsächlich die Zeile 'printBlock :: IO() // print 8x16 block' (und andere wie es), dann natürlich Ihr Code nicht analysieren Kompilieren -' // 'nicht Kommentarsyntax Haskell. [Here] (https://www.haskell.org/onlinereport/haskell2010/haskellch10.html) ist die Haskell-Syntaxreferenz. – user2407038

Antwort

1

Ich konnte den unendlichen Blitz durch Rekursion machen, was aus irgendeinem Grund nicht dazu führte, dass er vorher aufhörte.

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