【发布时间】:2016-11-30 03:37:27
【问题描述】:
我正在开发一个通用版本的游戏连接 4,您可以在其中选择网格的大小以及连接所需的棋子数量以获胜。我现在正在开发一个功能,该功能将检查哪个玩家获胜。我试图把它分解成四个较小的部分。我已经实现了一个返回列的函数,但是在网格中的行和对角线上都卡住了。我是 Haskell 的新手,并且正在努力停止以 OO 方式思考这些问题。任何帮助将不胜感激,因为我已经在这个问题上停留了很长一段时间。
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)]列表,这应该是一些简单的列表推导。 -
我建议定义
data Piece = Yellow | Red | None而不是返回Maybe Piece
标签: list haskell functional-programming