You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:21:55