Haskell - 如何返回网格中所有元素行列表的列表

时间:2016-11-30 03:37:28

标签: list haskell functional-programming

我正在开发游戏连接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

2 个答案:

答案 0 :(得分:1)

既然你说你正在学习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的所有对角线

    < / LI>
  4. 要使对角线向左下方移动,它足以reverse列的顺序,然后得到右下方的对角线。

答案 1 :(得分:0)

如果您将Piece定义为开放式插槽

func addBlurEffect() {

        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.extraLight)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.alpha = 0.4
        blurEffectView.frame = self.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        self.addSubview(blurEffectView)
    }

您可以通过

上的模式匹配来测试连续是否有4个
 func removeBlurView(blurView:UIView){
            for subview in blurView.subviews {
                if subview is UIVisualEffectView {
                    subview.removeFromSuperview()
                }
            }
        }

测试黄色是否连续4次

可以对列表列表的转置进行类似的模式匹配。