[Java基础揉碎]坦克大战 java事件处理机制

目录

坦克大战游戏演示

​编辑

为什么要写这个项目 

java绘图坐标体系

java绘图技术

Graphics的常用方法

// 画直线 

​编辑

// 画矩形边框 

// 画填充矩形 

// 画填充椭圆

// 获取图片资源 

// 写字 

绘出坦克 

新建一个tankgame包, 新建一个类Tank, 里面包含横坐标和纵坐标

 新建一个Hero, 自己的坦克类, 去继承Tank

新建一个绘图区域类, 继承JPanel 

新建一个窗口类 

​编辑

 运行现在就拥有了一个窗口

在MyPanel里面写一个坦克的封装方法, 将坦克的坐标, 画笔, 方向, 类型传进去, 并根据不同类型坦克设置不同颜色

根据坦克方向, 来绘制坦克 

 将封装的坦克放到绘制类里面去

这一步运行看到已经有一个矩形了 

MyPanel的坦克方法里面继续添加 右边的轮子

 此时运行能看到两个轮子了

 MyPanel的坦克方法里面继续添加

  此时运行能看到

  MyPanel的坦克方法里面继续添加

  此时运行能看到

​编辑

  MyPanel的坦克方法里面继续添加

​编辑

更改以下颜色我方为黄色

继续画出向右的坦克

继续画出向下的坦克 

​编辑

继续画出向左的坦克  

java事件处理机制

具体实现是面板绘制类实现KeyListener接口, 监听键盘事件 

重写监听接口的三个方法 

假如在这里实现一些操作 

让窗口可以监听到键盘事件

运行就可以发现方法a里面的操作就打印出来了 

当向下的箭头触发的时候, 就坐标y++ , 然后重绘面板, 就可以实现向下移动了 

我们将上下左右都加进去 

Java的事件处理机制系统说明

 Java的事件处理机制深入理解

让坦克动起来

​编辑

实现keyListener 

重写接口的方法 

处理按下的时候的操作 

因为坦克那里的方向目前是写死的, 要在按下的时候能够改变它的方向, 需要把方向作为成员变量

绘制类里面将方向改为hero.getDirect() 

 处理按下wdsa就改变它的方向

在窗口类将事件加进去 

此时按下对应的键就可以改变它的方向了 

在Tank类里面增加移动的方法 

在绘制类增加移动 , 此时坦克就可以移动了

可不可以控制坦克移动的速度呢, 关键点就在移动的方法里面加的多少, 我们增加一个speed来控制它的速度 

同时加入speed的get, set

在绘制类初始化坦克的时候就可以直接set它的速度, 此时面向对象的感觉就上来了 

绘制敌人的坦克

新建一个敌人的坦克类, 继承坦克 

在绘制类里面将敌人的坦克放在线程安全的Vector里面, 并初始化三个坦克 

画出敌人的坦克

此时运行效果

更改以下方向默认为0 

坦克大战游戏(1.0版)

新建一个子弹类

增加子弹的属性 

增加一个构造器 

run方法里面相当于射击动作

子弹触碰到面板边界就销毁 

设计一个变量表示子弹是否还存活

 当子弹销毁时, 改变子弹的存活状态

在我们自己的坦克创建射击

​编辑

向右子弹的坐标 

 向下子弹的坐标 

​编辑

 向左子弹的坐标 

启动线程 

回到面板类, 按下j 就调用发射这个子弹 

画出自己坦克射击的子弹

绘制敌人坦克的子弹

​编辑

使用Vector保存多个shot 

​编辑

创建坦克对象时, 初始化一个Shot对象, 并启动

 绘制出子弹, 不存活的需要在集合中移除

我方坦克子弹打中敌人坦克

​编辑

给敌人坦克增加一个存活变量 

​编辑

判断我方子弹是否击中敌人坦克

在不断绘制的run方法里面去判断我方子弹是否碰到敌人坦克

增加一个判断, 否则会空异常

增加判断,在敌人坦克还活着的时候再去画

坦克爆炸

敌方坦克自由移动

 ​编辑

控制敌方坦克范围​编辑

​编辑

控制我方坦克范围

​编辑

实现防止发射一棵子弹时, 还没有消亡可以在打出一颗问题

​编辑如果要发射多颗子弹怎么实现(思考演示)暂时不实行

敌方移动发射 

我方坦克被击中爆炸 

IO流应用到坦克大战

防止坦克重叠的八种情况 

记录玩家总成绩 

为了实现"继续游戏", 保存退出界面坦克的坐标​编辑 ​编辑

恢复保存的坐标

增加坦克大战音乐

修改文件位置 

处理异常提高健壮性​编辑


​​​​​​​坦克大战游戏演示

为什么要写这个项目 

√好玩

√涉及到java各个方面的技术

        1. java面向对象编程

        2.多线程

        3. 文件i/o操作

        4. 数据库

        5. 巩固旧知识,学习新知识

java绘图坐标体系

java绘图技术

快速入门-画一个圆形

// 继承JPanel类 

找到画一个圆形的方法 

 

// 调用这个方法 

// 窗口类继承JFrame, 将面板放入窗口中

 

Graphics的常用方法

// 画直线 

// 画矩形边框 

// 画填充矩形 

// 画填充椭圆

// 获取图片资源 

// 写字 

绘出坦克 

新建一个tankgame包, 新建一个类Tank, 里面包含横坐标和纵坐标

 新建一个Hero, 自己的坦克类, 去继承Tank

新建一个绘图区域类, 继承JPanel 

新建一个窗口类 

-- 设置为了1000 

 运行现在就拥有了一个窗口

在MyPanel里面写一个坦克的封装方法, 将坦克的坐标, 画笔, 方向, 类型传进去, 并根据不同类型坦克设置不同颜色

根据坦克方向, 来绘制坦克 

使用file3DRect方法

 坦克坐标分析图

 将封装的坦克放到绘制类里面去

这一步运行看到已经有一个矩形了 

MyPanel的坦克方法里面继续添加 右边的轮子

 此时运行能看到两个轮子了

 MyPanel的坦克方法里面继续添加

  此时运行能看到

  MyPanel的坦克方法里面继续添加

  此时运行能看到

  MyPanel的坦克方法里面继续添加

  此时运行能看到

更改以下颜色我方为黄色

继续画出向右的坦克

继续画出向下的坦克 

继续画出向左的坦克  

java事件处理机制

具体实现是面板绘制类实现KeyListener接口, 监听键盘事件 

重写监听接口的三个方法 

 

假如在这里实现一些操作 

让窗口可以监听到键盘事件

运行就可以发现方法a里面的操作就打印出来了 

当向下的箭头触发的时候, 就坐标y++ , 然后重绘面板, 就可以实现向下移动了 

 

我们将上下左右都加进去 

Java的事件处理机制系统说明

事件源可以是个窗口, 鼠标, 键, 按钮...

事件对象就是刚才我们用到的KeyEvent 

生活中的例子

 Java的事件处理机制深入理解

 

让坦克动起来

实现keyListener 

重写接口的方法 

处理按下的时候的操作 

因为坦克那里的方向目前是写死的, 要在按下的时候能够改变它的方向, 需要把方向作为成员变量

 

绘制类里面将方向改为hero.getDirect() 

 处理按下wdsa就改变它的方向

在窗口类将事件加进去 

此时按下对应的键就可以改变它的方向了 

在Tank类里面增加移动的方法 

在绘制类增加移动 , 此时坦克就可以移动了

可不可以控制坦克移动的速度呢, 关键点就在移动的方法里面加的多少, 我们增加一个speed来控制它的速度 

同时加入speed的get, set

在绘制类初始化坦克的时候就可以直接set它的速度, 此时面向对象的感觉就上来了 

绘制敌人的坦克

新建一个敌人的坦克类, 继承坦克 

在绘制类里面将敌人的坦克放在线程安全的Vector里面, 并初始化三个坦克 

画出敌人的坦克

此时运行效果

更改以下方向默认为0 

初始化敌人的坦克同时增加一个方向

坦克大战游戏(1.0版)

新建一个子弹类

增加子弹的属性 

增加一个构造器 

run方法里面相当于射击动作

休眠50是为了让子弹不算停留形成轨迹,  通过方向改变字段坐标

子弹触碰到面板边界就销毁 

也就是跳出死循环while

设计一个变量表示子弹是否还存活

 当子弹销毁时, 改变子弹的存活状态

在我们自己的坦克创建射击

子弹要在炮筒的位置, 先找到向上炮筒的位置, 坦克的x+20 , y不变的坐标, 方向还是0

向右子弹的坐标 

 

 向下子弹的坐标 

 向左子弹的坐标 

启动线程 

回到面板类, 按下j 就调用发射这个子弹 

画出自己坦克射击的子弹

实现不停重绘 

绘制敌人坦克的子弹

使用Vector保存多个shot 

创建坦克对象时, 初始化一个Shot对象, 并启动

 绘制出子弹, 不存活的需要在集合中移除

我方坦克子弹打中敌人坦克

给敌人坦克增加一个存活变量 

判断我方子弹是否击中敌人坦克

 

在不断绘制的run方法里面去判断我方子弹是否碰到敌人坦克

增加一个判断, 否则会空异常

增加判断,在敌人坦克还活着的时候再去画

坦克爆炸

写一个炸弹类

定义一个炸弹Vector 

准备三张图片, 用于显示炸弹效果 

初始化三张图片 

一被击中就加一一个炸弹, 这个炸弹是有三张图片组成的 

画出炸弹 

敌人坦克被打掉之后应该在集合中删掉 

敌方坦克自由移动

 

 实现runnable接口

根据方向继续移动

休眠50毫秒, 随机改变方向 

退出线程,因为在被击中的时候isLive被置为false, 也就是非真为真的时候退出线程 

启动线程 

run里面上下左右都实现移动时实现走30步 , 让坦克不是走一步就转向

加入break;

控制敌方坦克范围

控制我方坦克范围


将窗口增加一点, 让绘制区域完全展示出来, 方便查看是否控制住了范围 

tip:绘制区域仍然是1000*750的 

实现防止发射一棵子弹时, 还没有消亡可以在打出一颗问题

首先实现防止发射一棵子弹时, 还没有消亡可以在打出一颗, 在hero为空的时候, 就是第一次按j的时候, 或者isLive为false碰到边界销毁的时候可以触发shotEnemyTank发射行为

如果要发射多颗子弹怎么实现(思考演示)暂时不实行

 

 

要实现控制只能发射5颗怎么控制

是否击中坦克改为判断多颗子弹 

敌方移动发射 

 

我方坦克被击中爆炸 

给坦克增加存活属性

判断我方子弹是否击中敌人坦克的方法改为坦克父类, 即所有坦克 ​​​​​​

编写我方坦克是否被击中方法 

判断我们的子弹是否击中了敌人坦克 移动到hitEnemyTank()下面

 

增加一个判断, 让敌方子弹击中我们的时候, 我方坦克消失

IO流应用到坦克大战

防止坦克重叠的八种情况 

一个坦克不管是那个朝向, 都会可能面对另外一个坦克是上下或者左右移动的, 上下或者左右移动它的长宽会发生变化

 

判断下标为0的这个坦克是否和后面的坦克发生重叠

 

 

一二两种情况

 

三四两种情况

 

五六种情况 

七八种情况 

 

最后, 如果没有进入switch语句, 返回一个false

 Mypanel设置给enemyTank

记录玩家总成绩 

 

 

写一个类用于文件交互

 

 

为了实现"继续游戏", 保存退出界面坦克的坐标
 

 

恢复保存的坐标

 

 

 

case 1 开始新游戏 case 2 是继续上局游戏

 

 

增加坦克大战音乐

//音乐播放类

拷贝音乐文件到src下面

启动播放文件

修改文件位置 

处理异常提高健壮性

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

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

相关文章

01_初识微服务

文章目录 一、微服务概述1.1 什么是微服务1.2 对比微服务架构与单体架构1.3 微服务设计原则1.4 微服务开发框架1.5 简单理解分布式部署与集群部署 二、微服务的核心概念2.1 服务注册与发现2.2 微服调用(通信)2.3 服务网关2.4 服务容错2.5 链路追踪参考链…

CSAPP Lab04——Cache Lab大师手笔,匠心制作

浮沉浪似人潮 哪会没有思念 你我伤心到 讲不出再见 ——讲不出再见 完整代码见:CSAPP/cachelab-handout at main SnowLegend-star/CSAPP (github.com) Part A: Cache Simulator 这个lab描述背大锅,开始我是真有点没看懂题目的描述。特别是“M 20,1”“…

构建大型语言模型(LLM)产品的实战指南

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

基于多尺度相关小波分解的单幅图像去雾和去噪方法(MATLAB)

小波变换具有优美的数学背景和强大的多分辨率分析能力。它集成和发展了短时傅里叶变换的思想并克服了其时间窗口不可变的缺点。小波变换通过使用具有局部感受野和多尺度的基函数。形成了同时具有局部和全局性质的信号表征。与DCT等全局变换相比,小波变换可以防止局部…

Java面试八股之Executors可以创建哪几种类型的线程池

Executors可以创建哪几种类型的线程池 newSingleThreadExecutor: 创建一个单线程的线程池,此线程池确保所有的任务都在同一个线程中按顺序执行。适用于需要保证任务顺序执行,或者在单线程中运行的任务。 newFixedThreadPool: …

每日两题 / 34. 在排序数组中查找元素的第一个和最后一个位置 33. 搜索旋转排序数组(LeetCode热题100)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 根据二分函数&#xff0c;得到>target和<target的两个&#xff0c;分别是答案的l和r class Solution { public:vector<int> searchRange(vector<int>& nums,…

Python | Leetcode Python题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; class Solution:def solve(self, board: List[List[str]]) -> None:if not board:returnn, m len(board), len(board[0])que collections.deque()for i in range(n):if board[i][0] "O":que.append((i, 0))board[i][0] &q…

github有趣项目:Verilog在线仿真( DigitalJS+edaplayground)

DigitalJS https://github.com/tilk/digitaljs这个项目是一个用Javascript实现的数字电路模拟器。 它旨在模拟由硬件设计工具合成的电路 像 Yosys&#xff08;这里是 Github 存储库&#xff09;&#xff0c;它有一个配套项目 yosys2digitaljs&#xff0c;它可以转换 Yosys 将文…

【多视图聚类】COMPLETER:Incomplete Multi-view Clustering via Contrastive Prediction

CVPR 2021 0.摘要 在本文中&#xff0c;我们研究了不完全多视图聚类分析中的两个具有挑战性的问题&#xff0c;即i&#xff09;如何在没有标签的帮助下学习不同视图之间的信息性和一致性表示&#xff0c;以及ii&#xff09;如何从数据中恢复缺失的视图。为此&#xff0c;我们…

英伟达开源新利器NV-Embed向量模型,基于双向注意力的LLM嵌入模型,MTEB 56项任务排名第一

前言 文本嵌入模型能够将文本信息转化为稠密的向量表示&#xff0c;并在信息检索、语义相似度计算、文本分类等众多自然语言处理任务中发挥着关键作用。近年来&#xff0c;基于解码器的大型语言模型 (LLM) 开始在通用文本嵌入任务中超越传统的 BERT 或 T5 嵌入模型&#xff0c…

Centos 7之Hadoop搭建

介绍 Hadoop Distributed File System简称 HDFS&#xff0c;是一个分布式文件系统。HDFS 有着高容错性&#xff08;fault-tolerent&#xff09;的特点&#xff0c;并且设计用来部署在低廉的&#xff08;low-cost&#xff09;硬件上。而且它提供高吞吐量&#xff08;high throu…

三分钟“手撕”队列与习题

代码放开头&#xff0c;方便大家查阅 目录 一、实现代码 二、什么是队列 三、队列常见方法 入队push&#xff08;&#xff09; 出队 四、Queue使用 Java自带的Queue 双端队列 五、习题 循环队列 用队列实现栈 用栈实现队列 一、实现代码 package demo2;publi…

一款小众清新的Typecho主题

源码介绍 DearLicy主题&#xff0c;一款小众化小清新风格的博客主题 主题支持Typecho所支持的所有版本PHP 简约、小众、优雅 源码截图 安装教程 将主题上传至/usr/themes/文件夹下解压后台进行启用访问前台查看效果 源码下载 https://www.qqmu.com/3378.html

一键设置常用纸张和页面边距-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】常用纸张和常用边距 1、一键设定符合中国人常用…

273 基于matlab的改进型节点重构小波包频带能量谱与 PNN(概率神经网络)的联合故障诊断新方法

基于matlab的改进型节点重构小波包频带能量谱与 PNN&#xff08;概率神经网络&#xff09;的联合故障诊断新方法。针对风电机组故障信号的非平稳性以及故障与征兆的非线性映射导致的故障识别困难问题&#xff0c;提出了改进型的节点重构小波包频带能量谱与PNN&#xff08;概率神…

大数据数据治理工具

大数据数据治理-CSDN博客 大数据数据治理工具&#xff1a; 开源工具&#xff1a; Apache Atlas&#xff1a; 一个开源的数据治理和元数据框架&#xff0c;为Hadoop生态系统提供数据分类、管理和安全功能。 Apache Ranger&#xff1a; 一个集中式安全管理框架&#xff0c;用于…

Java Web学习笔记2——Web开发介绍

什么是Web&#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;WWW World Wide Web&#xff09;&#xff0c;能够通过浏览器访问的网站。 1&#xff09;淘宝、京东、唯品会等电商系统&#xff1b; 2&#xff09;CRM、OA、ERP企业管理系统&#xff1…

ubuntu-server(22.04)安装

准备工作 首先我们先从网上获取ubuntu的iso镜像文件 Index of /ubuntu-releases/22.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我们安装这个最小包即可 找到我们ubuntu安装完成后所需要下载安装源的网址&#xff08;常用是阿里云&#xff09; ubuntu安装…

手写节流throttle

节流throttle 应用场景 滚动事件监听scroll&#xff1a;例如监听页面滚动到底部加载更多数据时&#xff0c;使用节流技术减少检查滚动位置的频率&#xff0c;提高性能。鼠标移动事件mousemove&#xff1a;例如实现一个拖拽功能&#xff0c;使用节流技术减少鼠标移动事件的处理…

分布式session共享配置

目录 1、spring-session 1.1 添加依赖 1.2 spring-mvc.xml配置文件 1.3 web.xml 2、tomcat配置session、共享 2.1 Tomcat配置 2.2 Web.xml配置 1、spring-session 官方文档&#xff1a;https://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/ 1.…