这篇文章基于随机小球游戏V1的那篇博客来进行修改,我们想要的是点击一下就有一个小球随机方向移动,而不是和V1一样,发射一串小球。接下来就来实现这个效果。

首先,我们这次的思想是不是再像V1一样,点击一次增加一个线程,而是点击一次的话 就在点击位置增加一个小球,然后就让小球在窗体内随机运动,然后再点击,就再生成一个小球,要做到这一点的话,线程的添加就不能再放在监听器方法中,而是在GameUI的showUI中就添加一个线程,并且只用这一个即可。所以首先在showUI方法中进行修改,先修改窗体名称,用setTitle方法,然后添加新的线程对象,ThreadBall threaball = new ThreadBall();Thread tf = new Thread(threadball);tf.start();这就增加了线程对象。接下来就写一下GameUI类中的mouseClick方法,这里我们打算每次点击一下就添加一个小球,所以要生成一个具备一定属性的小球对象,然后存入到我们设定好的一个存储的地方,这里我们用List来保存。

我们用面向对象的思维来思考这个问题,那么我们就可以把这一个一个的小球看成一个一个的对象,我们自然就可以创建一个关于小球的类,取名为Ball,设定属性int x,y表示小球的初始位置,int speedx,speedy表示小球的位移的偏移量,画笔属性Graphics用来画出小球,接着设置颜色属性Color来表示小球的颜色,最后是size来表示小球的大小。接着就创建构造方法便于小球的创建,代码为public Ball(int x,int y,int speedx,int speedy,int size,Color color){this.x=x;this.y=y;this speedx=speedx;this.speedy=speedy;this.size=size;this.color=color;},这就可以在点击时方便地创建一个小球。然后刚刚只是给出了小球的属性,接下来要让小球动起来,设置drawBall方法,方法体内设置画笔颜色,并且是用画笔画圆即可,方法体代码为g.setColor(color);g.drawOval(x,y,size,size);这就完成了drawBall的方法体的撰写,方法的参数我们用画笔,即Graphics g。接着要保证小球一直运动并且不出边界,此处我们设置move方法,对小球的当前x和y进行判定,当比边界大时设置反向移动,代码为if(x<0||x>1000){speedx= -speedx};if(y<0||y>800){speedy= -speedy};x+=speedx;y+=speedy;这就完成了小球的移动,或者说是每次遍历时每个小球(对象)的x和y的更新,从而显现出小球在窗体上不断移动的效果,先附上完整的Ball类代码

package com.ms.ThreadGameV2;import java.awt.*;public class Ball {int x,y;Color color;int size;//球的大小int speedx;int speedy;public Ball(int x,int y,Color color,int size,int speedx,int speedy){this.x=x;this.y=y;this.color=color;this.size=size;this.speedx=speedx;this.speedy=speedy;}public void  drawBall(Graphics g){g.setColor(color);g.fillOval(x,y,size,size);}public void move(){if(x<0||x>1000){speedx = -speedx;}if (y<0||y>800){speedy = -speedy;}x+=speedx;y+=speedy;}}

然后我们就接着来补充线程类的代码,首先我们创建线程类ThreadRun,并让它继承于Runnable类,接着设置属性,因为在run方法中要遍历存储小球的List,所以设置属性List<Ball>=new balllist[10000];然后要得到画笔,所以设置画笔Graphics g;然后这里我们也设置GameUI类的属性,目的是同步balllist的信息,否则可能会造成balllist的初始值空指针问题,(这里注意一下也可以还是设置构造方法传的是balllist,但是在run方法中要加上balllist中对象是否为空指针的判断,为null的话就continue即可)代码为public GameUI gui;接着我们就创建构造方法为的是能够把GameUI中的对象传递进来,同时传递画笔g,代码为public ThreadRun(GameUI gui,Graphics g){this.gui = gui;this,g=g;}然后写run方法,我们使用while true的无限循环,对balllist进行无限次的循环遍历,对其中的球进行绘画。方法体为while(true){for(int i=0;i<gui.getIndex;i++){Ball ball=balllist[i];ball.drawBall(g);ball.move();}},然后为了形成小球移动而不是发射一串小球的效果,我们这里每次循环遍历之前都画白板吧上一次遍历画出的小球覆盖一下买就可以得到我们想要的效果。代码为g.setColor(Color.WHITE);g.drawRect(0,0,1000,800);并且加一个30ms的延时,代码为Thread.sleep(30);这里附上ThreadRun的完整代码

package com.ms.ThreadGameV2;import java.awt.*;public class ThreadRun implements Runnable {Ball[] balllist;Graphics g;GameUI gui;public ThreadRun(GameUI gui,Graphics g){this.balllist=gui.balllist;this.g=g;this.gui=gui;}@Overridepublic void run() {while(true){try {Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}g.setColor(Color.white);g.fillRect(0,0,1000,800);//从数据结构中取出来球,所以我们需要一个Ball类for ( int i=0;i< gui.getIndex();i++){Ball ball =balllist[i];ball.drawBall(g);ball.move();}}}
}

接着就回过头来完善GameUI的内容,我们在一开始是创建了ThreadRun的对象,显然这里要修改一下,构造线程对象时,要加上一些参数,修改的代码为ThreadRun thread  = new ThreadRun(gui,g);然后在showUI的创建线程类对象代码的前面,获得窗体的画笔,并且创建新的GameUI类的对象,代码为GameUI gui = new GameUI ;这就改完了showUI的方法体。接着我们要添加方法getIndex,使gui能够调用该方法来得到当前的balllist的非null元素的个数,接着就可以在run方法中完成对balllist的遍历。附上完整的GameUI类的代码

package com.ms.ThreadGameV2;import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;public class GameUI extends JFrame {private Graphics g;Ball[] balllist =new Ball[10000];int index =0;public int getIndex(){return index;}public void showUI(){setSize(1000,800);setTitle("线程游戏V2");setVisible(true);g = getGraphics();ThreadRun trun = new ThreadRun(this,g);Thread tf = new Thread(trun);tf.start();//直接实例化一个匿名内部类对象,用Lamda来写更方便,先用第一种方法addMouseListener(new MouseAdapter() {Random random =new Random();@Overridepublic void mouseClicked(MouseEvent e) {//每次点击都创建一个球int speedx = random.nextInt(8)-5;int speedy = random.nextInt(7)-3;Color color =new Color(random.nextInt(500000000));int size = random.nextInt(50);Ball ball =new Ball(e.getX(),e.getY(),color,size,speedx,speedy);//把球存进去balllist[index++]=ball;}});}public void paint(Graphics g){super.paint(g);}public static void main(String[] args) {GameUI gf = new GameUI();gf.showUI();}}

最后附上游戏效果截图

java线程游戏之随机小球游戏V2相关推荐

  1. java swing 大球吃小球游戏 功能完善 完整代码 下载即可以运行

    今天天气不错,利用一段时间给大家分享一个大球吃小球的游戏,该游戏也属于一个比较优秀的作品.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步!! 开发环境 开发 ...

  2. java实现挡板接小球游戏

    import sun.plugin2.util.ColorUtil;import javax.swing.*; import java.awt.*; import java.awt.event.*;/ ...

  3. Java小程序之球球大作战(基于Java线程实现)

    Java小程序之球球大作战(基于Java线程实现) 一.游戏基本功能: 1.自己的小球可以随着鼠标的移动而改变坐标: 2.敌方小球不断的在界面中移动 3.当检测到敌方小球相互碰撞时,小球会弹开 4.当 ...

  4. java编写游戏_java编写小游戏-大球吃小球

    游戏界面: 点击火箭开始游戏 点击Exit退出游戏 左上角显示当前成绩和历史最高分 退出自动保存最高成绩 代码获取 扫码关注微信公众号[程序猿声] 在后台回复[EBG]不包括[]即可获取. 玩法: 玩 ...

  5. JAVA编程实战之编写小游戏-大球吃小球(eat ball game)

    游戏界面: 点击火箭开始游戏 点击Exit退出游戏 左上角显示当前成绩和历史最高分 退出自动保存最高成绩 代码获取 扫码关注微信公众号[程序猿声] 在后台回复[EBG]不包括[]即可获取. 玩法: 玩 ...

  6. 复习Java小球游戏代码分享Java面试题MySQL中常用的锁生活【记录一个咸鱼大学生三个月的奋进生活】021

    记录一个咸鱼大学生三个月的奋进生活021 复习Java小球游戏 游戏界面的代码 小球运动线程的代码 运行游戏的代码 运行结果 代码分享 学习Java面试题(MySQL中常用的锁) 照片分享 复习Jav ...

  7. Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测

    ***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来.当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测 题目 题目描述与运行示例 破题 ...

  8. java隋唐系列游戏下载,隋唐爭霸V2.11游戏

    隋唐争霸春雪系列V2.11版(三国群英传2mod)这个版本修改了武将以及技能,其他的修改并不算多,另外要提一下就是游戏的难度还是挺大的,至少小编前期打还需要S\L打法,喜欢三国群英传2的玩家推荐试试. ...

  9. Java实训项目一一拼图游戏(附源码)

    1 实训基本信息 1.1 实训项目名称 (1)拼图游戏 1.2 实训环境 本次实训内容主要针对专业学生,实训形式以实战讲解为主导.实训课程由实训老师主讲,实训老师教学严谨又平易近人,讲解的内容非常细致 ...

  10. 【java毕业设计】基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码)——坦克大战游戏

    基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+Eclipse的坦克大战游戏设计与实现,文章末尾附有本毕业设 ...

最新文章

  1. 跨域产生的原因及解决方法
  2. 无法为新的Android ActionBar支持找到Theme.AppCompat.Light
  3. Installshield 2010 中集成. Net framework4 与 vc++ 2010运行安装包
  4. PCL点云CSV转PCD文件
  5. 5G:无人驾驶的“超级英雄”路
  6. 【开发随笔】以强化学习环境 gym 库为例:为什么日常中我应该试图标准化接口?
  7. Spring Boot Actuator监控端点小结
  8. Web系统大规模并发-电商秒杀与抢购
  9. 4、【办公自动化】Python实现Word转PDF
  10. 水平居中设置-定宽块状元素
  11. 新人如何快速熟悉一个新项目
  12. 2021年煤气考试题库及煤气证考试
  13. hadoop Error: JAVA_HOME is incorrectly set.Please update C:\hadoop-3.0.0\etc\hadoop\hadoop-env.cmd
  14. ANSYS软件许可证优化,高效提升工作效率
  15. java版我的世界_我的世界Java版1.16
  16. 5万字长文!SpringBoot 操作 ElasticSearch 详解
  17. ABAP 设置鼠标光标
  18. Platinum Maestro运动控制器 ——速度位置等数据的获取
  19. zipfile的压缩和解压缩
  20. 古人的养德养生观揭秘

热门文章

  1. TortoiseSVN 无论什么操作,都报同一个错误:请求的操作需要提升
  2. Python自动化 requests 库:发送 form-data 格式的 http 请求
  3. 验证码服务器出现问题,上网的时候验证码老是出错,是服务器的问题还是什么?...
  4. cocos2dx android工程接入联通Unipay sdk
  5. Comic Sc​​roller - 将漫画网站中一话整理一整页的插件
  6. 美景订餐管理系统--用于公司内部加班订餐
  7. 服务器word文档会是只读的,Word自动变只读模式怎么办? 这样可取消Word只读
  8. 循环神经网络--RNN GRU LSTM 对比分析
  9. 北京专科计算机学校排名及分数线,北京专科大学排名及分数线
  10. .Net大局观(2).NET Core 2.0 特性介绍和使用指南