试图理解代码的逻辑:

时间:2014-03-31 06:58:10

标签: java

我正在尝试按照教程here

我有一个功能moveBall()的精简版本:

if (x + xa > getWidth() - 30) {
  xa = -1;
  y = y + 10;
}
if (x + xa < 0) {
  xa = 1;
}
x = x + xa;

理想情况下,在触摸屏幕边界后,球应该反转它的方向,这是真的并且确实会发生。但是如果我将System.out.println("in if")置于任何if条件中,则每次在球触及边界之前调用它,xa的值理想情况下应该只在触摸时设置一次边界,还是我错了?我可能不会得到完整的逻辑,有人可以帮忙吗?

主要功能:

public static void main(String[] args) throws InterruptedException{
        JFrame frame = new JFrame("Mini Tennis");
        FirstClass Fr = new FirstClass(); 
        frame.add(Fr);


        frame.setSize(300, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        while(true){
            Fr.moveBall(); // executes the last
            Fr.repaint();  //executes first
            Thread.sleep(10); //executes second
        }



    }

3 个答案:

答案 0 :(得分:1)

感谢Lutz Horn,经过一整天的调试,我想我已经理解了上面代码片段中发生的事情,我会尽力解释:

在上面的精简版中,程序以两个变量开头:

int x = 0; int xa = 1;

在移动函数中,检测到与帧的任何边界的碰撞,但在上面的代码中我只对x平面感兴趣。

功能是:

void move() {
        System.out.println("x + xa is: "+(x+xa));
        System.out.println("Game Width: "+(game.getWidth() - 30));
        if (x + xa < 0)
            xa = 1;
        if (x + xa > game.getWidth() - 30)
            xa = -1;
        x = x + xa;

    } 

因此x从0开始,并且等于1的xa加起来,因此x为1并且球向右移动,重新调用被调用并且上面一遍又一遍地发生。然后在一个实例x变为269(调试消息:getWIdth() - 30 = 268)。现在执行第二个if条件的主体:

if (x + xa > game.getWidth() - 30) // holds true when x+xa = 269
                xa = -1; // Hence setting the variable xa to -1 

上述情况一直持续到x小于0(因为上面因为-1加起来为269)这里还值得注意的是每次调用paint时从x中减去1表示if条件不会得到反复呼唤。

现在当x变为-1时,我们得到以下结果:

 if (x + xa < 0)
            xa = 1;

因此再次递增x直到269并且该过程继续。

答案 1 :(得分:0)

调用它的原因是因为您描述的方法一直在运行。它不断地检查它是否在指定的边界线内,这就是不断调用println的原因,因为该函数被设计为始终被调用,并且以这种方式始终检查它是否超出界限。

以这种方式思考..方法总是在问“我是不是在出界?” “我出界吗?”一旦它成熟,它就会反过来。

您认为代码只会在接触边界时运行,但这是错误的。它会继续检查它是否触及边界,即使它没有触及它...这是计算机知道何时到达边界并反转它自己的唯一方法(或者无论代码指示它做什么)。

您在评论why is the System.out.println中也提到了在不满足if块条件时运行。这是因为Java允许在身体周围没有括号的循环。

while(条件)     语句1;     语句2; //只有第一个语句在循环体

学生假设身体陈述在体内。类似地,

while(条件)     语句1;语句2

这两个语句似乎都在循环中,但只是第一个。 上面的例子不会用其他语言编译。

答案 2 :(得分:0)

当球触及边界x + xa == getWidth() - 30时。此时,xa没有改变,球移动

但是x + xa > getWidth() - 30之后的步骤和xa设置为-1(这意味着朝向反方向x)