我正在開發一個通用版本的遊戲連接4,您可以在其中選擇網格的大小以及數字爲了獲勝而需要連接的棋子。我正在研究一個能夠檢查哪個球員獲勝的功能。我試圖把它分成四個小部分。我已經實現了一個函數來返回列,但是在行和網格上的對角線都被卡住了。我是Haskell的新手,我正努力停止以OO方式思考這些問題。任何幫助將不勝感激,因爲我一直在這個問題上停留了很長一段時間。Haskell - 如何返回一個網格中所有行元素的列表列表
import Data.Maybe
import Data.List
data Piece = Yellow | Red
type Column = [Piece]
type Board = [Column]
data BoardState = BS {
theBoard :: Board,
lastMove :: Piece,
numColumns :: Int,
numRows :: Int,
numToConnect :: Int }
repeatNothing :: Int -> [Maybe a]
repeatNothing m = replicate m Nothing
padN :: [a] -> Int -> [Maybe a]
padN xs n = (map Just xs) ++ repeatNothing (n - (length xs))
columns :: BoardState -> [[Maybe Piece]]
columns bs = map (\col -> padN col (numRows bs)) (theBoard bs)
rows :: BoardState -> [[Maybe Piece]]
rows bs = map (\row -> padN row (numColumns bs)) (theBoard bs)
diagonalsForward :: BoardState -> [[Maybe Piece]]
diagonalsForward = undefined
diagonalsBackward :: BoardState -> [[Maybe Piece]]
diagonalsBackward = undefined
對於這個遊戲,我可能會通過索引結構而不是列表列表來代表董事會。甚至可能是'Data.Map(Int,Int)Piece'。然後查找行列和對角線的複雜性主要是生成適當的[[(Int,Int)]列表,這應該是一些簡單的列表解析。 – luqui
我會建議定義'數據片=黃色|紅色| None'而不是返回'MaybePiece' –