Java高效率复习-坦克大战[Java基础合集]

news2025/5/10 17:11:56

目录

在这里插入图片描述

前言

该文章会从零开始制作一个坦克大战的游戏,该游戏使用Java的AWT和Swing作为窗体和容器,使用面向对象、线程等技术来丰富游戏,本文章相等于Java前期和中期技术的一个合集(对于IO、网络、反射并没有涉及到)。

Java绘图技术快速入门

java绘图坐标体系

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

在窗体上绘制一个小点

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

//演示如何在面板上画圆
@SuppressWarnings({"all"})
public class DrawCircle extends JFrame{
    //定义一个面板
    private MyPanel mp = null;
    public DrawCircle(){
        //初始化面板
        mp = new MyPanel();
        //把面板放入到窗口
        this.add(mp);
        //设置窗口的大小
        this.setSize(400,300);
        this.setVisible(true);//可视化设计
    }

    public static void main(String[] args) {
        new DrawCircle();
    }
}
//先定义一个MyPanel,继承JPanel类,画图形,就在面板上面
class MyPanel extends JPanel{
    //MyPanel -> 该对象就是现实中一个画板
    //Graphics g -> 把g理解为一只画笔
    //Graphics提供了很多绘图的方法
    @Override
    public void paint(Graphics g) {//绘图方法重写
        super.paint(g);//使用父类的paint(g)方法完成初始化
        //画出一个圆形
        g.drawOval(10,10,100,100);

    }
}

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

绘图方法

在这里插入图片描述

@Override
public void paint(Graphics g) {//绘图方法重写
    super.paint(g);//使用父类的paint(g)方法完成初始化
    //演示绘制不同的图形...
    //1.画直线 drawLine(int x1,int y1,int x2,int y2)
    //g.drawLine(10,10,100,100);//x1和y1是直线的起点 x2和y2是直线的终点
    //2.画矩形边框 drawRect(int x,int y,int width,int height)
    //g.drawRect(10,10,100,100);//x和y是左上角坐标点,width和height是宽度和高度
    //3.画椭圆边框 drawOval(int x,int y,int width,int height)
    //g.drawOval(10,10,100,100);
    //4.画填充矩形 fillRect(int x,int y,int width,int height)
    //设置画笔的颜色
    //g.setColor(Color.orange);
    //g.fillRect(10,10,100,100);
    //5.填充椭圆 fillOval(int x,int y,int width,int height)
    //g.setColor(Color.red);
    //g.fillOval(10,10,100,100);//宽和高如果一样,则是圆形,否则是椭圆
    //6.画图片 drawImage(Image img,int x,int y,...)
    //1.获取图片资源
    //Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.jpg"));
    //g.drawImage(image,0,0,400,300,this);
    //7.画字符串 drawString(String str,int x,int y)
    //给画笔设置颜色
    //g.setColor(Color.blue);
    //g.drawString("凯迪拉克",150,150);
    //8.设置笔画的字体 setFont(Font font)
    //g.setFont(new Font("微软雅黑",Font.BOLD,50));
    //g.setColor(Color.RED);
    //g.drawString("凯迪拉克",150,150);
    //9.设置笔画的颜色 setColor(Color c)
    //g.setColor(Color.blue);
    //g.drawString("凯迪拉克",150,150);
}

绘制坦克

坦克抽象父类

public class Tank {
    private int x;//坦克的横坐标
    private int y;//坦克的纵坐标
	...//省略了set和get方法
}

坦克实现类

public class Hero extends Tank{
    public Hero(int x, int y) {
        super(x, y);
    }
}

绘画板

public class MyPanel extends JPanel {
    //定义我的坦克
    Hero hero =null;
    public MyPanel(){
        hero = new Hero(100,100);//初始化一个坦克
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形,默认黑色 该矩形是背景
        //画出坦克-封装方法
        drawTank(hero.getX(),hero.getY(),g,0,0);//调用方法来挥之坦克
    }
    //编写方法画出坦克

    /**
     *
     * @param x 坦克的左上角x坐标
     * @param y 坦克的左上角y坐标
     * @param g 画笔
     * @param direct 坦克方向(上下左右)
     * @param type 坦克类型
     */
    public void drawTank(int x,int y,Graphics g,int direct,int type){
        //根据不同类型的坦克设置不同的颜色
        switch (type){
            case 0: //我们的坦克
                g.setColor(Color.white);
                break;
            case 1: //敌人坦克
                g.setColor(Color.yellow);
                break;
        }
        //根据坦克的方向,来绘制坦克
        switch(direct){
            case 0:
                g.fill3DRect(x,y,10,60,false);//画出坦克左边轮子
                g.fill3DRect(x+30,y,10,60,false);//画出坦克右边轮子
                g.fill3DRect(x+10,y+10,20,40,false);//画出坦克中间组件
                g.fillOval(x+10,y+20,20,20);
                g.drawLine(x+20,y+30,x+20,y);
                break;
            default:
                System.out.println("暂时没有处理...");
        }
    }
}

main方法

//定义MyPanel
MyPanel mp = null;
public HspTankGame01(){
    mp = new MyPanel();
    this.add(mp);//添加面板 -> 游戏的绘图区域
    this.setSize(1000,750);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
}
public static void main(String[] args) {
    HspTankGame01 hspTankGame01 = new HspTankGame01();
}

事件处理机制

我们如果想要增加坦克的攻击功能,则需要先学习一下事件处理机制,比如键盘监听等功能。
我们通过让面板实现KeyListener接口,通过重写该接口的三个方法来完成事件处理,该接口有如下三个方法。
在这里插入图片描述
我们本次通过小球移动的案例来进行学习,此处我们只重写了keyPressed方法——按键按下监听,其他方法没有实现(空实现语法)。
如下是小球实例的代码。

public class eventTest extends JFrame{
    MyPanel mp = null;//创建面板成员变量
    public eventTest(){
        mp = new MyPanel();//初始化该面板
        this.add(mp);//添加面板
        this.setSize(400,300);//设置大小
        //窗口JFrame对象可以监听键盘事件,即可以监听到面板上 mp是KeyListener的实现类,可以传入
        this.addKeyListener(mp);//添加KeyListener接口实现对象
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭方式
        this.setVisible(true);//设置为可见
    }
    public static void main(String[] args) {
        eventTest test = new eventTest();//创建对象,触发构造器,初始化窗口
    }
}
//画板
//KeyListener是监听器,可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
    //为了让小球可以移动,把它的左上角的坐标设置成变量
    int x = 10;//该变量代表小球的x 也就是左右
    int y = 10;//该变量代表小球的y 也就是上下
    @Override
    public void paint(Graphics g) {//g对象相当于是我们面板中的画笔
        super.paint(g);//调用父类方法来初始化画笔g
        g.fillOval(x,y,20,20);//绘制一个宽20,长20的小球,位置取决于x和y变量
    }
    //监听字符输入
    @Override
    public void keyTyped(KeyEvent e) {
        //空实现
    }
    //监听按键触发
    @Override
    public void keyPressed(KeyEvent e) {
        //System.out.println("该键被按下:"+(char)e.getKeyCode());
        //根据用户按下不同键,来处理小球的移动
        //在Java中,会给每一个键分配一个值
        if(e.getKeyCode()==KeyEvent.VK_S){// VK_DOWN -> 下键
            y++;//下键 = 小球向下
        }else if(e.getKeyCode()== KeyEvent.VK_W){
            y--;//上键 = 小球向上
        }else if(e.getKeyCode()== KeyEvent.VK_A){
            x--;//左键 = 小球向左
        }else if(e.getKeyCode()== KeyEvent.VK_D){
            x++;//又键 = 小球向右
        }
        //面板重绘
        this.repaint();
    }
    //监听按键释放
    @Override
    public void keyReleased(KeyEvent e) {
        //空实现
    }
}

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

绘制坦克的上下左右

在这里插入图片描述
向上(初始默认)
在这里插入图片描述

向右
在这里插入图片描述
向下(让向上的炮筒改变即可)
在这里插入图片描述
变化就是让第三个参数的y增加了60。
向左(在向右的基础上修改炮筒)
在这里插入图片描述

坦克方向改变

为了监听键盘事件,实现KeyList。
在这里插入图片描述

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

坦克移动

在这里插入图片描述
坦克移速优化
在这里插入图片描述
在这里插入图片描述

绘制敌人坦克

创建敌人坦克类
该类也继承了TanK

在这里插入图片描述
坦克的创建和添加
因为敌人坦克是在MyPanel面板上的,所以代码也应该写到MyPanel上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

高级Spring之Bean 生命周期

老样子,话不多说,直接上代码: 准备容器: SpringBootApplication public class A03 {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03.class, args);context.close(…

【价格型需求响应】基于Logistic函数的负荷转移率模型需求响应研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

前端学习——CSS

文章目录1.CSS1.1什么是CSS1.2快速入门1.3.三种CSS导入方式2.选择器2.1基本选择器2.1.1标签选择器2.1.2类选择器2.1.3id选择器2.2层次选择器2.2.1后代选择器2.2.2子选择器2.2.3相邻兄弟选择器2.2.4通用选择器2.3结构伪类选择器2.4属性选择器3.美化网页元素3.1span标签3.2字体样…

swagger测试Restful API

swagger出现背景 我们构建Restful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端,不同端由不同的团队或者小组负责,为了减少与其他团队平时开发…

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标注意:NI将在NI2020软件版本中删除对cRIO的Pharlap和NI2022软件版本中对PXI的支持。更多信息,请参阅PharLapRTOSEOL路线图。您可能已经拥有一台台式PC,可以作为下一个可靠的确定性测试或控制系统…

初识 Express(基于 NodeJS http 模块封装的 Web 框架)

初识 Express(基于 NodeJS http 模块封装的 Web 框架)参考描述Express获取nodemon获取使用使用创建一个基本的服务器基本路由对客户端的 GET 请求进行响应获取通过 GET 方式提交的 URL 参数静态 URL 参数动态 URL 参数静态资源托管服务器public前缀参考 …

steam搬砖,蓝海信息差副业项目

今天就给大家分享下这个steam搬砖项目的玩法,看完你收藏执行,学不会你可以随便骂我!! 首先我们讲一下项目原理: 我们需要利用国外steam平台来赚取差价,简单点就是在游戏里面搬砖购买一些道具,然…

零基础学Python(全彩版)

ISBN: 978-7-5692-2225-8 编著:明日科技 页数:448页 阅读时间:2022-08-14 推荐指数:★★★★★ 一本非常适合入门的Python 3编程教程书籍, 不仅有视频教程还有很多的代码示例, 让你在一步步学习中掌握Pytho…

力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——645. 错误的集合、657. 机器人能否返回…

【vue2】对路由的理解

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:vue路由概念、路由写法、路由模式、路由重定向、路由跳转传参方式 目录 一、vue路由概念…

Tkinter的Checkbutton控件

Tkinter的Checkbutton是一个有着许多选项的控件,可以一次选择几个选项 使用方法 var1tk.IntVar() var2tk.IntVar() def printf():if (var1.get()1)&(var2.get()0):L.config(text1)elif (var1.get()0)&(var2.get()1):L.config(text2)elif (var1.get()0)&am…

【docker实践遗留问题】解决个人制作镜像在 dockerhub 上拉取缓慢的问题

目录背景正文1. 创建阿里云docker仓库2. 修改本地 pom 文件尾声背景 通过不断实践,发现了一个问题:dockerHub服务器在国外,虽然拉取一些常用依赖时,可以通过更改镜像源的方式来解决,但倘若是自己制作的docker镜像&…

Python3 条件控制

Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。 IF-ELSE判断 常用的if-else语句,通常用于二分支结构的条件语句代码。 Python 中用 elif 代替了else if,所以if语句的关键字为&#xff1a…

【机器学习】(西瓜书习题8.5)编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。

(1)问题理解与分析 编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。 (2)Bagging算法原理阐述 若想得到泛化性能强的集成&#xf…

6、算术运算符与算术表达式

目录 一、算术运算符 二、算术表达式 三、优先级与结合性 1. 算术运算符的优先级 2. 算术运算符的结合性 四、自增/自减运算符 一、算术运算符 算术运算符包括两个单目运算符(正和负)和5个双目运算符(即乘法、除法、取模、…

ARP渗透与攻防(六)之限制网速攻击

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP限制网速攻击 大家没想到吧,ARP还能限制对方网速。当kali欺骗了网关和受…

Linux-Ubuntu入门到精通之常用终端指令之操作文件目录和文件内容(2)

常用的终端命令 ctrl shift 放大终端窗口的字体显示 ctrl - 缩小终端窗口的字体显示 按 上/下 光标键可以在曾经使用过的命令之间来回切换 如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl c . ls 常用选项(白色…

DFS(四)39. 组合总和 1079. 活字印刷

39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

flowable定时任务和表单

流程定义定时激活 : act_re_procdef 的 suspension_status ClassPathResource classPathResource new ClassPathResource("hehe/HistoryDemo01.bpmn20.xml");repositoryService.createDeployment().addInputStream(classPathResource.getFilename(),clas…

【HBase入门】3. HBase数据模型

简介 在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。 { “zzzzz” : “woot”, “xyz” : “hello”, “aaaab” : “world”, “1” : “x”, “aaaaa” : “y” } 术语 表…