【问题标题】:Bouncing ball using while loop, I need to decrease bounce by 30% each bonce till 0, then exit loop to avoid infinity loop使用while循环弹跳球,我需要将每次弹跳减少30%直到0,然后退出循环以避免无限循环
【发布时间】:2015-03-22 02:53:57
【问题描述】:

我的程序是创建一个弹跳球,每次上下上下负 30%……告诉球已经停在静止位置。

我也想让球在到达弹跳顶部时逐渐减速,并在它下降回到原来的位置时逐渐加速。

所以我设置了第一部分,我只是遇到了不做无限循环的麻烦,并且每次反弹后将向上 y 停止位置减少 30%。

当我写这个问题时,我意识到,我需要使第一个 while 循环中的 y 值增加 30%,它达到 400 正确吗?

如何在没有无限循环的情况下围绕两个 while 循环循环重复?

感谢任何意见、cmets 或想法!

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JApplet;

public class MY_Proj04 extends JApplet
{
    int x, y;
    Color Background;
    public void init()
    {
        x = 100;
        y = 400;
        Background = getBackground();
    }

    public void paint(Graphics g)
    {
        // I tryed putting a while loop around the two following while loops and 
        // doing y = y * 30/100, I did this because the fill oval can't take a double
        // as one of its parameters.

        // 1st while loop
        while(y >= 0) // Ball goes up to (0,100)
        {
            g.setColor(Background);
            // fill the 500 by 500 square with it background color
            // any old draw will be covered
            g.fillRect(0, 0, 500, 500);
            g.setColor(Color.red);
            g.fillOval(x, y, 50, 50);
            for(long i = 1; i < 5000000; i++); //speed of ball
            y -=1;
        }

        // 2nd while loop
        while(y <= 400) // ball goes down to 400,100
        {
            g.setColor(Background);
            // fill the 500 by 500 square with it background color
            // any old draw will be covered
            g.fillRect(0, 0, 500, 500);
            g.setColor(Color.red);
            g.fillOval(x, y, 50, 50);
            for(long i = 1; i < 5000000; i++); //speed of ball
            y += 1;
        }
    }
}

【问题讨论】:

标签: java loops for-loop while-loop


【解决方案1】:

我以不同的方式尝试了这个程序。它的工作。对于球的速度,我使用了Thread.sleep() 而不是您使用的循环。 另外,更正一下代码中的第一个while 循环将球移回起始位置。要使其反弹小于之前的高度,您需要增加 RHS 值(在您的代码中固定,即 0)。还有一件事,为了让球看起来像是在弹跳,我做了一些改变。

代码如下:

import java.applet.*;
import java.awt.*;

/**<applet code="ball" height = "768" width = "1366" ></applet>*/

public class ball extends Applet implements Runnable
{
    int x,y,height,width,a;
    float z;
    public void start()
    {
         x=100; y=400; h=50; w=50; a=0;
         z = y;
         Thread th=new Thread(this);
         th.start();
    }

    public void run()
    {
        while(Math.round(z)!=0)
        {   
            while(y>=a) //Ball bounces till it reaches point a. Which in turn is increasing with each bounce till it is equal to 400.
            {
                y--;
                repaint();
                try{Thread.sleep(3);} // Speed of the ball.
                catch(Exception e){}
            }
            while(y<=400) // This loop gives ball a bouncing look each time it hits the floor (i.e. 400).
            {
                y++;
                repaint();
                if(y==400) 
                {
                    while(h!=40)
                    {   
                        y++;
                        height--;
                        x--;
                        width+=2;
                        repaint();
                        try{Thread.sleep(3);}
                        catch(Exception e){}
                    }   
                    while(h!=50)
                    {
                        y--;
                        height++;
                        x++;
                        widt--=2;
                        repaint();
                        try{Thread.sleep(3);}
                        catch(Exception e){}
                    }
                }
                try{Thread.sleep(3);}
                catch(Exception e){}
            }
            z=z*(0.7f); //This line and the next line calculates the value of a for the next bounce.
            a=Math.round(y-z); //round() function rounds the         floating value to nearest whole number and converts it into an integer.
        }
    }

    public void paint(Graphics g)
    {
        g.fillOval(x,y,width,height);
    }
}

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 2021-08-31
    • 2020-01-03
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2016-06-05
    相关资源
    最近更新 更多