3

我对java有点陌生,但我在其他编程语言方面有很多经验。现在我正在尝试创建一个简单的“焦土”风格的游戏,但我无法让景观出现。我正在使用 2d 高度场来表示地形。在我的 init 方法中,我使用一些 sin 函数和随机数生成地形。我在网上的教程中发现了这种技术。

float flat, peak;
flat = 70; peak = 50;

int rand1, rand2, rand3;
rand1 = gen.nextInt() % 4 + 1;
rand2 = gen.nextInt() % 4 + 1;
rand3 = gen.nextInt() % 4 + 1;

for (int a=0; a<750; a++) {
    double height = peak / rand1 * Math.sin((double)a / flat * rand1 + rand1);
    height += peak / rand2 * Math.sin((double)a / flat * rand2 + rand2);
    height += peak / rand3 * Math.sin((double)a / flat * rand3 + rand3);

    height += 250;
    heights[a] = (int)height;
}

然后在我的paint()方法中,我绘制地形,高度表示为屏幕底部的像素,长 750 像素,高 500 像素。

public void paint(Graphics g)
{
    g.setColor(Color.green);

    for (int a=0; a<750; a++) {
        g.fillRect(a, 500-heights[a], 1, heights[a]);
    }
}

但是,我在让地形出现时遇到了一个主要问题。大约有一半的时间它显示出来,看起来很漂亮和随机,这正是我想要的。其他时候它根本不显示,我的 heights[] 数组中的所有值都设置为零,就好像从未调用过 init 方法一样。有谁知道发生了什么?

4

1 回答 1

1

这是你的答案:

当你拿到时

rand1 = 0 (or 1)
rand2 = 0 (or 1)
rand3 = 0 (or 1), 

那是失败的时候。mod %4 有时会返回负数(特别是 -1),然后 1 - 1 为 0;因此,您的身高得到了 NaN,出于某种原因,这又回到了 0 中。

顺便提一句。似乎如果您在每次循环迭代中都没有收到新的随机数,那么您只是在利用双精度数的不准确性多次计算您插入完全相同的值的数学问题的答案.

你问:其他时候它根本不显示,我的 heights[] 数组中的所有值都设置为零,就好像从未调用过 init 方法一样。有谁知道发生了什么?

下一次,为什么不做我做的事情。当你遇到问题时,为你的初始值写一个打印语句。验证您的假设(例如,我认为 (x mod 4) + 1)不能为负。问题发生,rand1、rand2、rand3 的值是多少。好吧,那是怎么发生的?这对每次调用 Sin(..) 后的高度有何影响?只需通过打印语句将情况加起来,找出何时中断、如何中断以及问题何时开始。

int[] heights = new int[750];
public MathTest()
{
    Random r = new Random();
    float flat;
    float peak;
    flat = 70;
    peak = 50;

    int rand1;
    int rand2;
    int rand3;

    int x = r.nextInt();
    int y = r.nextInt();
    int z = r.nextInt();

    System.out.println("x : " + x);
    System.out.println("y : " + y);
    System.out.println("z : " + z);

    System.out.println("-210263172");
    System.out.println("-724188689");
    System.out.println("-1092425465");

    System.out.println(-210263172 % 4);
    System.out.println(-724188689 % 4);
    System.out.println(-1092425465 % 4);

    rand1 = x % 4 + 1;
    rand2 = y % 4 + 1;
    rand3 = z % 4 + 1;


    for( int a = 0; a < 750; a++ )
    {
        System.out.println("rand1: " + rand1);
        System.out.println("rand2: " + rand2);
        System.out.println("rand3: " + rand3);
        double height =
            peak / rand1 * Math.sin((double) a / flat * rand1 + rand1);
        height +=
            peak / rand2 * Math.sin((double) a / flat * rand2 + rand2);
        height +=
            peak / rand3 * Math.sin((double) a / flat * rand3 + rand3);

        height += 250;
        heights[a] = (int) height;
    }
    int i;
    for(i = 0; i < 23; i++)
    {
        System.out.println("heights[" + i + "]: " + heights[i]);
    }

}
于 2012-05-20T06:35:37.960 回答