3

私は Java には少し慣れていませんが、他のプログラミング言語では多くの経験があります。現在、単純な「焦土」スタイルのゲームを作成しようとしていますが、風景を表示するのに問題があります。地形を表すために 2 次元の高さフィールドを使用しています。私の 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]);
    }
}

ただし、地形を表示するのに大きな問題があります。約半分の時間で表示され、見栄えがよく、ランダムに見えます。それ以外の場合は、init メソッドが呼び出されなかったかのように、まったく表示されず、heights[] 配列のすべての値がすべてゼロに設定されます。誰が何が起こっているのか知っていますか?

4

1 に答える 1

1

これがあなたの答えです:

あなたが取得するとき

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

これが失敗したときです。mod%4は負の数(具体的には-1)を返すことがあり、その場合、1-1は0です。だからあなたはあなたの身長に対してNaNを取得します、そしてそれは何らかの理由であなたに0として戻ってきます。

ところで。ループの反復ごとに新しい乱数を受け取らない場合は、doubleの不正確さを利用して、まったく同じ値を差し込んでいる数学の質問に対する答えを何度も計算しているようです。 。

あなたは尋ねました:それ以外の場合はまったく表示されず、私の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 に答える