Java面向对象之坦克大战游戏

1、坦克大战游戏

1.1、游戏演示

在这里插入图片描述

1.2、项目目的

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

1.3、java 绘图坐标体系
1.3.1、坐标体系-定义

在这里插入图片描述

1.3.2、坐标体系-像素

在这里插入图片描述

1.3.3、代码实现

在这里插入图片描述

package draw_;

import javax.swing.*;
import java.awt.*;

public class DrawCircle extends JFrame {  // JFrame 对应窗口, 可以理解成是一个画框

    // 定义一个面板
    private MyPanel mp = null;

    public static void main(String[] args) {
        new DrawCircle();
        System.out.println("退出程序");
    }

    public DrawCircle() {  // 构造器
        // 初始化面板
        mp = new MyPanel();
        // 把面板放入到窗口(画框)
        this.add(mp);
        // 设置窗口的大小
        this.setSize(400, 300);
        // 当点击窗口的小×, 程序完全退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);  // 可以显示
    }
}

// 先定义一个 MyPanel, 继承 JPanel 类, 画图形, 就在面板上
class MyPanel extends JPanel {
    // 说明:
    // 1. MyPanel 对象就是一个画板
    // 2. Graphics g 把 g 理解成一支画笔
    // 3. Graphics 提供了很多绘图的方法

    @Override
    public void paint(Graphics g) {  // 绘图方法
        super.paint(g);  // 调用父类的方法完成初始化
        System.out.println("paint 方法被调用了");

        // 画出一个圆形
        g.drawOval(10, 10, 100, 100);

        // 绘制不同的图形
        // 画直线 drawLine(int x1,int y1,int x2,int y2)
        g.drawLine(10, 10, 100, 100);

        // 画矩形边框 drawRect(int x, int y, int width, int height)
        g.drawRect(10, 10, 100, 100);

        // 画椭圆边框 drawOval(int x, int y, int width, int height)
        // 填充矩形 fillRect(int x, int y, int width, int height)
        // 设置画笔的颜色
        g.setColor(Color.blue);
        g.fillRect(10, 10, 100, 100);

        // 填充椭圆 fillOval(int x, int y, int width, int height)
        g.setColor(Color.red);
        g.fillOval(10, 10, 100, 100);

        // 画图片 drawImage(Image img, int x, int y, ..)
        // 获取图片资源, /bg.png 表示在该项目的根目录去获取 bg.png 图片资源
        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
        g.drawImage(image, 10, 10, 175, 221, this);

        // 画字符串 drawString(String str, int x, int y)  // 写字
        // 给画笔设置颜色和字体
        g.setColor(Color.red);
        g.setFont(new Font("隶书", Font.BOLD, 50));
        // 这里设置的 100, 100, 是 "北京你好"左下角
        g.drawString("北京你好", 100, 100);
        // 设置画笔的字体 setFont(Font font)
        // 设置画笔的颜色 setColor(Color c)
    }
}
1.3.4、绘图原理

在这里插入图片描述

1.3.5、Graphics 类

在这里插入图片描述

package draw_;

import javax.swing.*;
import java.awt.*;

public class DrawCircle extends JFrame {  // JFrame 对应窗口, 可以理解成是一个画框

    // 定义一个面板
    private MyPanel mp = null;

    public static void main(String[] args) {
        new DrawCircle();
        System.out.println("退出程序");
    }

    public DrawCircle() {  // 构造器
        // 初始化面板
        mp = new MyPanel();
        // 把面板放入到窗口(画框)
        this.add(mp);
        // 设置窗口的大小
        this.setSize(400, 300);
        // 当点击窗口的小×, 程序完全退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);  // 可以显示
    }
}

// 1.先定义一个 MyPanel, 继承 JPanel 类, 画图形, 就在面板上
class MyPanel extends JPanel {
    // 说明:
    // 1. MyPanel 对象就是一个画板
    // 2. Graphics g 把 g 理解成一支画笔
    // 3. Graphics 提供了很多绘图的方法

    @Override
    public void paint(Graphics g) {  // 绘图方法
        super.paint(g);  // 调用父类的方法完成初始化
        System.out.println("paint 方法被调用了");

        // 画出一个圆形
        g.drawOval(10, 10, 100, 100);

        // 绘制不同的图形
        // 画直线 drawLine(int x1,int y1,int x2,int y2)
        g.drawLine(10, 10, 100, 100);

        // 画矩形边框 drawRect(int x, int y, int width, int height)
        g.drawRect(10, 10, 100, 100);

        // 画椭圆边框 drawOval(int x, int y, int width, int height)
        // 填充矩形 fillRect(int x, int y, int width, int height)
        // 设置画笔的颜色
        g.setColor(Color.blue);
        g.fillRect(10, 10, 100, 100);

        // 填充椭圆 fillOval(int x, int y, int width, int height)
        g.setColor(Color.red);
        g.fillOval(10, 10, 100, 100);

        // 画图片 drawImage(Image img, int x, int y, ..)
        // 获取图片资源, /bg.png 表示在该项目的根目录去获取 bg.png 图片资源
        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
        g.drawImage(image, 10, 10, 175, 221, this);

        // 画字符串 drawString(String str, int x, int y)  // 写字
        // 给画笔设置颜色和字体
        g.setColor(Color.red);
        g.setFont(new Font("隶书", Font.BOLD, 50));
        // 这里设置的 100, 100, 是 "北京你好"左下角
        g.drawString("北京你好", 100, 100);
        // 设置画笔的字体 setFont(Font font)
        // 设置画笔的颜色 setColor(Color c)
    }
}
1.4、绘出坦克

在这里插入图片描述
在这里插入图片描述
TankGame01.java

package tankgame;

import javax.swing.*;

public class TankGame01 extends JFrame {
    // 定义 MyPanel
    MyPanel mp = null;

    public static void main(String[] args) {
        TankGame01 tankGame01 = new TankGame01();
    }

    public TankGame01() {
        mp = new MyPanel();
        this.add(mp);  // 把面板(就是游戏的绘图区域)
        this.setSize(1000, 750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

MyPanel.java

package tankgame;

import javax.swing.*;
import java.awt.*;

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.cyan);
                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("暂时没有处理");
        }
    }
}

Tank.java

package tankgame;

public class Tank {
    private int x;  // 坦克的横坐标
    private int y;  // 坦克的纵坐标

    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;
    }
}

Hero.java

package tankgame;

/**
 * 自己的坦克
 */
public class Hero extends Tank {
    public Hero(int x, int y) {
        super(x, y);
    }
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
坦克大战是一款经典的游戏,下面是一个使用Java编写的简单的坦克大战游戏的示例。 首先,你需要创建一个Tank类来表示坦克,这个类应该包含坦克的位置、方向、速度等信息,以及坦克的移动、射击等方法。 ```java public class Tank { private int x; // 坦克的横坐标 private int y; // 坦克的纵坐标 private int direction; // 坦克的方向(0:上,1:下,2:左,3:右) private int speed; // 坦克的速度 public Tank(int x, int y, int direction, int speed) { this.x = x; this.y = y; this.direction = direction; this.speed = speed; } public void moveUp() { y -= speed; } public void moveDown() { y += speed; } public void moveLeft() { x -= speed; } public void moveRight() { x += speed; } public void fire() { // 射击的逻辑代码 } // 其他方法 } ``` 然后,你需要创建一个Game类来控制游戏的逻辑,包括创建坦克、敌人、地图等元素,并实现游戏的循环逻辑。 ```java public class Game { private Tank playerTank; // 玩家坦克 private List<Tank> enemyTanks; // 敌人坦克列表 private int[][] map; // 地图 private boolean gameOver; // 游戏是否结束 public Game() { // 初始化地图、玩家坦克、敌人坦克等 } public void run() { while (!gameOver) { // 处理用户输入 // 移动玩家坦克 // 移动敌人坦克 // 判断是否有坦克死亡等逻辑 // 绘制游戏界面 } } // 其他方法 } ``` 最后,你可以在游戏主方法中创建一个Game对象并运行游戏。 ```java public static void main(String[] args) { Game game = new Game(); game.run(); } ``` 以上是一个简单的坦克大战游戏的示例,你可以根据自己的需求和想象进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值