我正在开发游戏连接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
答案 0 :(得分:1)
既然你说你正在学习Haskell,我会给你一些提示:
如果您有[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
作为列列表,则行[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
列表恰好是列的transpose
。
列(x:_):cs
的主对角线(向右下方)为x
,后跟列cs
的主对角线,没有第一行。
列c:cs
的所有(右下方)对角线都是c:cs
的对角线,后跟列cs
的所有对角线
要使对角线向左下方移动,它足以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次
可以对列表列表的转置进行类似的模式匹配。