Haskell实现4×5棋盘对角线移动判断Bool函数技术问询
解决4×5棋盘对角线移动判断的问题
嘿,我来帮你搞定这个桌游里的对角线移动判断函数!首先得指出你当前代码的几个问题:
- 你重复定义了
isDiagonal函数,后面的定义会直接覆盖前面的,这根本没法处理任意坐标的移动判断; - 当前的逻辑只硬编码了两个固定点,完全没抓住对角线移动的本质规律;
- 函数参数也不完整,你只写了
x作为参数,但判断需要用到起点和终点的两组x、y坐标呀。
对角线移动的核心逻辑
判断从(x1,y1)到(x2,y2)是不是对角线移动,关键看两个点的横纵坐标变化量的绝对值是否相等,同时要排除原地不动的情况(毕竟桌游里原地一般不算移动)。用公式表示就是:abs(x2 - x1) == abs(y2 - y1) && abs(x2 - x1) != 0
正确的代码实现
这里以Haskell为例(从你写的代码风格看应该是用Haskell),有两种常见的参数传递方式:
方式1:直接传入四个坐标参数
-- 接收起点(x1,y1)和终点(x2,y2),返回是否为对角线移动 isDiagonal :: Int -> Int -> Int -> Int -> Bool isDiagonal x1 y1 x2 y2 = let dx = abs (x2 - x1) dy = abs (y2 - y1) in dx == dy && dx /= 0
方式2:用元组表示起点和终点
-- 把起点和终点包装成元组,代码更简洁直观 isDiagonal :: (Int, Int) -> (Int, Int) -> Bool isDiagonal (x1, y1) (x2, y2) = abs(x2 - x1) == abs(y2 - y1) && abs(x2 - x1) /= 0
可选:加上棋盘坐标合法性校验
因为你的棋盘是4×5的(假设x范围1-4,y范围1-5),可以额外加一步判断,确保传入的坐标都在棋盘内:
-- 先判断单个坐标是否在棋盘范围内 isValidCoord :: Int -> Int -> Bool isValidCoord x y = x >= 1 && x <= 4 && y >= 1 && y <= 5 -- 整合合法性判断的对角线函数 isDiagonal :: (Int, Int) -> (Int, Int) -> Bool isDiagonal start end = isValidCoord (fst start) (snd start) && isValidCoord (fst end) (snd end) && abs(fst end - fst start) == abs(snd end - snd start) && abs(fst end - fst start) /= 0
关于你问的&&
&&确实是用来做逻辑与的,但你之前的问题不是要不要用它,而是逻辑本身没找对。现在的正确实现里就用到了&&,用来同时满足“变化量绝对值相等”和“不是原地不动”这两个条件。
内容的提问来源于stack exchange,提问作者Demiss
相关产品推荐
相关产品推荐

