java 多线程 点击按钮一次创建一个小球

实验要求:

弹球程序。编写程序,该程序通过一个发射按钮可以发射一个弹球,该球遇到边界时会自动弹回,在移动固定次数后,该球停止运动。要求每次点击发射按钮都会发射一个弹球,如果点击多次,则多个弹球同时运动。该程序通过另一个结束可以结束程序的运行


代码:

package text5;



import java.awt.event.*;


import javax.swing.*;


import java.awt.*; 
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;




@SuppressWarnings("serial")
public class xiaoqiu extends JFrame implements ActionListener{
final Lock l = new ReentrantLock();
double k;
private static int jishu = 1;
MyPanel clockPanel;
JButton button1;
JButton button2;
Random random = new Random();
Run run;
int count = 0;
int [] dian_x = new int [1000];
int [] dian_y = new int [1000];
int n = 0;
int x = 0;
int y = 0;
int a[] = new int [] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int b[] = new int [] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int zzdian_x[] = new int [] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int zzdian_y[] = new int [] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


int left[] = new int [1000];
int right[] = new int [1000];
int down[] = new int [1000];
int up[] = new int [1000];
public xiaoqiu()
{
        clockPanel = new MyPanel();

button1 = new JButton("开始");
button1.setBounds(140, 400, 60, 30);
button1.addActionListener(this);

button2 = new JButton("结束");
button2.setBounds(300, 400, 60, 30);
button2.addActionListener(this);

add(button1);
add(button2);
        add(clockPanel);
}

public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1)
{
  count ++;
  n ++;
a[count] = Math.abs(random.nextInt() % 3) + 1;
b[count] = Math.abs(random.nextInt() % 3) + 1;
new Run().start();
jishu = n;
right[jishu] = 1;
left[jishu] = 0;
down[jishu] = 1;
up[jishu] = 0;
dian_x[jishu] = 0;
dian_y[jishu] = 0;
}
else
{
System.exit(0);
}
}


class MyPanel extends JPanel
    {  
        public void paint(Graphics g) {
    for(int i = 1; i<= n; i++)
    {
    g.setColor(Color.green); 
    g.fillOval(dian_x[i], dian_y[i], 10, 10);
    g.setColor(Color.yellow); 
    g.fillOval(dian_x[i] + 3, dian_y[i] + 3, 4, 4);
    g.setColor(Color.red); 
    g.fillOval(dian_x[i] + 4, dian_y[i] + 4, 2, 2);
    }
int yy = (dian_y[jishu] - zzdian_y[jishu]);
int xx = (dian_x[jishu] - zzdian_x[jishu]);
if(xx != 0 && yy != 0)
{
    if(dian_x[jishu] + 10 > 485 && dian_y[jishu] > 0 && dian_y[jishu] + 10 < 460)//右边界
    {
    if(yy < 0)
    {
    left[jishu] = 1;
    right[jishu] = 0;
    down[jishu] = 0;
    up[jishu] = 1;
    }
    else
    {
    left[jishu] = 1;
    right[jishu] = 0;
    down[jishu] = 1;
    up[jishu] = 0;
    }
    zzdian_x[jishu] = dian_x[jishu];
    zzdian_y[jishu] = dian_y[jishu];
    }
   
    else if(dian_y[jishu] + 10 > 460 && dian_x[jishu] > 0 && dian_x[jishu] + 10 < 485)//下边界
    {
    if(xx < 0)
    {
    left[jishu] = 1;
    right[jishu] = 0;
    down[jishu] = 0;
    up[jishu] = 1;
    }
    else
    {
    left[jishu] = 0;
    right[jishu] = 1;
    down[jishu] = 0;
    up[jishu] = 1;
    }
    zzdian_x[jishu] = dian_x[jishu];
    zzdian_y[jishu] = dian_y[jishu];
    }
   
    else if(dian_x[jishu]  <= 0 && dian_y[jishu] > 0 && dian_y[jishu] + 10 < 460)//左边界
    {
    if(yy > 0)
    {
    left[jishu] = 0;
    right[jishu] = 1;
    down[jishu] = 1;
    up[jishu] = 0;
    }
    else
    {
    left[jishu] = 0;
    right[jishu] = 1;
    down[jishu] = 0;
    up[jishu] = 1;
    }
    zzdian_x[jishu] = dian_x[jishu];
    zzdian_y[jishu] = dian_y[jishu];
    }
    else if(dian_y[jishu] <= 0 && dian_x[jishu] > 0 && dian_x[jishu] + 10 < 485)//上边界
    {
    if(xx < 0)
    {
    left[jishu] = 1;
    right[jishu] = 0;
    down[jishu] = 1;
    up[jishu] = 0;
    }
    else
    {
    left[jishu] = 0;
    right[jishu] = 1;
    down[jishu] = 1;
    up[jishu] = 0;
    }
    zzdian_x[jishu] = dian_x[jishu];
    zzdian_y[jishu] = dian_y[jishu];
    }
    else if(dian_x[jishu] <= 0 && dian_y[jishu] <= 0)//左上角
    {
    a[jishu] = 1;
    b[jishu] = 1;
    left[jishu] = 0;
    right[jishu] = 1;
    down[jishu] = 1;
    up[jishu] = 0;
    }
    else if(dian_x[jishu] + 10 >= 485 && dian_y[jishu] <= 0)//右上角
    {
    a[jishu] = 1;
    b[jishu] = 1;
    left[jishu] = 1;
    right[jishu] = 0;
    down[jishu] = 1;
    up[jishu] = 0;
    }
    else if(dian_x[jishu] + 10 >= 485 && dian_y[jishu] + 10 >= 460)//右下角
    {
    a[jishu] = 1;
    b[jishu] = 1;
    left[jishu] = 1;
    right[jishu] = 0;
    down[jishu] = 0;
    up[jishu] = 1;
    }
    else if(dian_x[jishu] <= 0 && dian_y[jishu] + 10 >= 460)//左下角
    {
    a[jishu] = 1;
    b[jishu] = 1;
    left[jishu] = 0;
    right[jishu] = 1;
    down[jishu] = 0;
    up[jishu] = 1;
    }
    }
if(right[jishu] == 1)
dian_x[jishu] = dian_x[jishu] + a[jishu];
if(left[jishu] == 1)
dian_x[jishu] = dian_x[jishu] - a[jishu];
if(down[jishu] == 1)
dian_y[jishu] = dian_y[jishu] + b[jishu];
if(up[jishu] == 1)
dian_y[jishu] = dian_y[jishu] - b[jishu];

        }  
    }

private class Run extends Thread implements Runnable
{
public void run() 
{
while(true)
{
l.lock();
if(jishu > n)
jishu = 1;
try
   {
Thread.sleep(10/n);
   }catch(Exception e)
   {   
    e.printStackTrace();
   }
    repaint();
jishu ++;
l.unlock();
}
}
}

public static void main(String[] args) {
xiaoqiu tread = new xiaoqiu();
tread.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
tread.setBounds(400, 200, 500, 500);
tread.setVisible(true);
}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值