我正在开发一个通用版本的游戏连接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' –