西瓜大战java_Java中的线程及(简单飞机大战)实现

在讲到线程之前我们先聊一下程序,进程,线程这三者的概念:

程序是指为了实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。

程序存储在磁盘上,由一系列的文件+数据组成。

进程:程序运行起来之后就是一个进程

进程存在系统分配的内存里,并且进程之间可以进行通信。

而我们这里需要讲到的线程是进程中的一个独立运行的单位,是CPU执行的最小单位。

我们在使用记事本写程序时需要先执行Javac命令编译,将java程序编译成一个字节码class文件,然后再执行Java命令时JVM(Java虚拟机)就会启动线程,让线程调用main函数,线程根据main函数中的代码的顺序逐行执行。

那么同样的线程在哪里执行呢?

线程在cpu中执行,线程执行时所涉及到对象的属性和方法等数据都在内存中,电脑使用缓存存储线程所需要执行的数据。线程只会改变缓存中的数据而不会改变内存中的数据。

线程与进程不同,每个进程系统都会分配一定的内存空间,线程都是共享存储空间。

多线程就显而易见了就是指一个进程中有多个线程,能同时做多件事。

那么Java中如何实现线程呢?

1.实现Runnable接口

run();线程执行的方法

2.Thread类实现Runnable接口

run();线程执行的方法

start();方法线程的启动方法

接下来我们来讲一些简单的飞机大战的实现:

一、界面的实现

首先呢还是需要一个相对简单的界面

public class MainFrame extends JFrame implements Planeinte{

public static void main(String[] args) {

MainFrame mf=new MainFrame();

mf.initUI();

}

public void initUI(){

//设置窗体属性this.setTitle("飞机大战V1.0");

this.setSize(600, 800);

this.setDefaultCloseOperation(3);

this.setLocationRelativeTo(null);

this.setVisible(true);

首先我们需要定义一个飞行物的类,用来定义它们的属性和方法

因为敌机和子弹都需要自动产生及运动,所以我们在这里需要三个线程,一个自动产生飞机,一个自动产生子弹,还有一个自动画子弹和飞机的类。

产生的飞机和子弹分别用数组队列来存储

线程一(自动产生飞机):

public void run(){

while(true){

if(true){

int x=rand.nextInt(mf.getWidth());

int y=0;

int speedX=rand.nextInt(5)+1;

int speedY=rand.nextInt(5)+1;

int blood=10;

boolean flag=false;

ImageIcon icon=new ImageIcon(this.getClass().getResource("敌机1.png"));

Plane plane=new Plane(x, y, speedX, speedY, blood, flag,icon);

list.add(plane);

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

线程二(自动产生子弹):

public void run(){

while(stopflag){

if(true){

int x=myplane.getX();

int y=myplane.getY();

int speedX=0;

int speedY=-40;

int blood=1;

boolean flag=true;

ImageIcon icon=new ImageIcon(this.getClass().getResource("bullet13.png"));

Plane bullet=new Plane(x, y, speedX, speedY, blood, flag,icon);

listb.add(bullet);

for(int i=1;i

Plane plane=list.get(i);

x=plane.getX();

y=plane.getY();

speedX=0;

speedY=20;

blood=1;

flag=false;

icon=new ImageIcon(this.getClass().getResource("bullet14.png"));

Plane bulletb=new Plane(x, y, speedX, speedY, blood, flag,icon);

listb.add(bulletb);

}

try {

Thread.sleep(300);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

线程三(自动画飞机和子弹):

public void run(){

while(true){

if(g==null)

g=mf.getGraphics();

if(true&&g!=null){

if(y==0){

y=mf.getHeight()-icon.getIconHeight();

}

ig.drawImage(icon.getImage(), 0, y, mf);

y+=5;

for(int i=0;i

Plane plane=list.get(i);

plane.drawPlane(ig);

plane.movePlane(mf);

}

for(int j=0;j

Plane bullet=listb.get(j);

bullet.drawPlane(ig);

bullet.bulletcrash();

}

mf.getGraphics().drawImage(img, 0, 0, mf);

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

在这里如果我们直接画在JFrame窗体上,会导致有闪屏以及有残影的出现,为了解决这个问题,在这里我们采用双缓冲技术,就是我们不直接将对象画在窗体上,而是在这之前先创建一块次画布先依次在线程里将对象画在次画布上之后,再将整个次画布画在窗体上。

//创建次画布

Image img =mf.createImage(mf.getWidth(), mf.getHeight());

Graphics ig=img.getGraphics();

ImageIcon icon=new ImageIcon(this.getClass().getResource("背景0.jpg"));

int y=mf.getHeight()-icon.getIconHeight();

在得到所有飞机之后,我们在窗体主函数出先将我们要控制的飞机存入,并且给窗体加上监听以鼠标的拖动来控制我方飞机,也就是list.get(0);

ImageIcon icon=new ImageIcon(this.getClass().getResource("飞机1.png"));

Plane myplane=new Plane(300, 750, 0, 0, 100, true,icon);

list.add(myplane);

启动线程并添加监听:

PlaneAI pAI=new PlaneAI(this);

PlaneMoveDraw pmd=new PlaneMoveDraw(this);

pAI.start();

pmd.start();

PlaneListener pl=new PlaneListener();

this.addMouseListener(pl);

this.addMouseMotionListener(pl);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

transition

一、语法 transition: property duration timing-function delay transition属性是个复合属性,她包括以下几个子属性: transition-property :规定设置过渡效果的css属性名称transition-duration :规定完成过渡效果需要多少秒或…

CentOS服务器

CentOS搭建Wordpress 这是一个很有趣的学习链接:https://cloud.tencent.com/developer/labs/lab/10001 可以亲自动手试试,当你联系完之后,还有阅读文档,可以保存记录下来。 登录linux服务器搭建Wordpress用到的命令 登录服务器 登录服务器 s…

rust tpa_Rust(腐蚀)怎么tp求大神指教。请写在下面

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼拆除自己建筑的建筑:/removetp到别人旁边:/tpr 游戏名字接受别人tp:/tpa创造战队:/clan create 战队名字 战队简介(这东西没什么卵用)邀请成员加入战队:/clan invite 游戏名字接受邀请进入战队:/clan join 战队名字查看战队成员:/c…

图解在VC里使用graphics.h画图(相似TC)

1 www.easyx.cn 下载 EasyX 库 我下的2014;解压后例如以下图&#xff1b; 2 依据自己的VC 版本号进行安装 3 在控制台画一个圆 #include <graphics.h> // 引用图形库 #include <conio.h> void main() {initgraph(640, 480); // 初始化画图窗体circle(200, 200, 100…

使用SwingWorker的Java Swing中的多线程

如果要使用Swing用J​​ava编写桌面或Java Web Start程序&#xff0c;您可能会觉得需要通过创建自己的线程在后台运行某些东西。 没有什么可以阻止您在Swing中使用标准的多线程技术&#xff0c;并且需要遵循通常的注意事项。 如果您有多个线程访问相同的变量&#xff0c;则需要…

微信小程序之阻止冒泡事件

众所周知&#xff0c;在微信小程序给标签绑定点击方法大家都会想到 "bindtap" 但是在页面中会遇到 点击 会冒泡而触发其他元素的时间发生 那么怎么办呢 就把引发冒泡事件的始作俑者的 bindtap 更改成catchtap 即可 转载于:https://www.cnblogs.com/wzy0526/p/8423989…

MySql Jar 包下载

MySql JAR 包下载 我们要使用Spring 链接MySql 需要两个Jar 包 一个是C3p0 一个是MySql 的Connection Jar 包 C3p0&#xff1a; 进入下面的网址 http://www.mchange.com/projects/c3p0/ 按照黄色的指示 下载 2. MySql Jar 包 进入MySql 官网 https://dev.mysql.com/down…

c语言以空格分割字符串_c语言中,输入任意字符串,任意空格隔开

c语言中,输入任意字符串,任意空格隔开关注:132 答案:3 mip版解决时间 2021-01-27 16:01提问者更无风月2021-01-27 01:51如题,希望大神代码最佳答案二级知识专家闪光的男人2021-01-27 02:50用scanf以%s读入字符串&#xff0c;即可实现输入以空格分隔的字符串。以下代码功能为&…

Unity经典游戏教程之:是男人就下100层

版权声明&#xff1a; 本文原创发布于博客园"优梦创客"的博客空间&#xff08;网址&#xff1a;http://www.cnblogs.com/raymondking123/&#xff09;以及微信公众号"优梦创客"&#xff08;微信号&#xff1a;unitymaker&#xff09;您可以自由转载&#x…

使用Flying-Saucer生成PDF中的条形码

Flying-Saucer是一个不错的库&#xff0c;可以从Java应用程序中生成PDF文档。 只需生成一堆XHTML&#xff0c;然后将其放入渲染器中&#xff0c;然后使用iText生成所需的文档即可。 但是&#xff0c;当涉及条形码时&#xff0c;Flying-Saucer无法访问iText的内置条形码功能&am…

Html和websocket初识

一、web框架 众所周知&#xff0c;对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端。 import socketdef handle_request(client):buf client.recv(1024)client.send(b"HTTP/1.1 200 OK\r\n\r\n")cli…

java lombok 视频_Java开发神器Lombok使用详解

最近正在写SpringBoot系列文章和录制视频教程&#xff0c;每次都要重复写一些Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等。甚是浪费时间&#xff0c;也影响代码的可读性。因此&#xff0c;今天就给大家推荐一款Java开发神器——Lombok&#…

11-[函数进阶]-闭包

1.什么是闭包&#xff1f; 内部函数对外部函数作用域里变量的引用&#xff08;非全局变量&#xff09;&#xff0c;则称内部函数为闭包。 def outer():n 10def inner():print("inner:", n)return innerval outer() print(val) val() 闭包的意义&#xff1a;返回的…

Java应该是更高级别还是更低级别?

总览 Java 8带来了许多简化的功能&#xff0c;例如Lambda表达式&#xff0c; 类型注释和虚拟扩展 。 尽管此功能很重要&#xff1a;a&#xff09;有价值&#xff0c;b&#xff09;赶上较凉的语言&#xff0c;但是这些更丰富&#xff0c;更高级的功能是Java应当重点关注的领域。…

django开发者模式中的autoreload是怎样实现的

在开发django应用的过程中&#xff0c;使用开发者模式启动服务是特别方便的一件事&#xff0c;只需要 python manage.py runserver 就可以运行服务&#xff0c;并且提供了非常人性化的autoreload机制&#xff0c;不需要手动重启程序就可以修改代码并看到反馈。刚接触的时候觉得…

html5与css3入门知识点精炼

<meta name "keywords" content"…………"/>&#xff08;网页搜索时要输入的关键字&#xff09;<meta name "author" content "作者的名字"<meta http-equiv "refresh" content "跳转的时间 ; URL跳转…

CSS实现单行、多行文本溢出显示省略号(…)

如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来&#xff0c;当然还需要加宽度width属来兼容部分浏览。 实现方法&#xff1a; overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 效果如图&#xff1a; 但是这个属性只支持单行…

java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?

A native method has the same syntax as an abstract method, but where is it implemented?解决方案What are native methods in Java and where should they be used?Once you see a small example, it becomes clear:Main.java:public class Main {public native int int…

JAXB –表示空集合和空集合

示范代码 以下演示代码将用于Java模型的所有不同版本。 它只是将一个集合设置为null&#xff0c;第二个设置为空列表&#xff0c;第三个设置为填充列表。 package package blog.xmlelementwrapper;import java.util.ArrayList; import javax.xml.bind.*;public class Demo {pu…

显示日历的指令:cal

1.显示日历的指令&#xff1a;cal &#xff08;1&#xff09;参数&#xff1a; &#xff08;2&#xff09;实例&#xff1a; 转载于:https://www.cnblogs.com/yfacesclub/p/8434449.html