欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【Java学习笔记】绘制坦克(坦克大战项目1.0版本)

【Java学习笔记】绘制坦克(坦克大战项目1.0版本)

2025/6/21 10:31:26 来源:https://blog.csdn.net/jackson0607/article/details/148778176  浏览:    关键词:【Java学习笔记】绘制坦克(坦克大战项目1.0版本)

绘制坦克

一、Tank 类的创建

首先创建Tank类,运用封装思想,作为父类,提供相应的属性和方法,让子类继承

public class Tank {// 绘制坦克的起始坐标private int x;private int y;private int direction; // 坦克的方向:0向上、1向右、2向下、3向左public int getDirection() {return direction;}public void setDirection(int direction) {this.direction = direction;}public Tank(int x, int y) {this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}
}

二、绘制我方坦克

首先创建MyTank类,继承父类Tank,调用父类的构造器完成初始化

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

思路分析

1. 坦克的种类

2. 坦克的颜色

3. 绘制模块的拆分

总结:可以先设置画笔的颜色,再绘制坦克的形状,两部分是独立的模块

4. 坦克需要有的参数

6. 关于坦克的绘制方法

可以采用封装思想在一个函数中完成坦克的绘制之后在画板中调用该函数,就可以实现自定义坦克的种类,这样提高了灵活性

7.绘制思路分析

在这里插入图片描述

说明

(1)首先需要绘制出朝向为上和朝向为左的坦克

(2)在此基础上改变炮筒的朝向就就可以完成朝向为下和朝向为右的坦克绘制

源码如下

(1)坦克的绘制函数

// 运用封装思想实现绘制坦克的方法/*** @param x         绘制坦克的起始横坐标* @param y         绘制坦克的起始纵坐标* @param g         画笔参数,调用该类的方法绘制图形* @param direction 绘制坦克的朝向* @param type      坦克的类型:自己的坦克,地方坦克*/
public void drawTank(int x, int y, Graphics g, int direction, int type) {// 判断坦克类型,设置不同的颜色switch (type) {case 0: // 自己的坦克:青色g.setColor(Color.CYAN);break; // 防止穿透现象的发生case 1: // 敌人的坦克:红色g.setColor(Color.red);break;}// 根据坦克方向,绘制坦克switch (direction) {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;case 1: //表示向右g.fill3DRect(x, y, 60, 10, false); //画出坦克上边轮子g.fill3DRect(x, y + 30, 60, 10, false); //画出坦克下边轮子g.fill3DRect(x + 10, y + 10, 40, 20, false); //画出坦克盖子g.fillOval(x + 20, y + 10, 20, 20); //画出圆形盖子g.drawLine(x + 30, y + 20, x + 60, y + 20); //画出炮筒break;case 2: //表示向下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 + 60); //画出炮筒break;case 3: //表示向左g.fill3DRect(x, y, 60, 10, false); //画出坦克上边轮子g.fill3DRect(x, y + 30, 60, 10, false); //画出坦克下边轮子g.fill3DRect(x + 10, y + 10, 40, 20, false); //画出坦克盖子g.fillOval(x + 20, y + 10, 20, 20); //画出圆形盖子g.drawLine(x + 30, y + 20, x, y + 20); //画出炮筒break;}
}

代码分析

分两个步骤绘制

注意:参数根据代码中设定的即可,也可以自定义修改,坦克的绘制的起始坐标点是坦克图形的左上角

(2)在画板中调用该函数

    // 绘制游戏区域背景,在此基础上绘制坦克@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 1000, 750); // 默认是黑色// 调用方法绘制坦克/*diretion(顺时针方向:上下左右)(1)0表示向上的坦克(2)1表示向右的坦克(3)2表示向下的坦克(4)3表示向左的坦克type(1)0表示自己的坦克,颜色是青色(2)1表示敌方的坦克,颜色是黄色*/// 绘制自己的坦克drawTank(myTank.getX(), myTank.getY(), g, myTank.getDirection(), 0);}

代码分析

传入参数

我方坦克的绘制效果图

在这里插入图片描述


三、绘制敌方坦克

思路分析

实现步骤如下

(1)首先创建EnemyTank类,继承父类Tank,调用父类的构造器完成初始化

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

(2)在画板中实现敌方坦克的绘制

public class mypanle extends JPanel {// 定义自己的坦克MyTank myTank = null;// 考虑多线程问题,使用线程安全的 Vector 存放敌人的坦克Vector<EnemyTank> enemyTanks = new Vector<>();int enemyTankSize = 3;// 坦克的初始化public mypanle() {myTank = new MyTank(100, 100); // 绘制坦克的初始位置for (int i = 0; i < enemyTankSize; i++) {EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);enemyTank.setDirection(2); // 初始化方向向下,和自己的坦克对峙enemyTanks.add(enemyTank);}}// 绘制游戏区域背景,在此基础上绘制坦克@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 1000, 750); // 默认是黑色// 调用方法绘制坦克/*diretion(顺时针方向:上下左右)(1)0表示向上的坦克(2)1表示向右的坦克(3)2表示向下的坦克(4)3表示向左的坦克type(1)0表示自己的坦克,颜色是青色(2)1表示敌方的坦克,颜色是黄色*/// 绘制自己的坦克drawTank(myTank.getX(), myTank.getY(), g, myTank.getDirection(), 0);// 绘制敌人的坦克for (int i = 0; i < enemyTanks.size(); i++) {EnemyTank enemyTank = enemyTanks.get(i);drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirection(),1);}}
}

代码分析

1. 做出如下规定

diretion(顺时针方向:上下左右)

type

2. 初始化工作

3. 在 paint 函数中遍历集合,为每一个坦克对象绘制图形和颜色

敌方坦克的绘制效果图

在这里插入图片描述

综上,绘制坦克图形的完整代码如下

package TankGame;import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;// 通过键盘监听接口来实现坦克的移动
public class mypanle extends JPanel implements KeyListener {// 定义自己的坦克MyTank myTank = null;// 考虑多线程问题,使用线程安全的 Vector 存放敌人的坦克Vector<EnemyTank> enemyTanks = new Vector<>();int enemyTankSize = 3;// 坦克的初始化public mypanle() {myTank = new MyTank(100, 100); // 绘制坦克的初始位置for (int i = 0; i < enemyTankSize; i++) {EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);enemyTank.setDirection(2); // 初始化方向向下,和自己的坦克对峙enemyTanks.add(enemyTank);}}// 绘制游戏区域背景,在此基础上绘制坦克@Overridepublic void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 1000, 750); // 默认是黑色// 调用方法绘制坦克/*diretion(顺时针方向:上下左右)(1)0表示向上的坦克(2)1表示向右的坦克(3)2表示向下的坦克(4)3表示向左的坦克type(1)0表示自己的坦克,颜色是青色(2)1表示敌方的坦克,颜色是红色*/// 绘制自己的坦克drawTank(myTank.getX(), myTank.getY(), g, myTank.getDirection(), 0);// 绘制敌人的坦克for (int i = 0; i < enemyTanks.size(); i++) {EnemyTank enemyTank = enemyTanks.get(i);drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirection(),1);}}// 运用封装思想实现绘制坦克的方法/*** @param x         绘制坦克的起始横坐标* @param y         绘制坦克的起始纵坐标* @param g         画笔参数,调用该类的方法绘制图形* @param direction 绘制坦克的朝向* @param type      坦克的类型:自己的坦克,地方坦克*/public void drawTank(int x, int y, Graphics g, int direction, int type) {// 判断坦克类型,设置不同的颜色switch (type) {case 0: // 自己的坦克:青色g.setColor(Color.CYAN);break; // 防止穿透现象的发生case 1: // 敌人的坦克:红色g.setColor(Color.red);break;}// 根据坦克方向,绘制坦克switch (direction) {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;case 1: //表示向右g.fill3DRect(x, y, 60, 10, false); //画出坦克上边轮子g.fill3DRect(x, y + 30, 60, 10, false); //画出坦克下边轮子g.fill3DRect(x + 10, y + 10, 40, 20, false); //画出坦克盖子g.fillOval(x + 20, y + 10, 20, 20); //画出圆形盖子g.drawLine(x + 30, y + 20, x + 60, y + 20); //画出炮筒break;case 2: //表示向下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 + 60); //画出炮筒break;case 3: //表示向左g.fill3DRect(x, y, 60, 10, false); //画出坦克上边轮子g.fill3DRect(x, y + 30, 60, 10, false); //画出坦克下边轮子g.fill3DRect(x + 10, y + 10, 40, 20, false); //画出坦克盖子g.fillOval(x + 20, y + 10, 20, 20); //画出圆形盖子g.drawLine(x + 30, y + 20, x, y + 20); //画出炮筒break;}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词