wvogel日記

自分用の技術備忘録が多めです.

save and load

いい加減、Haskellで何かまとまったものを作らないと、このもやっと感が消えてくれないのです。
というわけで。
GUIはまとまった時間が取れないとなかなか勉強する時間とれそうにないので、周辺パーツから揃えていくことに。


データをsaveするための関数を作りましょう。
管理しやすいように、
いくつかのファイルにわけて製作していきます。

まずは、基本的にどのファイルでも使うことになるであろう型達を定義

module Types where

data GameState = Title | Playing | Save | Load | Exit
data Music = PlayOn String | Silence  deriving (Show,Eq)

type Layer = Int
type ImageFile = String
type ScreenState = [ (Layer , ImageFile) ]
type Date = String
type FLine = Int

datafile :: FilePath
datafile = "d.txt"

次に、save関数

module SaveLoad where

import System.IO
import Types

save :: Date -> FLine -> ScreenState -> Music -> IO()
save date n scr mg = do h <- openFile datafile AppendMode
                        hPutStrLn h $ date ++ " " ++ (show n)
                        hPrint h scr
                        hPutStrLn h $ show mg
                        hClose h

save関数に適当に引数を渡して記録した結果は次のように。
当たり前ですけど笑

2011/10/14 13
[(0,"back"),(1,"mesbox.png")]
Silence
2011/10/1 265
[(0,"back"),(1,"mesbox.png"),(2,"haskell.png")]
Silence
2011/10/1 265
[(0,"back"),(1,"mesbox.png"),(2,"haskell.png")]
PlayOn "bgm.wav"

次は、こいつをloadする関数を書いていきます
まずは、Parsec部分以外の関数が上手く機能していくるか確認するための検証を。
ScreenStateの部分をStringと書き変えて確認。

load :: Int -> IO (Date,FLine,String,Music)
load k = do h <- openFile datafile ReadMode
            fs <- hGetContents h
            result <- extract.pickedData $ fs
            return result
    where
        pickedData = take datanum.drop (k*datanum).lines

extract :: [String] -> IO (Date,FLine,String,Music)
extract [l1,l2,l3] = parseRun l2
                      >>= \scr -> return (date,read n,scr,mg)
    where
        [date,n] = take 2.words $ l1
        mg :: Music
        mg = case l3 of
            "Silence" -> Silence
            otherwise -> PlayOn $ last.words $ l3

parseRun :: String -> IO String
parseRun str = return  str

無事に動作しています。
では最後に、Parser部を書いていきます
その前に、お腹がへったので何かエネルギー補給をする。