【问题标题】:Haskell - how to return a list of a list of all of the rows of elements in a gridHaskell - 如何返回网格中所有元素行的列表
【发布时间】: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


【解决方案1】:

如果您将 Piece 定义为开放槽

data Piece = Yellow | Red | Empty deriving Show
let Board = replicate n $ replicate m Empty

可以通过模式匹配来测试一行是否有4个

pre:Yellow:Yellow:Yellow:Yellow:post

测试 Yellow 是否连续 4 个

类似的模式匹配可以在列表列表的转置上完成。

【讨论】:

    【解决方案2】:

    既然你说你正在学习 Haskell,我只想给你一些提示:

    1. 如果您有[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 作为列列表,那么行列表[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 就是列的transpose

    2. (x:_):cs 列的主对角线(向右下方)是x,后跟cs 列的主对角线,没有第一行。

    3. c:cs 列的所有(右下)对角线是c:cs 的对角线,后跟cs 列的所有对角线

    4. 要让对角线向左下,只需reverse 列的顺序,然后得到右下角的对角线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2023-03-09
      • 2021-12-29
      • 2015-11-12
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多