大学生java代码 坦克大战 设计和实现《坦克大战》游戏中的四个关键类:GamePanel、Base和BlastObj。

package tom.tanke;



import com.sun.deploy.net.MessageHeader;

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("images/background.jpg");
    /*
       指针图片
     */
    private Image select = Toolkit.getDefaultToolkit().getImage("images/selecttank.gif");
    /*
       基地
     */
    private Base base = new Base("images/star.gif", 365, 560, this);
    /*
       玩家
     */
    private PlayerOne playerOne = new PlayerOne("images/player1/p1tankU.gif", 125, 510,
            "images/player1/p1tankU.gif","images/player1/p1tankD.gif",
            "images/player1/p1tankL.gif","images/player1/p1tankR.gif", this);
    private PlayerTwo playerTwo = new PlayerTwo("images/player2/p2tankU.gif", 625, 510,
            "images/player2/p2tankU.gif","images/player2/p2tankD.gif",
            "images/player2/p2tankL.gif","images/player2/p2tankR.gif", this);

    /*
       窗口的启动方法
     */
    public void launch(){
        /*
           标题
         */
        setTitle("坦克大战");
        /*
           窗口初始大小
         */
        setSize(width, height);
        /*
           用户不能调整大小
         */
        setResizable(false);
        /*
           使窗口可见
         */
        setVisible(true);
        /*
           获取屏幕分辨率,使窗口生成时居中
         */
        setLocationRelativeTo(null);
        /*
           添加关闭事件
         */
        setDefaultCloseOperation(3);
        /*
           添加键盘事件
         */
        this.addKeyListener(new GamePanel.KeyMonitor());
        /*
          添加围墙
         */
        for(int i = 0; i< 14; i ++){
            wallList.add(new Wall("images/walls.gif", i*60 ,170, this ));
        }
        wallList.add(new Wall("images/walls.gif", 305 ,560,this ));
        wallList.add(new Wall("images/walls.gif", 305 ,500,this ));
        wallList.add(new Wall("images/walls.gif", 365 ,500,this ));
        wallList.add(new Wall("images/walls.gif", 425 ,500,this ));
        wallList.add(new Wall("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 % 100 == 1 && enemyCount < 10) {
                    Random r = new Random();
                    int rnum =r.nextInt(800);
                    botList.add(new Bot("images/enemy/enemy1U.gif", rnum, 110,
                            "images/enemy/enemy1U.gif","images/enemy/enemy1D.gif",
                            "images/enemy/enemy1L.gif","images/enemy/enemy1R.gif", this));
                    enemyCount++;

                }
            }
            repaint();
            try {
                /*
                   线程休眠  1秒 = 1000毫秒
              */
                Thread.sleep(25);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        /*
          创建和容器一样大小的Image图片
         */
        if(offScreenImage ==null){
            offScreenImage=this.createImage(width, height);
        }
        /*
           获得该图片的画布
         */
        Graphics gImage= offScreenImage.getGraphics();
        /*
           设置背景颜色
         */
        gImage.setColor(Color.gray);
        /*
          填充整个画布
         */
        gImage.fillRect(0, 0, width, height);
        /*
          改变画笔的颜色
         */
        gImage.setColor(Color.yellow);
        /*
           改变文字大小和样式
         */
        gImage.setFont(new Font("仿宋",Font.BOLD,50));
        if(state == 0){
            /*
               添加文字
             */
            gImage.drawString("选择游戏模式",220,100);
            gImage.drawString("单人游戏",220,200);
            gImage.drawString("双人游戏",220,300);
            gImage.drawString("按1,2选择模式,按回车开始游戏",0,400);
            gImage.drawImage(select,160,y,null);
        }
        else if(state == 1||state == 2){
            gImage.setColor(Color.red);
            gImage.setFont(new Font("仿宋",Font.BOLD,20));
            gImage.drawString("WASD控制移动",0,510);
            gImage.drawString("空格射击",0,550);
            if(state == 2){
                gImage.drawString("方向键控制移动",575,510);
                gImage.drawString("K射击",575,550);
            }

            /*
               paint重绘游戏元素
             */
            for(Tank tank : tankList){
                tank.paintSelf(gImage);
            }
            for(Bullet bullet: bulletList){
                bullet.paintSelf(gImage);
            }
            bulletList.removeAll(removeList);
            for(Bot bot: botList){
                bot.paintSelf(gImage);
            }
            for (Wall wall: wallList){
                wall.paintSelf(gImage);
            }
            for(Base base : baseList){
                base.paintSelf(gImage);
        }
        for(BlastObj blast : blastList){
            blast.paintSelf(gImage);
        }
        /*
          重绘次数+1
         */
        count++;
    }
    else if(state == 3){
        gImage.drawString("游戏暂停",220,200);
    }
    else if(state == 4){
        gImage.drawString("游戏失败",220,200);
    }
    else if(state == 5){
        gImage.drawString("游戏胜利",220,200);
    }
    /*
       将缓冲区绘制好的图形整个绘制到容器的画布中
     */
    g.drawImage(offScreenImage, 0, 0, null);
}

private class KeyMonitor extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        //super.keyPressed(e);
        int key = e.getKeyCode();
        switch (key){
            case KeyEvent.VK_1:
                y = 150;
                a = 1;
                break;
            case KeyEvent.VK_2:
                y = 250;
                a = 2;
                break;
            case KeyEvent.VK_ENTER:
                state = a;
                /*
                   添加玩家
                 */
                if(state == 1 && !start){
                    tankList.add(playerOne);
                }else{
                    tankList.add(playerOne);
                    tankList.add(playerTwo);
                }
                start = true;
                break;
            case KeyEvent.VK_P:
                if(state != 3){
                    a = state;
                    state = 3;
                }
                else{
                    state = a;
                    if(a == 0) {
                        a = 1;
                    }
                }
                break;
            default:
                playerOne.keyPressed(e);
                playerTwo.keyPressed(e);
                break;
        }
    }

    @Override
    public void keyReleased(KeyEvent e){
        playerOne.keyReleased(e);
        playerTwo.keyReleased(e);
    }
}

public static void main(String[] args) {
    GamePanel gamePanel = new GamePanel();
    gamePanel.launch();
    }
}



package tom.tanke;

import java.awt.Graphics;
import java.awt.Rectangle;
/*
   基地类
 */
public class Base extends GameObject {
    /*
       基地的宽度与高度
     */
    int width=60;
    int height=60;
    /*
       构造方法,初始化基地的位置和图像
     */
    public Base(String img, int x, int y, GamePanel gamePanel) {
        super(img,x, y, gamePanel);
// TODO Auto-generated constructor stub

    }
    /*
       重写构造方法,用于绘制基地
     */
    @Override
    public void paintSelf(Graphics g) {
    g.drawImage(img,x, y, null);
    }
    /*
       重写获取碰撞的方法,用于检测碰撞
     */
    @Override
    public Rectangle getRec() {
// TODO Auto-generated method stub
        /*
           返回表示基地的矩形对象,用于碰撞检测
         */
        return new Rectangle(x, y,width,height);
    }
}


package tom.tanke;


import java.awt.*;
/*
   爆炸效果
 */
public class BlastObj extends GameObject {
    /*
       静态数组,用于存储爆炸效果的图片
     */
    static Image[] imgs = new Image[8];
    /*
       爆炸效果当前帧数
     */
    int explodeCount = 0;
    /*
       静态代码块,在类加载时执行,加载爆炸效果的图片
     */
    static {
        for (int i = 0; i < 8; i++) {
            imgs[i] = Toolkit.getDefaultToolkit().getImage("images/blast/blast" +(i + 1)+".gif");
        }
    }
   /*
      无参构造方法,调用父类的构造方法
    */
    public BlastObj() {
        super();
    }
   /*
      带参构造方法,初始化爆炸效果的位置
    */
    public BlastObj(int x, int y) {
        this.x = x;
        this.y = y;
    }
   /*
      重写绘制方法,用于绘制爆炸效果
    */
    @Override
    public void paintSelf(Graphics g) {
        /*
           如果爆炸效果的帧数小于8,则绘制当前帧的图片
         */
        if (explodeCount < 8){
            g.drawImage(imgs[explodeCount],x,y,null);
            /*
               帧数加一,显示下一帧图片
             */
            explodeCount++;
        }
    }
    /*
       重写获取碰撞的方法,对于爆炸效果返回null
     */
    @Override
    public Rectangle getRec() {
        return null;
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值