JAVA实战项目——坦克大战

运行效果

java实战项目——坦克大战

主程序

package tank;

import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class game01 extends JFrame {
    my_pannel mp=null;
    public static void main(String[] args) {
        new game01();
    }
    public game01(){
        mp=new my_pannel();
        new Thread(mp).start();
        this.add(mp);
        this.setSize(1300,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addKeyListener(mp);
        this.setVisible(true);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                recorder.recorde();
                System.exit(0);
            }
        });
    }
}

画板

package tank;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

public class my_pannel extends JPanel  implements KeyListener,Runnable {
    my_hero hero=null;
    Image image1=null;
    Image image2=null;
    Image image3=null;
    Vector<bomp> bp=new Vector<>();
    Vector<enemy_tank> enemy_tanks=null;
    int enemytanksize=3;
    public my_pannel(){
        new AePlayWave("E:\\自学路线\\java基础\\代码\\out\\production\\代码\\111.wav").start();
        hero=new my_hero(500,100,0);
        recorder.hero=hero;
        enemy_tanks = new Vector<>();
        for (int i = 0; i < enemytanksize; i++) {
            enemy_tank enemy_tank = new enemy_tank(100 * (i + 1), 0, 2);
            enemy_tank.setEnemy_tanks(enemy_tanks);
            bullet bt=new bullet(enemy_tank.getX()+20,enemy_tank.getY()+60,enemy_tank.getDirection());
            enemy_tank.shots.add(bt);
            new Thread(bt).start();
            new Thread(enemy_tank).start();
            enemy_tanks.add(enemy_tank);
        }
        recorder.enemy_tank=this.enemy_tanks;
        image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
        image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
        image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));
    }
    public void draw_something(Graphics g){
        g.setColor(Color.black);
        Font font=new Font("隶书",Font.BOLD,25);
        g.setFont(font);
        g.drawString("累计击毁坦克数量",1010,20);
        draw_tank(1030,40,g,0,1);
        g.setColor(Color.black);
        g.drawString("   X "+recorder.num,1070,80);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        draw_something(g);
        g.fillRect(0,0,1000,750);
        if (hero.islive) {
            draw_tank(hero.getX(), hero.getY(), g, hero.getDirection(), 0);
        }
        for (int i = 0; i <enemy_tanks.size(); i++) {
            enemy_tank enemy_tank=enemy_tanks.get(i);
            if (enemy_tank.islive) {
                draw_tank(enemy_tank.getX(), enemy_tank.getY(), g, enemy_tank.getDirection(), 1);
                for (int j = 0; j < enemy_tank.shots.size(); j++) {
                    bullet bt = enemy_tank.shots.get(j);
                    if (bt != null && bt.islive) {
                        g.draw3DRect(bt.x, bt.y, 2, 2, false);
                    } else {
                        enemy_tank.shots.remove(j);
                    }
                }
            }
        }
        for (int i = 0; i < hero.bts.size(); i++) {
            bullet bt=hero.bts.get(i);
            if (bt!=null&&bt.islive){
                g.draw3DRect(bt.x,bt.y,2,2,false);
            }else{
                hero.bts.remove(bt);
            }
        }
        if (bp.size()>0){
            for (int i = 0; i < bp.size(); i++) {
                bomp b=bp.get(i);
                if (b.life>6){
                    g.drawImage(image1,b.x,b.y,60,60,this);
                }else if (b.life>3){
                    g.drawImage(image2,b.x,b.y,60,60,this);
                }else{
                    g.drawImage(image3,b.x,b.y,60,60,this);
                }
                b.lifedown();
                if (b.life==0){
                    bp.remove(b);
                }
            }
        }
    }
    public void draw_tank(int x, int y,Graphics g,int direction,int type){
        switch(type){
            case 0:{
                g.setColor(Color.cyan);
                break;
            }
            case 1:{
                g.setColor(Color.yellow);
                break;
            }
        }
        switch(direction){
            //direction 0:上 1:右 2:下 3:左
            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;
            }
            case 1:{
                g.fill3DRect(x,y,60,10,false);//坦克的左轮子
                g.fill3DRect(x,y+30,60,10,false);//坦克的右轮子
                g.fill3DRect(x+10,y+10,40,20,false);//坦克的身体
                g.fillOval(x+20,y+10,20,20);
                g.drawLine(x+30,y+20,x+60,y+20);
                break;
            }
            case 2:{
                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+60);
                break;
            }
            case 3:{
                g.fill3DRect(x,y,60,10,false);//坦克的左轮子
                g.fill3DRect(x,y+30,60,10,false);//坦克的右轮子
                g.fill3DRect(x+10,y+10,40,20,false);//坦克的身体
                g.fillOval(x+20,y+10,20,20);
                g.drawLine(x+30,y+20,x,y+20);
                break;
            }

        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_W){
            hero.setDirection(0);
            if (hero.getY()>=0) {
                hero.move_up();
            }
        }else if(e.getKeyCode()==KeyEvent.VK_A){
            hero.setDirection(3);
            if (hero.getX()>=0) {
                hero.move_left();
            }

        }else if(e.getKeyCode()==KeyEvent.VK_S){
            hero.setDirection(2);
            if (hero.getY()+110<=750) {
                hero.move_down();
            }

        }else if(e.getKeyCode()==KeyEvent.VK_D){
            hero.setDirection(1);
            if (hero.getX()+80<=1000) {
                hero.move_right();
            }

        }
        if (e.getKeyCode()==KeyEvent.VK_J){
            hero.shot();
        }
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
    public void hit_hero(){
        for (int i = 0; i < enemy_tanks.size(); i++) {
            enemy_tank enemyTank = enemy_tanks.get(i);
            for (int j = 0; j < enemyTank.shots.size(); j++) {
                bullet bt = enemyTank.shots.get(j);
                hit_tank(bt,hero);
            }

        }
    }
    public void hit_enemy(){
        for (int i = 0; i < hero.bts.size(); i++) {
            bullet bt=hero.bts.get(i);
            if (hero.islive&&bt!=null&&bt.islive){
                for (int j = 0; j < enemy_tanks.size(); j++) {
                    enemy_tank enemyTank=enemy_tanks.get(j);
                    hit_tank(bt,enemyTank);
                }
            }
        }
    }
    public void hit_tank(bullet bt,my_tank enemyTank){
        switch(enemyTank.getDirection()){
                case 0:
                case 2:{
                    if (bt.x>enemyTank.getX()&&bt.x<(enemyTank.getX()+40)
                            &&bt.y>enemyTank.getY()&&bt.y<(enemyTank.getY()+60)){
                        bt.islive=false;
                        enemyTank.islive=false;
                        if(enemy_tanks.remove(enemyTank)){
                            recorder.num++;
                        }
                        bp.add(new bomp(enemyTank.getX(),enemyTank.getY()));
                    }
                    break;
                }
                case 1:
                case 3:{
                    if ((bt.x>enemyTank.getX())&&(bt.x<enemyTank.getX()+60)
                            &&(bt.y>enemyTank.getY())&&(bt.y<enemyTank.getY()+40)){
                        bt.islive=false;
                        enemyTank.islive=false;
                        if(enemy_tanks.remove(enemyTank)){
                            recorder.num++;
                        }
                        bp.add(new bomp(enemyTank.getX(),enemyTank.getY()));
                    }
                    break;
                }
        }
    }
    public void hit_hero(my_tank Tank){
        for (int i = 0; i < enemy_tanks.size(); i++) {
            enemy_tank enemyTank=enemy_tanks.get(i);
            for (int j = 0; j < enemyTank.shots.size(); j++) {
                bullet bt=enemyTank.shots.get(j);
                if (hero.islive&&bt.islive) {
                    switch(Tank.getDirection()){
                        case 0:
                        case 2:{
                            if (bt.x>Tank.getX()&&bt.x<(Tank.getX()+40)
                                    &&bt.y>Tank.getY()&&bt.y<(Tank.getY()+60)){
                                bt.islive=false;
                                Tank.islive=false;
                                bp.add(new bomp(Tank.getX(),Tank.getY()));
                            }
                            break;
                        }
                        case 1:
                        case 3:{
                            if ((bt.x>Tank.getX())&&(bt.x<Tank.getX()+60)
                                    &&(bt.y>Tank.getY())&&(bt.y<Tank.getY()+40)){
                                bt.islive=false;
                                Tank.islive=false;
                                bp.add(new bomp(Tank.getX(),Tank.getY()));
                            }
                            break;
                        }
                    }
                }
            }

        }
    }
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (hero.islive&&hero.bts!=null){
                hit_enemy();
            }
            if (hero.islive&&enemy_tanks.size()>0){
                hit_hero(hero);
            }
            this.repaint();
        }
    }
}

坦克基础类

package tank;

public class my_tank {
    private int x;
    private int y;
    private int direction;
    private int speed=2;
    boolean islive=true;
    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public my_tank(int x, int y, int direction) {
        this.x = x;
        this.y = y;
        this.direction=direction;
    }
    public int getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

    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;
    }
    public void move_up(){
        y-=speed;
    }
    public void move_down(){
        y+=speed;
    }
    public void move_left(){
        x-=speed;
    }
    public void move_right(){
        x+=speed;
    }
}

我方坦克类

package tank;

import java.util.Vector;

public class my_hero extends my_tank{
    bullet bt=null;
    Vector<bullet> bts=new Vector<>();
    public my_hero(int x, int y,int direction) {
        super(x, y,direction);
    }
    public void shot(){
        switch(getDirection()){
            case 0:{
                bt=new bullet(getX()+20,getY(),0);
                bt.setSpeed(getSpeed()+2);
                break;
            }
            case 1:{
                bt=new bullet(getX()+60,getY()+20,1);
                bt.setSpeed(getSpeed()+2);
                break;
            }
            case 2:{
                bt=new bullet(getX()+20,getY()+60,2);
                bt.setSpeed(getSpeed()+2);
                break;
            }
            case 3:{
                bt=new bullet(getX(),getY()+20,3);
                bt.setSpeed(getSpeed()+2);
                break;
            }
        }
        bts.add(bt);
        new Thread(bt).start();
    }
}

敌方坦克类

package tank;

import java.util.Vector;

public class enemy_tank extends my_tank implements Runnable {
    Vector<bullet> shots = new Vector<>();
    bullet bt = null;
    Vector<enemy_tank> enemy_tanks = new Vector<>();

    public void setEnemy_tanks(Vector<enemy_tank> enemy_tanks) {
        this.enemy_tanks = enemy_tanks;
    }

    public enemy_tank(int x, int y, int direction) {
        super(x, y, direction);
    }

    public boolean is_torch() {
        for (int i = 0; i < enemy_tanks.size(); i++) {
            enemy_tank enemyTank = enemy_tanks.get(i);
            if (enemyTank != this) {
                switch (this.getDirection()) {
                    case 0:
                        if (enemyTank.getDirection() == 0 || enemyTank.getDirection() == 2) {
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 40 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 40 && this.getY() >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 60) {
                                return true;
                            }
                        } else {
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 60 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;
                            }
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 60 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                        }
                        break;
                    case 1:
                        if (enemyTank.getDirection() == 0 || enemyTank.getDirection() == 2) {
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 40 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 40 && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 60) {
                                return true;
                            }
                        } else {
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 60 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;
                            }
                            if (this.getX() + 60 >= enemyTank.getX() && this.getX() + 60 <= enemyTank.getX() + 60 && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                        break;
                    case 2:
                        if (enemyTank.getDirection() == 0 || enemyTank.getDirection() == 2) {
                            if (this.getX()>= enemyTank.getX() && this.getX()<= enemyTank.getX() + 40 && this.getY()+60 >= enemyTank.getY() && this.getY()+60 <= enemyTank.getY() + 60) {
                                return true;
                            }
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX() + 40 <= enemyTank.getX() + 40 && this.getY() + 60 >= enemyTank.getY() && this.getY() + 60 <= enemyTank.getY() + 60) {
                                return true;
                            }
                        } else {
                            if (this.getX() >= enemyTank.getX() && this.getX() <= enemyTank.getX() + 60 && this.getY()+60 >= enemyTank.getY() && this.getY()+60 <= enemyTank.getY() + 40) {
                                return true;
                            }
                            if (this.getX() + 40 >= enemyTank.getX() && this.getX()+40 <= enemyTank.getX() + 60 && this.getY() + 60 >= enemyTank.getY() && this.getY() + 60 <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                        break;
                    case 3:
                        if (enemyTank.getDirection() == 0 || enemyTank.getDirection() == 2) {
                            if (this.getX() >= enemyTank.getX() && this.getX()<= enemyTank.getX() + 40 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                            if (this.getX() >= enemyTank.getX() && this.getX()<= enemyTank.getX() + 40 && this.getY()+40>= enemyTank.getY() && this.getY() +40<= enemyTank.getY() + 60) {
                                return true;
                            }
                        } else {
                            if (this.getX()>= enemyTank.getX() && this.getX() <= enemyTank.getX() + 60 && this.getY() >= enemyTank.getY() && this.getY() <= enemyTank.getY() + 40) {
                                return true;
                            }
                            if (this.getX() >= enemyTank.getX() && this.getX()<= enemyTank.getX() + 60 && this.getY() + 40 >= enemyTank.getY() && this.getY() + 40 <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                        break;
                }
            }
        }
        return false;
    }

    @Override
    public void run() {
        while (true) {
            if (islive&&shots.size()<=5){
                switch(getDirection()){
                    case 0:{
                        bt=new bullet(getX()+20,getY(),0);
                        break;
                    }
                    case 1:{
                        bt=new bullet(getX()+60,getY()+20,1);
                        break;
                    }
                    case 2:{
                        bt=new bullet(getX()+20,getY()+60,2);
                        break;
                    }
                    case 3:{
                        bt=new bullet(getX(),getY()+20,3);
                        break;
                    }

                }
                shots.add(bt);
                new Thread(bt).start();
            }
            switch (getDirection()) {
                case 0: {
                    for (int i = 0; i < 30; i++) {
                        if ((getY() - this.getSpeed()) >= 0&&!is_torch()) {
                            move_up();
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        } else {
                            break;
                        }
                    }
                    break;
                }
                case 1: {
                    for (int i = 0; i < 30; i++) {
                        if ((getX() + this.getSpeed() + 60) <= 1000&&!is_torch()) {
                            move_right();
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        } else {
                            break;
                        }
                    }
                    break;
                }
                case 2: {
                    for (int i = 0; i < 30; i++) {
                        if ((getY() + this.getSpeed() + 110) <= 750&&!is_torch()) {
                            move_down();
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        } else {
                            break;
                        }
                    }
                    break;
                }
                case 3: {
                    for (int i = 0; i < 30; i++) {
                        if ((getX() - this.getSpeed()) >= 0&&!is_torch()) {
                            move_left();
                            try {
                                Thread.sleep(50);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        } else {
                            break;
                        }
                    }
                    break;
                }
            }
            setDirection((int)(Math.random()*4));//(int)(Math.random()*4)
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (!this.islive){
                break;
            }
        }
    }
}

播放声音类

package tank;

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;

/**
 * @author 韩顺平
 * @version 1.0
 */
public class AePlayWave extends Thread {
    private String filename;

    public AePlayWave(String wavfile) {
        filename = wavfile;

    }

    public void run() {

        File soundFile = new File(filename);

        AudioInputStream audioInputStream = null;
        try {
            audioInputStream = AudioSystem.getAudioInputStream(soundFile);
        } catch (Exception e1) {
            e1.printStackTrace();
            return;
        }

        AudioFormat format = audioInputStream.getFormat();
        SourceDataLine auline = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

        try {
            auline = (SourceDataLine) AudioSystem.getLine(info);
            auline.open(format);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        auline.start();
        int nBytesRead = 0;
        //这是缓冲
        byte[] abData = new byte[512];

        try {
            while (nBytesRead != -1) {
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
                if (nBytesRead >= 0)
                    auline.write(abData, 0, nBytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            auline.drain();
            auline.close();
        }

    }
}

记录信息类

package tank;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Vector;

public class recorder {
    static FileWriter f=null;
    static BufferedWriter b=null;
    static int num;
    static Vector<enemy_tank> enemy_tank=null;
    static my_hero hero=null;
    public static void recorde(){
        try {
            b=new BufferedWriter(new FileWriter("e:\\hello.txt"));
            b.write(num+"");
            b.newLine();
            for (int i = 0; i < recorder.enemy_tank.size(); i++) {
                enemy_tank enemyTank=recorder.enemy_tank.get(i);
                b.write(enemyTank.getX()+" "+enemyTank.getY()+" "+enemyTank.getDirection()+" 1");
                b.newLine();
            }
            b.write(hero.getX()+" "+hero.getY()+" 0");
            if (b!=null){
                b.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

子弹类

package tank;

public class bullet implements Runnable {
    int x;
    int y;
    int speed=4;
    int direction;
    boolean islive=true;
    public bullet(int x, int y, int direction) {
        this.x = x;
        this.y = y;
        this.direction = direction;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            switch (direction) {
                case 0: {
                    y -= speed;
                    break;
                }
                case 1: {
                    x += speed;
                    break;
                }
                case 2: {
                    y += speed;
                    break;
                }
                case 3: {
                    x -= speed;
                    break;
                }

            }
            if (x<0||x>1000||y<0||y>750||(islive==false)){
                islive=false;
                break;
            }
        }
    }
}

击中爆炸效果类

package tank;

public class bomp {
    int x;
    int y;
    int life=9;
    boolean islive=true;
    public bomp(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public void lifedown(){
        if (life>0){
            life--;
        }else{
            islive=false;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XZY-SUNSHINE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值