【发布时间】:2014-06-05 17:04:35
【问题描述】:
我想编写一个函数,它获取一个带有位置的国际象棋图形,并告诉我这个图形下一步可以走哪一步。
为了国王,我能够做到这一点。
type Position = (Int,Int)
data Piece = Piece {
_position :: Position,
_color :: String}
nextMoves :: Piece -> [Position]
nextMoves king = filter (onTheBoard) (filter (/= (xOld,yOld))
[(x,y) | x <- [(xOld-1)..(xOld+1)], y <- [(yOld-1)..(yOld+1)]])
where
xOld = fst(_position king)
yOld = snd(_position king)
他站在 (1,3) 上,我的函数给了我 [(1,2),(1,4),(2,2),(2,3),(2,4)]。
现在我想为主教或骑士做同样的事情。但是我如何使用过滤器来解决这个问题? 感谢您的提示。
//编辑:我已将检查更改为帮助功能:
onTheBoard :: Position -> Bool
onTheBoard (x,y) = elem x [1..8] && elem y [1..8]
【问题讨论】:
-
我认为应该是 >= (1,1) 和
-
还是不行。在位置 (7,8) 尝试它会给你 (7,9) 这不是一个有效的位置。
-
确实如此。该死的。但我没有其他聪明的想法来比较它们……也许有帮助功能。 onTheBoard :: Position -> Bool onTheBoard (x,y) = elem x [1..8] && elem y [1..8] 工作正常^^
-
国王在易位时实际上可以移动两个位置。