坦克大战--Java实现(附源码)

整个项目,完全使用JAVA语言,从零开始,从游戏框架设计到游戏渲染,融合了Java语言的主要技术要点,对于初学者,有很大的帮助作用,作为初学者的快速提升项目恰到好处。

目录

效果展示

项目架构

功能阐述

关键代码

源码获取


效果展示

注:红色的是自己,使用方向键来控制移动,ctrl键控制发出炮弹! 

项目架构

         本程序是一个简单的坦克游戏程序,用java语言编写,在jdk 环境下运行。游戏开始时,用户通过键盘操纵坦克移动,转弯和射击,与敌人坦克进行交战,直到消灭所有敌人就可以过关。本程序包括7个类,近千行代码,和一张背景图片,背景音乐构成。

背景音乐获取地址:https://music.y444.cn/#/

随心所欲下载所有歌曲,可以更换为自己喜欢的背景音乐

功能阐述

1、通过键盘控制我方坦克移动,及发射子弹

2、敌方英雄随机移动及发射子弹

3、使用对象池存储敌方英雄

4、碰撞检测

5、敌方英雄被我方子弹打中检测,我方英雄被敌方子弹打中检测,我方英雄与敌方英雄碰撞检测,子弹打中碰撞块的检测并移除碰撞块,子弹打中子弹碰撞检测,我方与道具碰撞检测

6、随机敌方生成

7、道具生成

8、多条生命控制

9、爆炸动画、移动动画、玩家初始化动画、敌方特殊敌机动画

10、控制控制不同的敌方类型、子弹的级别、道具类型来实现对不同敌机的操作

此程序运行背景音乐即刻播放,战争的快感一触即发!

关键代码

Tankclient

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImageOp;
import java.io.File;
import java.nio.channels.FileLock;
import java.util.List;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.filechooser.FileView;

public class Tankclient extends Frame {
    public static final int GAME_WIDTH = 800;//定义新的常量
    public static final int GAME_HEIGHT = 600;

    Tank myTank = new Tank(50, 50, true, Tank.Direction.STOP, this);//定义Tank
    Wall w1 = new Wall(100, 200, 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);

    List<Explode> explodes = new ArrayList<Explode>();
    List<Missile> missiles = new ArrayList<Missile>();//利用容器加多发子弹
    List<Tank> tanks = new ArrayList<Tank>();

    Image offScreenImage = null;//定义屏幕背后背景图片
    Blood b = new Blood();
    private File file;


    public void paint(Graphics g) { //重写paint方法
        Object bg = null;

        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image image = toolkit.getImage("data\\bg.jpeg");
        g.drawImage(image, 0, 0, null);//背景图片
        g.drawString("missiles count:" + missiles.size(), 10, 50);
        g.drawString("explodes count:" + explodes.size(), 10, 70);
        g.drawString("tanks count:" + tanks.size(), 10, 90);
        g.drawString("tanks life:" + myTank.getLife(), 10, 110);


        if (tanks.size() <= 0) {
            for (int i = 0; i < 5; i++) {
                tanks.add(new Tank(50 + 40 * (i + 1), 50, false, Tank.Direction.D, this));
            }

        }
        for (int i = 0; i < missiles.size(); i++) {
            Missile m = missiles.get(i);
            m.hitTanks(tanks);
            m.hitTank(myTank);
            m.hitWall(w1);
            m.hitWall(w2);
            m.draw(g);
            //if(!m.isLive()) missiles.remove(m);//出界后去除这个子弹
            //else m.draw(g);
        }
        for (int i = 0; i < explodes.size(); i++) {
            Explode e = explodes.get(i);
            e.draw(g);
        }
        for (int i = 0; i < tanks.size(); i++) {
            Tank t = tanks.get(i);
            t.collidesWithWall(w1);
            t.collidesWithWall(w2);
            t.collidesWithTanks(tanks);
            t.draw(g);
        }

        myTank.draw(g);
        myTank.eat(b);
        w1.draw(g);
        w2.draw(g);
        b.draw(g);

    }

    public void update(Graphics g) {//调用update方法
        if (offScreenImage == null) {
            offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);//创建creatImage
        }
        Graphics gOffScreen = offScreenImage.getGraphics();
        Color c = gOffScreen.getColor();
        gOffScreen.setColor(Color.GREEN);//新的颜色
        gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);//用背景颜色画一个方块
        gOffScreen.setColor(c);//设回原来的颜色
        paint(gOffScreen);//调用paint方法
        g.drawImage(offScreenImage, 0, 0, null);//图片一次性画到前面


    }

    public void lauchFrame() {
        for (int i = 0; i < 10; i++) {
            tanks.add(new Tank(50 + 40 * (i + 1), 50, false, Tank.Direction.D, this));
        }
        this.setLocation(400, 300);//左上角点出现的位置
        this.setSize(GAME_WIDTH, GAME_HEIGHT);//宽800高600
        this.setTitle("TankWar");//设置标题
        this.addWindowListener(new WindowAdapter() {    //匿名类监听类

            public void windowClosing(WindowEvent e) {    //重写父类
                System.exit(0);   //正常退出
            }
        });
        this.setResizable(false);//不改变窗口大小
        this.setBackground(Color.GREEN);//设置背景色

        this.addKeyListener(new KeyMonitor());//键盘监听器
        setVisible(true);

        new Thread(new PaintThread()).start();//启动线程

        new Thread(new Runnable() {
            @Override
            public void run() {
                new Music().playmusic();
            }
        }).start();
    }


    public static void main(String[] args) {
        Tankclient tc = new Tankclient();
        tc.lauchFrame();
    }

    private class PaintThread implements Runnable {   //内部类

        public void run() {
            while (true) {//不停顿循环
                repaint();//调用外部包装类
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private class KeyMonitor extends KeyAdapter {     //键盘监听器类 键盘按下键

        public void keyReleased(KeyEvent e) {   //键盘抬起来的键
            myTank.keyReleased(e);
        }

        public void keyPressed(KeyEvent e) {
            myTank.keyPressed(e);
        }
    }
}

Music

import javax.sound.sampled.*;
import java.applet.*;
import javax.swing.JFrame;
import java.io.File;
import java.net.URL;
import java.net.URI;


public class Music extends JFrame { // 此处Music类继承GameWindow
    File f;
    URL url;
    URI uri;

    Music() {
        try {
            f = new File("data\\坦克大战-战斗5.wav");
            uri = f.toURI();
            url = f.toURL();
            AudioClip aau;
            aau = Applet.newAudioClip(url);
            aau.loop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void playmusic() {
        new Music();
    }
}

主程序中调用

new Thread(new Runnable() {
            @Override
            public void run() {
                new Music().playmusic();
            }
        }).start();

注:MP3格式的音乐实现起来貌似不是很理想,转换为wav格式就好啦。

格式工厂官方网址:http://www.pcfreetime.com/formatfactory/CN/index.html

你会爱上这个工具的!!!

源码获取

https://tuomasi.lanzouu.com/i4N9F05k4xud

提取码:0000

猜你喜欢

转载自blog.csdn.net/m0_54925305/article/details/125019081