java魔兽猎人_Java基于Swing实现的打猎射击游戏代码

package Game;

import static java.lang.Math.random;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class MainFrame extends JFrame {

private static final long serialVersionUID = 1L;

private static long score = 0;// 分数

private static Integer ammoNum = 5;// 子弹数量

private static JLabel scoreLabel;// 分数

private BackgroundPanel backgroundPanel;

private static JLabel ammoLabel;

private static JPanel infoPane;

/**

* 构造方法

*/

public MainFrame() {

super();

setResizable(false);// 进制调整窗体大小

setTitle("打猎游戏");

infoPane = (JPanel) getGlassPane();// 获取玻璃面板

JLabel label = new JLabel("装载子弹……");// 创建提示标签组件

label.setHorizontalAlignment(SwingConstants.CENTER);

label.setFont(new Font("楷体", Font.BOLD, 32));

label.setForeground(Color.RED);

infoPane.setLayout(new BorderLayout());

infoPane.add(label);// 添加提示标签组件到玻璃面板

setAlwaysOnTop(true);// 是窗体保持在最顶层

setBounds(100, 100, 573, 411);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

backgroundPanel = new BackgroundPanel();// 创建带背景的面板

backgroundPanel.setImage(new ImageIcon(getClass().getResource(

"background.jpg")).getImage());// 设置背景图片

getContentPane().add(backgroundPanel, BorderLayout.CENTER);

// 添加鼠标事件适配器

addMouseListener(new FrameMouseListener());

scoreLabel = new JLabel();// 显示分数的标签组件

scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);

scoreLabel.setForeground(Color.ORANGE);

scoreLabel.setText("分数:");

scoreLabel.setBounds(25, 15, 120, 18);

backgroundPanel.add(scoreLabel);

ammoLabel = new JLabel();// 显示自动数量的标签组件

ammoLabel.setForeground(Color.ORANGE);

ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);

ammoLabel.setText("子弹数量:" + ammoNum);

ammoLabel.setBounds(422, 15, 93, 18);

backgroundPanel.add(ammoLabel);

}

/**

* 加分方法

*/

public synchronized static void appScore(int num) {

score += num;

scoreLabel.setText("分数:" + score);

}

/**

* 消耗子弹的方法

*/

public synchronized static void useAmmo() {

synchronized (ammoNum) {

ammoNum--;// 子弹数量递减

ammoLabel.setText("子弹数量:" + ammoNum);

if (ammoNum <= 0) {// 判断子弹是否小于0

new Thread(new Runnable() {

public void run() {

// 显示提示信息面板

infoPane.setVisible(true);

try {

// 1秒钟装载子弹的时间

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

ammoNum = 5;// 恢复子弹数量

// 修改子弹数量标签的文本

ammoLabel.setText("子弹数量:" + ammoNum);

infoPane.setVisible(false);// 隐藏提示信息面板

}

}).start();

}

}

}

/**

* 判断子弹是否够用

*

*/

public synchronized static boolean readyAmmo() {

synchronized (ammoNum) {

return ammoNum > 0;

}

}

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

MainFrame frame = new MainFrame();

frame.setVisible(true);

frame.start();

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

/**

* 启动游戏的方法

*/

public void start() {

new PigThread().start();

new BirdThread().start();

}

/**

* 窗体的鼠标事件监听器

*

*/

private final class FrameMouseListener extends MouseAdapter {

public void mousePressed(final MouseEvent e) {

Component at = backgroundPanel.getComponentAt(e.getPoint());

if (at instanceof BackgroundPanel) {// 如果点到面板也扣除子弹

MainFrame.useAmmo();// 消耗子弹

}

/*

* if (at instanceof BirdLabel) {// 如果点到小鸟 MainFrame.appScore(32);//

* 加分 } if (at instanceof PigLabel) {// 如果点到野猪

* MainFrame.appScore(11);// 加分 }

*/

}

}

/**

* 生成猪角色的线程

*

*/

class PigThread extends Thread {

@Override

public void run() {

while (true) {

// 创建代表野猪的标签控件

PigLabel pig = new PigLabel();

pig.setSize(120, 80);// 设置控件初始大小

backgroundPanel.add(pig);// 添加控件到背景面板

try {

// 线程随机休眠一段时间

sleep((long) (random() * 3000) + 500);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

/**

* 生成鸟角色的线程

*

*/

class BirdThread extends Thread {

@Override

public void run() {

while (true) {

// 创建代表小鸟的标签控件

BirdLabel bird = new BirdLabel();

bird.setSize(50, 50);// 设置控件初始大小

backgroundPanel.add(bird);// 添加控件到背景面板

try {

// 线程随机休眠一段时间

sleep((long) (Math.random() * 3000) + 500);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

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

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

相关文章

Linux 命令之 aptitude -- APT 软件包管理工具

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;安装、升级和删除软件包升级系统所有的软件包将系统升级到新的发行版安全升级系统的软件包安装软件包删除软件包&#xff08;保留有关的配置文件&#xff09;彻底删除软件包&#xff08;删除有关的配置…

微软 azure_在Microsoft Azure上运行Eclipse MicroProfile

微软 azure在本文中&#xff0c;我将通过展示如何在Microsoft Azure Web Apps for Containers中执行操作来跟踪有关在Oracle Cloud中运行Eclipse MicroProfile应用程序的系列文章。 我正在使用与以前的帖子相同的简单应用程序CloudEE Duke 。 唯一的区别是&#xff0c;我现在将…

java文件复制速度_【Java】Java代码拷贝文件的速度

Java代码拷贝文件的速度究竟有多快&#xff1f;前言最近学习Java到了流处理&#xff0c;其中有种流叫FileInputStream和FileOutputStream&#xff0c;简单来说&#xff0c;就是操作文件的&#xff0c;老师给我们示范了一个非常有趣的例子&#xff0c;用代码拷贝文件&#xff01…

vim 的配置详解/键盘映射配置详解

文章目录特性设置配置快捷键&#xff08;键映射配置&#xff09;键盘符号键盘映射命令和不同模式的对应关系取消键盘映射查看键盘映射在目录 /etc/ 下面&#xff0c;有个名为 vimrc 的文件&#xff0c;这是系统中公共的 vim 配置文件&#xff0c;对所有用户都有效。而在每个…

开闭原则 依赖倒置原则_坚实原则:依赖倒置原则

开闭原则 依赖倒置原则到目前为止&#xff0c;我们只研究了单一职责 &#xff0c; 打开/关闭 &#xff0c; liskov替换和接口隔离原则。 依赖倒置是我们所要研究的最后一个原理之一。 该原则指出 答&#xff1a;高级模块不应依赖于低级模块。 两者都应依赖抽象。 B.抽象不应…

java的传值调用什么_Java的传值调用

(本文非引战或diss&#xff0c;只是说出自己的理解&#xff0c;欢迎摆正心态观看或探讨)引子之所以写这篇文章是因为前些天写了一篇《Java中真的只有值传递么&#xff1f;》探讨了网上关于Java只有值传递的说法&#xff0c;当时写这篇文章的缘由是因为之前看的文章讲解的Java只…

Linux 命令之 apt -- Debian Linux 新一代的软件包管理工具

文章目录 一、命令介绍二、常用命令三、常用选项四、命令示例(一)安装、更新和删除软件包安装指定的软件包安装软件包的同时修复依赖问题安装指定版本的软件包安装本地的 deb 包文件删除软件包,保留配置文件删除软件包,不保留配置文件将已经安装的但是不再使用的软件包删除…

liskov替换原则_坚实原则:Liskov替代原则

liskov替换原则以前&#xff0c;我们深入研究了坚实的原则&#xff0c;包括单一责任和开放/封闭原则。 Liskov替代原则&#xff08;LSP&#xff09;是子类型关系的一种特殊定义&#xff0c;称为&#xff08;强&#xff09;行为子类型&#xff0c; 假设对象S是对象T的子类型&a…

java 聚合_Java聚合

聚合如果一个类有一个类的实体引用(类中的类)&#xff0c;则它称为聚合。 聚合表示HAS-A关系。考虑有一种情况&#xff0c;Employee对象包含许多信息&#xff0c;例如&#xff1a;id&#xff0c;name&#xff0c;emailId等。它包含另一个类对象&#xff1a;address&#xff0c;…

Linux 命令之 dpkg --Debian 的一个底层包管理工具

文章目录 一、命令介绍二、deb 软件包命名规则三、软件包管理相关文件/目录四、dpkg 数据库五、子命令六、常用选项(一)安装、升级和删除软件包(二)查询和检验软件包(三)其它七、命令示例(一)安装、升级和卸载软件包安装指定的软件包解开软件包到系统目录但不配置配置软…

java jep_Java 10 – JEP 286:局部变量类型推断

java jepJava 10即将发布&#xff0c;RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中&#xff0c;开发人员社区中最有趣且最受关注的是286&#xff1a;Local-Variable Type Inference 。 什么是局部变量类型推断&#xff1f; 我们在Java…

java ffmpeg 视频水印_java 实现视频转换通用工具类:视频加水印-Ffmpeg(五-1)

java 实现视频转换通用工具类&#xff1a;视频相互转换-Ffmpeg(三)说明&#xff1a;视频加水印支持右上角、左上角、左下角、右下角、底部居中几个方位1.根据水印文字---添加视频水印/*** 根据水印文字---添加视频水印* param srcPath 原视频路径* param tarVideoPath 生成后的…

手动 clone 安装 Homebrew

文章目录 手动 clone 安装 HomebrewHomebrew 换源替换 homebrew 源替换 homebrew-core 源替换 homebrew-bottles 源bash用户zsh 用户更新 Homebrew手动 clone 安装 Homebrew 首先进入 homebrew 目录:cd "$(brew --repo)/Library/Taps/homebrew/"创建目录 homebrew-c…

lambda 匿名内部类_Lambda运行时内部:窥视无服务器巢穴

lambda 匿名内部类有没有想过lambda里面是什么样的&#xff1f; 不要怀疑了 让我们找出答案。 自从2014年问世以来&#xff0c;AWS的lambda函数就成为一个热门话题&#xff0c;在无服务器计算领域开辟了全新的历史。 无状态&#xff0c;零维护&#xff0c;按次执行的好东西实际…

java VM argument_java之program arguments与VM arguments

program arguments 中的值作为 args[] 的参数传入的&#xff0c;而 VM Arguments 是设置的虚拟机的属性。program arguments 是要传给你的应用程序的&#xff0c;它通过主函数中的 args 来传值。 VM arguments是系统的属性&#xff0c;要传给 java 虚拟机的。如图&#xff1a;是…

java iterator 嵌套_Java中的集合嵌套

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public classDemo06 {public static voidmain(String[] args) {//大 MapHashMap> oraclenew HashMap>();//小MapHashMap java1018 new HashMap();HashMap java1227 new H…

Linux/Unix 如何查看 man 搜索到的手册页(manual page)的位置及复制手册页的内容

文章目录命令 man 是如何搜索手册页的&#xff1f;如何查看手册页所在的路径通过管道输出给 vim命令 man 是如何搜索手册页的&#xff1f; man uses a sophisticated method of finding manual page files, based on the invocation options and environment variables, the …

xml不利于调试_流利的接口不利于维护

xml不利于调试流畅的界面 &#xff08;最初由Martin Fowler 创造&#xff09;是一种与OOP中的对象进行通信的非常便捷的方式。 它使他们的外墙更易于使用和理解。 但是&#xff0c;它破坏了它们的内部设计&#xff0c;使它们更难以维护。 Marco Pivetta在他的博客文章Fluent In…

java输入月份求天数_java输入年份,月份,输出当月天数

package 第二次作业; public class 第二题 { //java文件名 public static void main(String[] args) { //相当于创建主函数 String 年份 = javax.swing.JOptionPane.showInputDialog("输入一个年份:"); //求出输…

java 换行 运算符格式_Java代码样式运算符换行格式

java 换行 运算符格式上周&#xff0c;我发现了什么决定了我在较长时间里一直在努力解决的问题的决定&#xff1a;是否放置&& &#xff0c; ||之类的运算符 或在同一行或下一行。 在构造布尔表达式或隐含字符串时&#xff0c;我们可能需要中断长行。 根据《 Google Ja…