日期:2014-05-20  浏览次数:20763 次

程序有个地方看不懂,求指点
本帖最后由 wlqqqq 于 2013-01-24 16:17:46 编辑
以下程序是实现台上有多个弹球在上面运动的程序,标红色部分为什么要循环,看不懂,求指教
import java.awt.*; 
import java.awt.event.*;
/* 定义弹子类 */
class Marble extends Thread
{
   Table table=null;
   int x,y,xdir,ydir;
  public Marble(Table _table,int _x,int _y,int _xdir,int _ydir)
{
  table=_table;    //使用该参数,是为了能获取到窗口的大小
  x=_x;            //x坐标
  y=_y;            //y坐标
      xdir= _xdir;     //x方向速度
      ydir= _ydir;     //y方向速度
}

 public void run()
  {
   while(true)
    {
      if((x>(table.getSize().width)-25)||(x<0))
xdir*=(-1); //超过台子x方向边界后,反方向运行
      if((y>(table.getSize().width)-25)||(y<0))
ydir*=(-1); //超过台子y方向边界后,反方向运行
  x+=xdir;            //坐标递增 以实现移动
  y+=ydir;
      try{ sleep(30);    //延时时间(1/刷新率)
  } catch(InterruptedException e)
         {System.err.println("Thread interrupted");}
   table.repaint();  //重绘图形     
   }
 }

 public void draw(Graphics g)
  {
    g.setColor(Color.black);   //弹子为黑色
    g.fillOval(x,y,30,30);     //画圆
    g.setColor(Color.white);   //弹子上的亮点为白色
    g.fillOval(x+5,y+5,8,6);   
  }
}

/* 定义弹子球台类 */
class Table extends Frame implements ActionListener
{
 Button start=new Button("开始");
 Marble marbles[]=new Marble[5];   //建立弹子线程类对象数组
 int v=2;                          //速度最小值
public Table()
{
super("弹子台球");
setSize(300,300); 
setBackground(Color.cyan); //背景
setVisible(true);
setLayout(new FlowLayout());
add(start);
start.addActionListener(this);
validate();
addWindowListener(new WindowAdapter()
{
 public void windowClosing (WindowEvent e)
{System.exit(0);}
} );
}

 public void actionPerformed(ActionEvent ae)
  {
 for(int i=0;i<marbles.length;i++)
{  //随机产生弹子的速度和坐标
  int xdir=i*(1-i*(int)Math.round(Math.random()))+v;
          int ydir=i*(1-i*(int)Math.round(Math.random()))+v;
  int x=(int)(getSize().width*Math.random());
  int y=(int)(getSize().height*Math.random());
  //实例化弹子线程对象
  marbles[i]=new Marble(this,x,y,xdir,ydir);
          marbles[i].start();
   }
  }
public void paint(Graphics g)