我对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]);
}
}
然而,我遇到一个主要问题是让地形显现出来。它大约有一半的时间显示,看起来很漂亮和随意,就像我想要的那样。其他时候它根本没有显示,我的高度[]数组中的所有值都被设置为零,就像从未调用过init方法一样。有谁知道发生了什么事?
答案 0 :(得分:1)
这是你的答案:
当你得到
rand1 = 0 (or 1)
rand2 = 0 (or 1)
rand3 = 0 (or 1),
这就是失败的时候。 mod%4有时会返回负数(具体为-1),然后,1 - 1为0;所以你得到NaN的高度,并且由于某种原因,它会回到你的身上。
顺便说一下。似乎如果你没有在每次循环迭代中收到新的随机数,那么你只是利用双精度的空洞来计算,多次,数学问题的答案,你插入完全相同的值。
你问道: 其他时候它根本没有显示,我的高度[]数组中的所有值都被设置为零,就像从未调用过init方法一样。有谁知道发生了什么?下一次,为什么不做我做的事情。当你遇到问题时,为你的初始值设置一个print语句。验证你的假设(例如,我认为(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]);
}
}