プログラミング Haskell 第9章 対話プログラム 練習問題その2

練習問題 3. の lifegame の描画を差分だけにする変更をやってみました。

  • 3. showcells に前回の Board も渡すようにしたいので life からさらに life_loop 関数を分離して、ひとつ前の状態を引数に渡すようにしました。cls は最初に1回だけ呼ぶというのと、初回の「ひとつ前の状態」は空リストにするため life は life_loop へのラッパになります。

変更した関数だけ記述します。また本文のサンプルコードのままだとカーソルキーがうるさいので毎回描画後にカーソルを左上に戻す変更もしています。

showcells :: Board -> Board -> IO ()
showcells p b = seqn ([writeat c "O" | c <- b, (List.elemIndices c p) == []] ++
                      [writeat c " " | c <- p, (List.elemIndices c b) == []])

life_loop :: Board -> Board -> IO ()
life_loop p b = do showboard
                   showcells p b
                   goto (1,1)
                   wait 50000
                   life_loop b (nextgen b)

life :: Board -> IO ()
life b = do cls
            life_loop [] b

練習問題 4, 5 は飛ばしますのであとは 6. のニムを作るのをやったら10章に進みます。