6

对于基于图块的游戏,我需要根据给定的点偏移(两点之间的差异)计算方向。例如,假设我站在点 (10, 4),我想移动到点 (8, 6)。我移动的方向是西北。计算这个的最佳方法是什么?

这是我在Java中的基本实现。

public int direction(int x, int y) {
    if (x > 0) {
        if (y > 0) {
            return 0; // NE
        } else if (y < 0) {
            return 1; // SE
        } else {
            return 2; // E
        }
    } else if (x < 0) {
        if (y > 0) {
            return 3; // NW
        } else if (y < 0) {
            return 4; // SW
        } else {
            return 5; // W
        }
    } else {
        if (y > 0) {
            return 6; // N
        } else if (y < 0) {
            return 7; // S
        } else {
            return -1;
        }
    }
}

当然,它可以优化或缩短。有什么帮助吗?谢谢。

4

5 回答 5

4

我认为最容易理解的方法是制作一个包含所有情况的值的静态数组。

// Won't say anything about how much these values make sense
static final int[][] directions = {
    {3,  6, 0},
    {5, -1, 2}, // -1 for "no direction", feel free to replace
    {4,  7, 1}
};

public int direction(int x, int y) {
    x = (x < 0) ? 0 : ((x > 0) ? 2 : 1);
    y = (y < 0) ? 0 : ((y > 0) ? 2 : 1);

    return directions[y][x];
}

编辑: 现在是正确的(为什么这么多语言缺少适当的sgn功能?)

于 2010-08-29T12:41:16.883 回答
1

我对 if 条件的回答:)。

   public int direction(int x, int y) {
        //0 NE, 1 SE, 2 E, 3 NW, 4 SW, 5 W, 6 N, 7 S, 8 (Same place / Not a direction)  
        int direction = 0;

        if(x < 0){
            direction = 3;
        }else if(x == 0){
            direction = 6;
        }

        if(y < 0){
            direction = direction + 1;
        }else if(y == 0){
            direction = direction + 2;
        }
            return direction;
    }
于 2010-08-29T13:02:27.530 回答
0
  • 定义一个二维数组来保存所有状态。

  • 根据 x 和 y 的值(x>0 或 x<0 或 x ==0)将 x 和 y 转换为 0、1 或 2

  • 返回数组的具体索引。

于 2010-08-29T12:41:32.000 回答
0

如果您以这种方式将八个基本方向表示为单独的枚举值,那么这将尽可能简洁明了。您在八个不同的返回值之间进行选择,因此具有八个叶子的决策树是您能做的最好的选择。

如果您将方向拆分为两个组件(NS 和 EW),您可能会得到一些更整洁的东西,但是如果不了解更多有关您如何处理方向的信息,我们无法知道这是否值得麻烦。

于 2010-08-29T12:47:12.467 回答
0

您可以接收并返回您的方向作为一个点或类似的东西(无论如何,一个 (x,y) 元组)。所以如果你站在 p0 = (10, 4) 并且想要移动到 p1 = (8, 6),结果将是(在伪代码中):

norm(p1 - p0) = norm((-2,2)) = (-1,1)

如果将整数除以其绝对值,则可以计算出整数的范数。因此,对于一个点,您计算两个成员的范数。请记住,(-1,1) 比 3 更具表现力,您可以使用它以更轻松的方式进行操作。

如果您需要特定的操作,您可以创建自己的 Java Point 类或扩展库中现有的类。

于 2010-08-29T12:47:38.643 回答