GamePanel类

package com.bigdata.tankbattle;


import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


// game panel  : 游戏面板
public class GamePanel extends JPanel {
    // 控制游戏是否结束
    private static boolean GAME_OVER = false;
    public static final List<Tank> ENEMY_LIST = new ArrayList<>();
    // 装墙
    public static final List<Wall> WALL_LIST = new ArrayList<>();

    /**
     * 方法
     */
    private Tank tank;
    // 敌军


    // 创造数组
    public static final List<Bullet> BULLET_LIST=new ArrayList<>();
    // 常量
    // 设置画板的宽度
    public static final int PANEL_WIDTH = 1200;
    // 设置画板的高度
    public static final int PANEL_HEIGHT = 600;
    // 颜色
    public static final Color RED =new Color(0xFFFF0000, true);
    public static final Color BLACK =new Color(0x000000);
    // 字体
    // 加粗
    public static final Font BOLD =new Font("Microsoft Yahei",Font.BOLD,16);
    // 不加粗
    public static final Font PLAIN =new Font("Microsoft Yahei",Font.PLAIN,16);

//=============================最简单的单例===========================================
    // 2、提供私有的静态的本类对象
    private static final GamePanel gamePanel =new GamePanel();

    // 保证都是new出来的都是一个画板
    // 单例(在程序执行过程中,始终保持该类制备实例化一次):
    // 1、私有化构造器
    private GamePanel(){

    }

    // 3、提供共有的静态的获取本类的实例的方法
    public static GamePanel getInstance(){
        return gamePanel;
    }
//==================================================================================


    // Ctrl + o
    // 重写,paint:画板

    public Tank getTank() {
        return tank;
    }

    public void setTank(Tank tank) {
        this.tank = tank;
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(GamePanel.BLACK);
        g.setFont(GamePanel.PLAIN);
//        // 改字体颜色、加粗、大小
//        g.setFont(new Font("Arial",Font.BOLD,16));
//        g.setColor(new Color(0xff0000));
//        // 写进入时显示的题目,题目出现位置的坐标
//        g.drawString("Hello TankBattle!!!",100,100);
//
//        // 画一个矩形,并且把颜色改成黑色
//        g.setColor(new Color(0xf00));
//        g.fillRect(200,200,50,50);
//        // 画子弹
//        g.fillOval(250,210,20,20);

//        // 调用Tank里的数据
//        // 坦克一号
//        Tank tank = new Tank(Tank.InIT_X,Tank.InIT_Y,Tank.WIDTH,Tank.HEIGHT,Tank.WHEEL_WIDTH,Tank.BARREL_WIDTH,Tank.BARREL_HEIGHT);
//        tank.setDirection(Tank.UP);
//        // 显示出来
//        tank.fill(g);
//
//        // 坦克二号
//        Tank tank1 = new Tank();
//        tank1.setX(Tank.InIT_X*3);
//        tank1.setY(Tank.InIT_X*3);
//        tank1.setWidth(Tank.WIDTH);
//        tank1.setHeight(Tank.HEIGHT);
//        tank1.setWheelWidth(Tank.WHEEL_WIDTH);
//        tank1.setBarrelWidth(Tank.BARREL_WIDTH);
//        tank1.setBarrelHeight(Tank.BARREL_HEIGHT);
//        tank1.setDirection(Tank.DOWN);
//        // 显示出来
//        tank1.fill(g);
//
//        // 坦克二号
//        Tank tank2 = new Tank();
//        tank2.setX(Tank.InIT_X*5);
//        tank2.setY(Tank.InIT_X*4);
//        tank2.setWidth(Tank.WIDTH);
//        tank2.setHeight(Tank.HEIGHT);
//        tank2.setWheelWidth(Tank.WHEEL_WIDTH);
//        tank2.setBarrelWidth(Tank.BARREL_WIDTH);
//        tank2.setBarrelHeight(Tank.BARREL_HEIGHT);
//        tank2.setDirection(Tank.LEFT);
//        // 显示出来
//        tank2.fill(g);
//
//        // 坦克二号
//        Tank tank3 = new Tank();
//        tank3.setX(Tank.InIT_X*6);
//        tank3.setY(Tank.InIT_X*5);
//        tank3.setWidth(Tank.WIDTH);
//        tank3.setHeight(Tank.HEIGHT);
//        tank3.setWheelWidth(Tank.WHEEL_WIDTH);
//        tank3.setBarrelWidth(Tank.BARREL_WIDTH);
//        tank3.setBarrelHeight(Tank.BARREL_HEIGHT);
//        tank3.setDirection(Tank.RIGHT);
//        // 显示出来
//        tank3.fill(g);


        tank.drawBloodBar(g);
        if (GAME_OVER){
            g.drawString("游戏结束",560,200);


//            g.setFont(new Font("Arial",Font.BOLD,16));
         return;
        }
        tank.fill(g);       //         画自己的坦克
//      画敌军的坦克
        for (Iterator<Tank> iterator=ENEMY_LIST.iterator();iterator.hasNext();){
            Tank tank = iterator.next();
            tank.fill(g);
            // 调用AI中的移动方法
            AI.setMove(tank);
            // 调用AI中的改变方向方法
            AI.changeDirection(tank);
            // 调用AI中的子弹方法
            AI.shoot(tank);
            // 使敌军运动起来
            tank.move();
            tank.setMove(false);
        }

        // 画出子弹
        for (Iterator<Bullet> iterator = BULLET_LIST.iterator();iterator.hasNext();){
            Bullet nextBullet = iterator.next();
            nextBullet.fill(g);
            nextBullet.move();
            // 判断当子弹出界时,清除子弹
            if (nextBullet.getX() <= 0 || nextBullet.getY() <= 0 || nextBullet.getX() >= GamePanel.PANEL_WIDTH || nextBullet.getY() >= GamePanel.PANEL_HEIGHT ){
                iterator.remove();
            }
        }
//         画墙
        for (Wall wall:WALL_LIST){
            wall.fill(g);
        }
        hit();
    }
    // 击中坦克
    public void hit(){
        List<Tank> tankList = new ArrayList<>(ENEMY_LIST);
        tankList.add(tank);
        for (Iterator<Bullet> bulletIterator=BULLET_LIST.iterator();bulletIterator.hasNext();){
            Bullet bullet = bulletIterator.next();
                int bulletMidX = bullet.getX()+bullet.getDiameter()/2;
                int bulletMidY = bullet.getY()+bullet.getDiameter()/2;
                for (Iterator<Tank> tankIterator=tankList.iterator();tankIterator.hasNext();){
                    Tank tank=tankIterator.next();
                    if (bullet.getTank() != tank && (!bullet.getTank().isSelf() && tank.isSelf()) || (bullet.getTank().isSelf() && !tank.isSelf())) {
                    int tankMidX=tank.getX()+tank.getWidth()/2;
                    int tankMidY =tank.getY()+tank.getHeight()/2;
                    int hitRange=tank.getWidth()/2+bullet.getDiameter()/2;
                        // Math.abs()   :是取括号里的绝对值
                        if (Math.abs(bulletMidX-tankMidX)<hitRange && Math.abs(bulletMidY-tankMidY)<hitRange){
                            // 子弹击中坦克,子弹消失
                            bulletIterator.remove();
                            int blood = tank.getBlood();
                            if (!tank.isSelf()){
                                int score =this.tank.getScore();
                                this.tank.setScore(++score);
                            }
                            if (blood>1){
                                tank.setBlood(--blood);
                                // 根据血量取画坦克
                                tank.resize(blood);
                            }else {
                                if (tank.isSelf()){
                                    tank.setBlood(0);
                                    GAME_OVER=true;
                                    return;
                                }
                                tankIterator.remove();
                                ENEMY_LIST.remove(tank);
                            }
                        }
                    }
                }
        }
    }


    // 屏幕刷新,死循环,一直刷新
    public void refresh(){
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (;!GAME_OVER; ) {
                    repaint();
                    // Alt +Enter
                    // 刷新画布,等待1s刷新60次
                    try {
                        Thread.sleep(1000 / 60);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                repaint();
            }
        });
        thread.start();
    }
}

 

package total.gui; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import total.date.Animal; import total.view.GamePanel; public class AppWindow extends JFrame implements ActionListener{//继承JFrame,实现ActionListener接口 GamePanel gamePanel; JTextField text; public AppWindow(){ setTitle("动物换位游戏");//界面命名为“动物换位游戏” gamePanel = new GamePanel();//对象实例化 gamePanel.setAnimalCount(6);// gamePanel.setLeftAnimalImage("C:\\Users\\杨凯栋\\Desktop\\Animal_game\\Animal_game\\image\\cat.jpg"); gamePanel.setRightAnimalImage("C:\\Users\\杨凯栋\\Desktop\\Animal_game\\Animal_game\\image\\dog.jpg"); add(gamePanel,BorderLayout.CENTER); gamePanel.setBackground(Color.pink); JPanel northP = new JPanel(); northP.add(gamePanel.buttonReStart); northP.add(gamePanel.buttonRedo); add(northP,BorderLayout.NORTH); setBounds(60,60,9*gamePanel.width+9*gamePanel.gap,300); text=new JTextField(10); northP.add(text); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void actionPerformed(ActionEvent e){ Component container = null; JOptionPane.showMessageDialog(container, JOptionPane.INFORMATION_MESSAGE); } public static void main(String args[] ){ AppWindow win = new AppWindow(); } } 帮我注释程序
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值