Java实现坦克大战(源码全)

这是一个使用Java Swing实现的坦克大战游戏,包含单人和双人模式。游戏具备开挂功能,按下'G'键可以消除敌人。玩家通过键盘控制坦克移动和射击,游戏元素包括坦克、子弹、敌人、基地和墙壁。代码结构清晰,使用了继承和枚举等面向对象特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开头


参考自尚学堂

对代码有一定的重构,功能的添加(按‘G’开挂)

文末源码自取,不会 github、git 建议先去学会基本使用,
也可以在对应界面直接下载压缩包


项目结构

请添加图片描述

在这里插入图片描述

GamePanel

KeyMonitor (内部类)

keyPressed(KeyEvent): void

keyReleased(KeyEvent): void

launch(): void

paint(Graphics): void

main(String[]): void

package com.company.tank;
import javax.swing.*;
import java .awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class GamePanel extends JFrame {
   
   

    /** 定义双缓存图片 */
    private Image offScreenImage = null;
    //游戏状态: 0 游戏未开始,1 单人模式,2 双人模式, 3 游戏暂停, 4 游戏失败,5 游戏成功
    public int state= 0;
    //临时变量
    private int a = 1;
    //重绘次数
    public int count = 0;
    //窗口长宽
    private int width = 800;
    private int height = 610;
    //敌人数量
    private int enemyCount = 0;
    //高度
    private int y = 150;
    //是否开始
    private boolean start = false;
    //物体集合
    public List<Bullet> bulletList = new ArrayList<>();
    public List<Bot> botList = new ArrayList<>();
    public List<Tank> tankList = new ArrayList<>();
    public List<Wall> wallList = new ArrayList<>();
    public List<Bullet> removeList = new ArrayList<>();
    public List<Base> baseList = new ArrayList<>();
    public List<BlastObj> blastList = new ArrayList<>();

    //背景图片
    public Image background = Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/background.jpg"));
    //指针图片
    private Image select = Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/selecttank.gif"));
    //基地
    private Base base = new Base(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/star.gif"))
, 365, 560, this);


    //玩家
    private PlayerOne playerOne = new PlayerOne(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankU.gif")),
             125, 510,
            Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankU.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankD.gif")),
            Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankL.gif")),Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player1/p1tankR.gif")), this);

    private PlayerTwo playerTwo = new PlayerTwo(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankU.gif")),
            625, 510,
            Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankU.gif")),
            Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankD.gif")),
            Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankL.gif")),
            Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/player2/p2tankR.gif")), this);

    //窗口的启动方法
    public void launch(){
   
   
        //标题
        setTitle("坦克大战");
        //窗口初始大小
        setSize(width, height);
        //用户不能调整大小
        setResizable(false);
        //使窗口可见
        setVisible(true);
        //获取屏幕分辨率,使窗口生成时居中
        setLocationRelativeTo(null);
        //添加关闭事件
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //添加键盘事件
        this.addKeyListener(new GamePanel.KeyMonitor());
        //添加围墙 60*60
        for(int i = 0; i< 14; i ++){
   
   
            wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), i*60 ,170, this ));
        }
        wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 305 ,560,this ));
        wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 305 ,500,this ));
        wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 365 ,500,this ));
        wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 425 ,500,this ));
        wallList.add(new Wall(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/walls.gif")), 425 ,560,this ));
        //添加基地
        baseList.add(base);

        while (true){
   
   
            if(botList.size() == 0 && enemyCount == 10){
   
   
                state = 5;
            }
            if(tankList.size() == 0 && (state == 1 || state == 2)){
   
   
                state = 4;
            }
            if(state == 1 || state == 2){
   
   
                if (count % 
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值