java 运动的大球吃小球_JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型...

/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/

前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球。首先第一步自然是先把界面弄好啦

1 public class BallUI extendsJPanel {2

3 private ArrayList li = new ArrayList();4

5 public static voidmain(String[] args) {6 BallUI bu = newBallUI();7 bu.UI();8 }9

10 public voidUI() {11 JFrame jf = newJFrame();12 jf.setLocationRelativeTo(null);13 jf.setResizable(false);14 jf.setSize(700, 700);15 this.setSize(jf.getWidth(),jf.getHeight());16 jf.setTitle("大球吃小球");17

18 this.setPreferredSize(newDimension(jf.getWidth(), jf.getHeight()));19 jf.add(this);20

21

22

23 jf.setVisible(true);24 }25

26

27 }

界面写好后想想要怎么做呢?既然是大球吃小球还利用线程,那肯定需要一个队列,然后呢?既然要队列,那队列里存什么?肯定存小球啊,那自然要创建一个小球类了,那小球有什么属性呢?坐标、移动速度、大小、颜色,除了这些在创建时还需不需要传些什么参数呢?既然传了颜色,那肯定需要画小球,我们在哪画?是调用方法还是在线程中获取小球属性然后画?我觉得调用方法会更好,所以我们要在这里传入一个画布。同样在后面我们还需要检测小球是否碰撞,因此我们还需要传入一个队列。下面便是Ball类的构造了

public classBall {private intsize;private intx;private inty;private intspeedX;private intspeedY;privateColor c;privateJPanel jf;private ArrayListli;public Ball(int size, int x, int y, int speedX, int speedY, Color c, JPanel jf, ArrayListli) {this.size =size;this.x =x;this.y =y;this.speedX =speedX;this.speedY =speedY;this.c =c;this.jf =jf;this.li =li;

}

//画球public voiddraw(Graphics g) {

}

//移动球public voidmove() {

}

//清除上次留下的痕迹public voidclear(Graphics g) {

}

//碰撞检测public voidcrash(Graphics g) {

}

}

创建好小球类后,我们便需要线程来创建小球、改变小球,那这里也有一个问题,我们是用一个线程还是两个还是多个?这样看,如果只用一个线程,那么我们每次改变小球得在创建了一个小球后进行,如果小球数量少还没问题,但是当小球数量多了之后,每便利一次就会用上一段时间,那么肯定会有延时,所以我们需要把这里分成两个线程,一个线程创建小球,一个线程改变小球。这里其实就利用了生产者消费者模型:生产者负责生产数据并存入缓冲区,消费者从缓冲区中取出数据并且处理并输出。

1 public class ThreadBall extendsThread {2

3 private ArrayListli;4 privateJPanel jp;5 privateGraphics g;6

7 public ThreadBall(ArrayListli,JPanel jp) {8 this.li =li;9 this.jp=jp;10 }11

12 public voidrun() {13 g=jp.getGraphics();14 while(true) {15 for(int i=0;i

30 }

public class BallLis extendsThread {private ArrayList li = new ArrayList();privateJPanel jp;public BallLis(ArrayListli,JPanel jp) {this.li =li;this.jp =jp;

}public voidrun() {while (true) {int size = new Random().nextInt(30) + 10;int x = newRandom().nextInt(jp.getWidth());int y = 0;int speedX = new Random().nextInt(10) + 10;int speedY = new Random().nextInt(10) + 5;

Color c=new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256));

Ball bl=newBall(size,x,y,speedX,speedY,c,jp,li);

li.add(bl);try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

创建好线程后肯定需要在BallUI类中创建对象啦

BallLis ball = new BallLis(li,this);

ball.start();

ThreadBall tb=new ThreadBall(li,this);

tb.start();

那么,剩下的任务就是实现小球类中的方法了,就留给你们去实现了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值