プログラミング 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章に進みます。