Haskell打印出2d数组

时间:2017-11-08 17:02:05

标签: haskell multidimensional-array

我正试图在生命游戏中打印出我的2D阵列,但我不太确定如何继续使用它。所以我需要一些帮助我的printArray函数我不太清楚如何继续。她是下面的代码,一切正常。除了以正确的方式打印出来。

module GameOfLife where
import Data.List
import System.IO
import Text.Show
import Data.Array
import System.Random

width :: Int
width = 5

height :: Int
height = 5

data State = Alive | Dead deriving (Eq, Show)
type Pos = (Int,Int)
type Board = Array Pos State

startBoard :: Pos -> Board
startBoard (width,height) =
  let bounds = ((0,0),(width - 1,height - 1))
  in array bounds $ zip (range bounds) (repeat Dead)

set :: Board -> [(Pos,State)] -> Board
set = (//)

get :: Board -> [Pos] -> [State]
get board pos = map (board!) pos

neighbours :: Board -> Pos -> [Pos]
neighbours board c@(x,y) =
  filter (/= c) $ filter (inRange (bounds board)) [(x',y') | x' <- [x -             
 1..x + 1], y' <- [y - 1..y + 1]]

nextGen :: Board -> Board
nextGen board =(irrelevant code for the question..)


printArray :: Board -> String
printArray arr =
  unlines [unwords [show (arr ! (x, y)) | x <- [1..5]] | y <- [1..5]]

我的输出:

[((0,0),Dead),((0,1),Dead),((0,2),Dead),((0,3),Dead),((1,0),Dead),
((1,1),Dead),((1,2),Dead),((1,3),Dead),((2,0),Dead),((2,1),Dead),
((2,2),Dead)2,3),Dead)]

我更喜欢的输出:

   1  2  3  4  5
 1 .  .  .  .  .
 2 n  n  n  .  .
 3 n  X  n  .  .
 4 n  n  n  .  .
 5 .  .  .  .  .

1 个答案:

答案 0 :(得分:1)

为了开始回答你的问题,我建议将问题分成几个部分:

  1. 打印出顶部的数字。
  2. 打印时每行编号。
  3. 确定每个单元格中要打印的符号。
  4. 一次一个地处理这些碎片。如果它有所帮助,而不是考虑“打印”只是建立一个String对象。一旦你有exception,打印就非常简单了。