运行效果
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;
}
}
}