坦克大战③

news2024/11/23 23:54:36

1.防止敌人坦克重叠运动

  1. 八种情况
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这辆敌方坦克和任何其它敌方坦克都不发生碰撞时且不超边界时才可以移动
    在这里插入图片描述

2.记录玩家成绩

在这里插入图片描述
绘制版面信息
在这里插入图片描述

paint()方法中如果没有super.paint(g),那么绘制的敌方坦克数会出现重叠情况
在这里插入图片描述
调用方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Recorder类中定义一个方法
在这里插入图片描述
write(int c) 指的是一个字符,并不能存入一个int类型的数字
在这里插入图片描述

给JFrame添加监听事件
在这里插入图片描述
在这里插入图片描述

3. 记录敌方坦克坐标和方向

在这里插入图片描述
定义Vector,指向 MyPanel对象的 敌人坦克Vector
在这里插入图片描述
让Recorder中的enemyTanks也指向同一个地址
在这里插入图片描述
修改keepRecorder()方法
在这里插入图片描述

4. 继续上一把游戏

public static Vector<Node> getNodesAndEnemyTankSum() {
        try {
            bufferedReader = new BufferedReader(new FileReader(recordFile));
            allEnemyTankNum = new Integer(bufferedReader.readLine());
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                String[] xyd = line.split(" ");
                Node node = new Node(new Integer(xyd[0]), new Integer(xyd[1]),
                        new Integer(xyd[2]));
                nodes.add(node);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return nodes;
        }
    }

在主类的构造器里,程序还未启动时,加入选项
在这里插入图片描述
在MyPanel类中定义保存Node节点的集合
在这里插入图片描述

将MyPanel构造器变为有参构造器,加入switch分支,1表示新游戏
在这里插入图片描述
2表示继续上一局
在这里插入图片描述

5. 播放音乐

将AePlayWave类资源放入包中,将音乐资源放入src目录下,在MyPanel构造器的最后一行调用即可;
在这里插入图片描述

  • 修正文件存储位置
    在这里插入图片描述

5.1 处理文件相关异常

在这里插入图片描述
或者
在这里插入图片描述

防止敌人坦克重叠代码

public boolean isTouchEnemyTank() {
        //判断当前敌人坦克(this)方向
        switch (this.direct) {
            case 0:////让当前敌人坦克和其它所有的敌人坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从Vector 集合中拿到一个坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较
                    if (enemyTank != this) {
                        //如果敌人坦克是 上/下 方向
                        //思路分析
                        // 1.如果敌人坦克是上/下 x的范围 [enemyTank.x, enemyTank.x + 40]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 60]
                        if (enemyTank.direct == 0 || enemyTank.direct == 2) {
                            // 2.当前坦克 左上角的坐标 [this.x, this.y]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 40
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 60) {
                                return true;
                            }
                            // 3.当前坦克 右上角的坐标 [this.x + 40, this.y]
                            if (this.x + 40 >= enemyTank.x
                                    && this.x + 40 <= enemyTank.x + 40
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 60) {
                                return true;
                            }
                        }
                        //如果敌人坦克是 右/左 方向
                        //思路分析
                        // 1.如果敌人坦克是右/左 x的范围 [enemyTank.x, enemyTank.x + 60]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 40]
                        if (enemyTank.direct == 1 || enemyTank.direct == 3) {
                            // 2.当前坦克 左上角的坐标 [this.x, this.y]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 60
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 40) {
                                return true;
                            }
                            // 3.当前坦克 右上角的坐标 [this.x + 40, this.y]
                            if (this.x + 40 >= enemyTank.x
                                    && this.x + 40 <= enemyTank.x + 60
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:////让当前敌人坦克和其它所有的敌人坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从Vector 集合中拿到一个坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较
                    if (enemyTank != this) {
                        //如果敌人坦克是 上/下 方向
                        //思路分析
                        // 1.如果敌人坦克是上/下 x的范围 [enemyTank.x, enemyTank.x + 40]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 60]
                        if (enemyTank.direct == 0 || enemyTank.direct == 2) {
                            // 2.当前坦克 右上角的坐标 [this.x + 60, this.y]
                            if (this.x + 60 >= enemyTank.x
                                    && this.x + 60 <= enemyTank.x + 40
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 60) {
                                return true;
                            }
                            // 3.当前坦克 右下角的坐标 [this.x + 60, this.y + 40]
                            if (this.x + 60 >= enemyTank.x
                                    && this.x + 60 <= enemyTank.x + 40
                                    && this.y + 40 >= enemyTank.y
                                    && this.y + 40 <= enemyTank.y + 60) {
                                return true;
                            }
                        }
                        //如果敌人坦克是 右/左 方向
                        //思路分析
                        // 1.如果敌人坦克是右/左 x的范围 [enemyTank.x, enemyTank.x + 60]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 40]
                        if (enemyTank.direct == 1 || enemyTank.direct == 3) {
                            // 2.当前坦克 右上角的坐标 [this.x + 60, this.y]
                            if (this.x + 60 >= enemyTank.x
                                    && this.x + 60 <= enemyTank.x + 60
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 40) {
                                return true;
                            }
                            // 3.当前坦克 右下角的坐标 [this.x + 60, this.y + 40]
                            if (this.x + 60 >= enemyTank.x
                                    && this.x + 60 <= enemyTank.x + 60
                                    && this.y + 40 >= enemyTank.y
                                    && this.y + 40 <= enemyTank.y + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:////让当前敌人坦克和其它所有的敌人坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从Vector 集合中拿到一个坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较
                    if (enemyTank != this) {
                        //如果敌人坦克是 上/下 方向
                        //思路分析
                        // 1.如果敌人坦克是上/下 x的范围 [enemyTank.x, enemyTank.x + 40]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 60]
                        if (enemyTank.direct == 0 || enemyTank.direct == 2) {
                            // 2.当前坦克 左下角的坐标 [this.x, this.y + 60]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 40
                                    && this.y + 60 >= enemyTank.y
                                    && this.y + 60 <= enemyTank.y + 60) {
                                return true;
                            }
                            // 3.当前坦克 右下角的坐标 [this.x + 40, this.y + 60]
                            if (this.x + 40 >= enemyTank.x
                                    && this.x + 40 <= enemyTank.x + 40
                                    && this.y + 60 >= enemyTank.y
                                    && this.y + 60 <= enemyTank.y + 60) {
                                return true;
                            }
                        }
                        //如果敌人坦克是 右/左 方向
                        //思路分析
                        // 1.如果敌人坦克是右/左 x的范围 [enemyTank.x, enemyTank.x + 60]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 40]
                        if (enemyTank.direct == 1 || enemyTank.direct == 3) {
                            // 2.当前坦克 左下角的坐标 [this.x, this.y + 60]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 60
                                    && this.y + 60 >= enemyTank.y
                                    && this.y + 60 <= enemyTank.y + 40) {
                                return true;
                            }
                            // 3.当前坦克 右下角的坐标 [this.x + 40, this.y + 60]
                            if (this.x + 40 >= enemyTank.x
                                    && this.x + 40 <= enemyTank.x + 60
                                    && this.y + 60 >= enemyTank.y
                                    && this.y + 60 <= enemyTank.y + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3:////让当前敌人坦克和其它所有的敌人坦克比较
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //从Vector 集合中拿到一个坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较
                    if (enemyTank != this) {
                        //如果敌人坦克是 上/下 方向
                        //思路分析
                        // 1.如果敌人坦克是上/下 x的范围 [enemyTank.x, enemyTank.x + 40]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 60]
                        if (enemyTank.direct == 0 || enemyTank.direct == 2) {
                            // 2.当前坦克 左上角的坐标 [this.x, this.y]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 40
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 60) {
                                return true;
                            }
                            // 3.当前坦克 左下角的坐标 [this.x, this.y + 40]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 40
                                    && this.y + 40 >= enemyTank.y
                                    && this.y + 40 <= enemyTank.y + 60) {
                                return true;
                            }
                        }
                        //如果敌人坦克是 右/左 方向
                        //思路分析
                        // 1.如果敌人坦克是右/左 x的范围 [enemyTank.x, enemyTank.x + 60]
                        //                    y的范围 [enemyTank.y, enemyTank.y + 40]
                        if (enemyTank.direct == 1 || enemyTank.direct == 3) {
                            // 2.当前坦克 左上角的坐标 [this.x, this.y]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 60
                                    && this.y >= enemyTank.y
                                    && this.y <= enemyTank.y + 40) {
                                return true;
                            }
                            // 3.当前坦克 左下角的坐标 [this.x, this.y + 40]
                            if (this.x >= enemyTank.x
                                    && this.x <= enemyTank.x + 60
                                    && this.y + 40 >= enemyTank.y
                                    && this.y + 40 <= enemyTank.y + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
    }

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

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

相关文章

Java 性能诊断工具简介-EJ Technologies JProfiler 12.0.5 中文激活版

目录 JProfiler 这篇文章讲解的比较详细&#xff1a; 可以辅助命令&#xff0c;应用jar的启动命令&#xff1a; 同时在开发工具里面添加一个JProfiler插件 JProfiler 这篇文章讲解的比较详细&#xff1a; JVM性能分析工具 Jprofiler - 百里浅暮 - 博客园 我在这里记录下。…

MATLB|电动汽车充放电的最优调度

目录 一、概述 二、电动汽车 2.1 电动汽车的类型 2.2电动汽车行程开始时间 2.3 电动汽车行驶里程 三、Matlab实现 3.1 代码前的准备 3.2 运行结果 四、往期回顾 五、Matlab代码实现 一、概述 电动汽车能够良好发展离不开精确的电动汽车充电负荷预测,目前,大多数充电负…

2022全年度烘干机十大热门品牌销量榜单

在“宅经济”时代&#xff0c;人们对大家电的需求持续高速增长。在当前的大环境下&#xff0c;人们的健康意识在不断提高&#xff0c;拥有除菌防菌功能的烘干机也更受欢迎。因此&#xff0c;烘干机作为快速进入普及阶段的家电新品&#xff0c;市场增长空间非常大。 根据鲸参谋数…

RCE绕过靶场练习

目录 CTF-01 CTF-02 CTF-03 CTF-04 CTF-05 CTF-01 测试回显 Array ([0] > PING 127.0.0.1 (127.0.0.1): 56 data bytes[1] > 64 bytes from 127.0.0.1: seq0 ttl42 time0.028 ms[2] > 64 bytes from 127.0.0.1: seq1 ttl42 time0.059 ms[3] > 64 bytes from …

Javascript 面向对象的缺陷,父类能调用被子类重写后的方法

问题背景 前些天做项目练手时&#xff0c;遇到一个需要写类的场景&#xff0c;各个类之间的交互我打算用事件的方式进行&#xff0c;就自然地在父类继承了EventEmitter类。然后在父类对一个具体事件注册了一个默认监听&#xff0c;子类通过注册自己专有的监听细化逻辑。代码逻…

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决

win7关闭驱动签名&#xff0c;进入驱动测试模式win7、win10关闭驱动签名、进入驱动测试模式DebugView工具运行提示"Dbgv.sys: 拒绝访问"驱动项目配置属性常用设置驱动中KdPrint打印UNICODE_STRING字符串常用方法没使用的变量在编译时报警告&#xff1a;未引用的形参错…

文字转语音真人发声软件哪个好?这些实用软件快来收好

平时大家结束了一天的工作&#xff0c;会不会在空闲时间好好放松一下呢&#xff1f;如果是坐公交车或者地铁的小伙伴&#xff0c;想要在下班途中看一些电子书籍或者新闻&#xff0c;却因为下班高峰期人潮拥挤&#xff0c;导致无法腾出手来阅读&#xff0c;这时候你们会怎么解决…

红队基础知识

文章目录红队前置准备网络攻击链工程和操作攻击性思维渗透测试漏洞研究软件开发基础设施网络和系统逆向工程社会工程学物理安全威胁情报安全事件的检测和响应技术写作培训与汇报总结红队前置准备 红队通常指在对抗情况下需要仿真、模拟或以其他方式扮演某个、某组入侵者或理论…

【Docker】(一)基本概念与安装使用

1.概述 最近学习了Docker的使用&#xff0c;想通过一个系列的笔记来记录学习的过程与收获&#xff0c;并为以后的生产工作提供指导。 我一直认为学习一门技术时&#xff0c;需要先了解这门技术的基本概念&#xff0c;了解它能解决的问题&#xff0c;这样才能定位明确的学习目标…

frp内网穿透https

在公网服务器搭建frps(service)&#xff0c;在内网本地机子搭建frpc(client)&#xff0c;流量通过访问公网ip&#xff0c;经过frps服务端转发到fprc客户端&#xff0c;fprc再转发到本地web应用。 官方下载地址​ https://github.com/fatedier/frp/releases 官方文档地址https…

智能门锁“激战正酣”

近年来&#xff0c;智能化已经成为了高频词&#xff0c;越来越多的行业都在朝着智能化方向发展&#xff0c;家居行业也不例外。受技术升级、居民收入水平提高等多重因素影响&#xff0c;整个智能家居行业呈现出了蓬勃发展态势。据亿欧智库预测&#xff0c;2025年中国智能家居市…

客运车票网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 题目&#xff1a;基于Wb的公路客运车票信息管理系统设计与实现 时了解客运站动态。 角色&#xff1a;乘客、管理员 (2)车…

[附源码]Node.js计算机毕业设计-高校人事管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

C++设计模式的个人理解 繁琐的底层需要合理设计

一、为什么会有设计模式 由于每个人自身的能力、所在的层次、看问题的角度都不同&#xff0c;仅凭直觉“对现实建模”&#xff0c;很有可能会生成一些大小不均、职责不清、关系混乱的对象&#xff0c;最后搭建出一个虽然可以运行&#xff0c;但却难以理解、难以维护的系统。为此…

基于Java+Mysql实现酒店预订系统【100010045】

酒店预订系统 1.引言 1.1编制目的 1.详细完成对酒店预订系统的概要设计&#xff0c; 2.达到指导详细设计和开发的目的&#xff0c; 3.同时实现和测试人员及用户的沟通。 3.本报告面向开发人员&#xff0c;测试人员及最终用户的编写额&#xff0c;是了解系统的导航。 1.2…

Flink基本转换算子

文章目录1.映射&#xff08;map&#xff09;2.过滤&#xff08;filter&#xff09;3.扁平映射&#xff08;flatMap&#xff09;4.按键分区&#xff08;keyBy&#xff09;5. 简单聚合&#xff08;sum&#xff0c;min&#xff0c;max等&#xff09;6.归约聚合&#xff08;reduce&…

m基于LDPC+QPSK通信链路误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 LDPC ( Low-density Parity-check&#xff0c;低密度奇偶校验&#xff09;码是由 Gallager 在1963 年提出的一类具有稀疏校验矩阵的线性分组码 (linear block codes)&#xff0c;然而在接下来的 …

第五届“强网”拟态防御国际精英挑战赛在南京举行——开辟网络安全新赛道 引领网络弹性新优势

12月15日&#xff0c;第五届“强网”拟态防御国际精英挑战赛在南京紫金山实验室隆重开幕&#xff0c;来自国内外60支顶尖战队将通过云上和线下相结合的方式展开72小时的高强度对抗。大赛组委会主席、紫金山实验室首席科学家、中国工程院邬江兴院士指出&#xff0c;本届挑战赛瞄…

jvm内存模型+类加载机制+垃圾手机器

1、类加载器分类 1、引导类加载器&#xff0c;负责加载支撑Jre/lib目录下的核心类库 2、扩展类加载器&#xff1a;负责加载Jre/lib目录下的ext扩展类jar包 3、应用程序类加载器&#xff1a;负责加载classpath下的类包 4、自定义类加载器&#xff1a;负责加载用户自定义路径下的…

值得思索的:ArrayList和线性表,你确定错过这次机会

线性表&#xff1a; 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…