坦克大战体会
首先我们得创造这些类
-
坦克类
-
我的坦克
-
敌人的坦克
- Vector
- Vector
- 判断敌人坦克重叠的方法
-
-
子弹类
- 线程
-
炸弹类
- 生命值属性,可以让炸弹出现爆炸的效果
-
TankGame 类
- 启动myPanel线程
-
my panel extends JPanel,implement Runnable,KeyListener
-
paint
-
画框
-
敌人
- 调用draw方法就可以了
-
我方
-
子弹
-
炸弹
- 由三张照片组成,放在out chapter跟目录下
- 读取要注意⚠️是所在类.class.getResource()
-
-
run
- this.repaint
-
hitTank
-
键盘的监听
- this.repaint
-
hitEnemyTank
-
hitMyTank
-
constructor
- 我的坦克的初始化
- 敌人坦克
- 子弹
- 炸弹
-
DrawTank()
- 抽出一个方法来专门画所有的坦克
-
TouchEnemy
- 调用isTouchEnemy()方法来判断自己的坦克是否跟敌方坦克碰撞
-
isTouchEnemy()
-
-
Record
-
文件读取
-
文件的存储BufferedWriter
- 不能使用br.writer()里面传int 参数;因为要考虑读取的时候readLine()只能接受string,所以存储的时候也必须是相同的形式,很多地方都是这样,要注意‼️,不然会出现异常
-
最好是把它变成工具类,用static
-
-
node
- 是将敌人的坦克存储的坐标及方向,以node 的形式存储起来,因为初始化的时候,敌人的坦克是Vector<>的形式存储的,那么这样应该考虑再调用的时候,也应该是一个vector<>的集合
-
music
- 继承线程
package com.tankgamepractice1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
/**
* @author jessica~
* @version 1.0
*/
public class TankGame extends JFrame {
MyPanel myPanel;
Scanner scanner = new Scanner(System.in);
public TankGame() {
System.out.println("press 1 to start new game;press 2 to continue.");
String key = scanner.next();
myPanel = new MyPanel(key);
new Thread(myPanel).start();
this.add(myPanel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setSize(1300,750);
//一点要加进去,不然就无法按键成功
this.addKeyListener(myPanel);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
Reader.Record();
System.exit(0);
}
});
}
public static void main(String[] args) {
new TankGame();
}
}
package com.tankgamepractice1;
/**
* @author jessica~
* @version 1.0
*/
public class Tank {
int x;
int y;
int dir;
int speed = 1;
boolean isLive = true;
public Tank(int x, int y) {
this.x = x;
this.y = y;
}
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 int getDir() {
return dir;
}
public void setDir(int dir) {
this.dir = dir;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean live) {
isLive = live;
}
public void moveUp() {
y -= speed;
}
public void moveDown() {
y += speed;
}
public void moveLeft() {
x -= speed;
}
public void moveRight() {
x += speed;
}
}
package com.tankgamepractice1;
/**
* @author jessica~
* @version 1.0
*/
public class Shot implements Runnable{
int x;
int y;
int dir;
int speed = 1;
boolean isLive = true;
public Shot(int x, int y, int dir) {
this.x = x;
this.y = y;
this.dir = dir;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean live) {
isLive = live;
}
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 int getDir() {
return dir;
}
public void setDir(int dir) {
this.dir = dir;
}
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 (dir){
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)){
isLive = false;
break;
}
}
}
}
package com.tankgamepractice1;
import java.io.*;
import java.util.Vector;
/**
* @author jessica~
* @version 1.0
*/
public class Reader {
private static BufferedWriter bw = null;
private static BufferedReader br = null;
private static String filePath = "src/practicRecord.txt";
private static int hitEnemyTank = 0;
private static Vector<Node> nodes = new Vector<>();
private static Vector<EnemyTank> enemyTanks = new Vector<>();
public static Vector<Node> readRecord(){
try {
br = new BufferedReader(new FileReader(filePath));
String s = br.readLine();
hitEnemyTank = Integer.parseInt(s);
String readEnemyTank = null;
while(( readEnemyTank=br.readLine())!=null){
String[] s1 = readEnemyTank.split(" ");
Node node = new Node(Integer.parseInt(s1[0]),
Integer.parseInt(s1[1]), Integer.parseInt(s1[2]));
nodes.add(node);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(br !=null){
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return nodes;
}
public static String getFilePath() {
return filePath;
}
public static void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
Reader.enemyTanks = enemyTanks;
}
public static void setFilePath(String filePath) {
Reader.filePath = filePath;
}
public static int getHitEnemyTank() {
return hitEnemyTank;
}
public static void setHitEnemyTank(int hitEnemyTank) {
Reader.hitEnemyTank = hitEnemyTank;
}
public static void addAllTanks() {
hitEnemyTank++;
}
public static void Record() {
try {
bw = new BufferedWriter(new FileWriter(filePath));
// bw.write(hitEnemyTank+"\r\n");
//因为读取的时候是读取的s ,所以必须以string 的形式存储
bw.write(hitEnemyTank+"");
bw.newLine();
for (int i = 0; i <enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
String xyd=enemyTank.x+" "+enemyTank.y+" "+enemyTank.getDir();
bw.write(xyd+"\r\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.tankgamepractice1;
/**
* @author jessica~
* @version 1.0
*/
public class Node {
int x;
int y;
int dir;
public Node(int x, int y, int dir) {
this.x = x;
this.y = y;
this.dir = dir;
}
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 int getDir() {
return dir;
}
public void setDir(int dir) {
this.dir = dir;
}
}
package com.tankgamepractice1;
import java.util.Vector;
/**
* @author jessica~
* @version 1.0
*/
public class MyTank extends Tank{
Shot shot;
Vector<Shot> shots = new Vector<>();
public MyTank(int x, int y) {
super(x, y);
}
public void shotEnemy(){
switch (dir){
case 0:
shot = new Shot(x+20,y,0);
break;
case 1:
shot = new Shot(x+60,y+20,1);
break;
case 2:
shot = new Shot(x+20,y+60,2);
break;
case 3:
shot = new Shot(x,y+20,3);
break;
}
shots.add(shot);
new Thread(shot).start();
}
}
package com.tankgamepractice1;
import com.hsp.NewReader;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.Vector;
/**
* @author jessica~
* @version 1.0
*/
public class MyPanel extends JPanel implements KeyListener,Runnable{
MyTank myTank ;
Vector<EnemyTank> enemyTanks = new Vector<>();
int enemySize = 3;
Vector<Bomb> bombs = new Vector<>();
Image image1 =null;
Image image2 =null;
Image image3 = null;
Vector<Node> nodes = new Vector<>();
public MyPanel(String key) {
myTank = new MyTank(500,100);
File file = new File(Reader.getFilePath());
if(file.exists()){
//这个代码可以写在这,也可以写在下面,逻辑是对的
// nodes = Reader.readRecord();
}else {
System.out.println("no file ,only can start new game.");
key = "1";
}
Reader.setEnemyTanks(enemyTanks);
switch (key){
case "1":
for (int i = 0; i < enemySize; i++) {
EnemyTank enemyTank = new EnemyTank(100*(1+i),0);
//这个方法就把它们两个类中的enemyTanks关联起来了
//让它们都指向的是同一个类
enemyTank.setEnemyTanks(enemyTanks);
enemyTank.setDir(2);
enemyTanks.add(enemyTank);
//这个很重要阿,不然不会开启敌人坦克的线程
//它们就不会动,子弹也不会出现
new Thread(enemyTank).start();
}
break;
case "2":
nodes = Reader.readRecord();
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.get(i);
EnemyTank enemyTank = new EnemyTank(node.getX(), node.getY());
enemyTank.setEnemyTanks(enemyTanks);
enemyTank.setDir(node.getDir());
enemyTanks.add(enemyTank);
new Thread(enemyTank).start();
}
break;
}
image1 = Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/bomb_1.gif"));
image2 = Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/bomb_2.gif"));
image3 = Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/bomb_3.gif"));
new AePlayWave("src/111.wav").start();
}
public void showInfo_(Graphics g){
g.setColor(Color.black);
Font times = new Font("Menlo", Font.BOLD, 25);
g.setFont(times);
g.drawString("the destroyed enemy tanks:",1020,30);
drawTank(1020,60,g,1,0);
g.setColor(Color.black);
g.drawString(Reader.getHitEnemyTank()+"",1080,100);
}
//这个功能是实现自己坦克跟敌人坦克相碰的时候,两个坦克都爆炸的效果
//我做了两个部分
//这个部分是只要实现一辆敌人坦克和我的坦克相碰,就返回false
public Boolean isTouchETank1(EnemyTank enemyTank, MyTank myTank){
switch (myTank.getDir()){
case 0://up
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克左上角x,y
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+40
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+60){
return true;
}
//右上角x+40,y
if(myTank.x+40 >= enemyTank.x &&myTank.x+40 <= enemyTank.x+40
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//左上角
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+60
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+40){
return true;
}
//右上角x+40,y
if(myTank.x+40 >= enemyTank.x &&myTank.x+40 <= enemyTank.x+60
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+40){
return true;
}
}
break;
case 1://right
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克右上角x+60,y
if(myTank.x+60 >= enemyTank.x &&myTank.x+60 <= enemyTank.x+40
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+60){
return true;
}
//右下角x+60,y+40
if(myTank.x+60 >= enemyTank.x &&myTank.x+60 <= enemyTank.x+40
&&myTank.y+40 >=enemyTank.y && myTank.y+40 <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//右上角
if(myTank.x+60 >= enemyTank.x &&myTank.x+60 <= enemyTank.x+60
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+40){
return true;
}
//右下角x+60,y+40
if(myTank.x+60 >= enemyTank.x &&myTank.x+60 <= enemyTank.x+60
&&myTank.y+40 >=enemyTank.y && myTank.y+40 <= enemyTank.y+40){
return true;
}
}
break;
case 2://down
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克左下角x,y+60
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+40
&&myTank.y+60 >=enemyTank.y && myTank.y+60 <= enemyTank.y+60){
return true;
}
//右下角x+40,y+60
if(myTank.x+40 >= enemyTank.x &&myTank.x+40 <= enemyTank.x+40
&&myTank.y+60 >=enemyTank.y && myTank.y+60 <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//当前坦克左下角x,y+60
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+60
&&myTank.y+60 >=enemyTank.y && myTank.y+60 <= enemyTank.y+40){
return true;
}
//右下角x+40,y+60
if(myTank.x+40 >= enemyTank.x &&myTank.x+40 <= enemyTank.x+60
&&myTank.y+60 >=enemyTank.y && myTank.y+60 <= enemyTank.y+40){
return true;
}
}
break;
case 3://left
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克左上角x,y
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+40
&&myTank.y >=enemyTank.y && myTank.y <= enemyTank.y+60){
return true;
}
//左下角x,y+40
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+40
&&myTank.y+40 >=enemyTank.y && myTank.y+40 <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//当前坦克左上角x,y
if(myTank.x >= enemyTank.x &&myTank.x <= enemyTank.x+60
&&myTank.y >=enemyTank.y && myTank.y<= enemyTank.y+40){
return true;
}
//左下角x,y+40
if(myTank.x>= enemyTank.x &&myTank.x <= enemyTank.x+60
&&myTank.y+40 >=enemyTank.y && myTank.y+40 <= enemyTank.y+40){
return true;
}
}
break;
} return false;
}
//这个是实现真正的相碰,会出现什么情况,
//比如说需要设置坦克的生命值,炸弹出现的时机
//需要注意的是,需要在run 方法中去调用它,因为需要它不停的去判断,然后再不停的去画
public void TouchTank(MyTank myTank){
for (int i = 0; i <enemyTanks.size() ; i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if(isTouchETank1(enemyTank,myTank)){
myTank.isLive = false;
Reader.addAllTanks();
enemyTanks.remove(enemyTank);
Bomb bomb = new Bomb(myTank.x, myTank.y);
bombs.add(bomb);
}
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 1000, 750);
showInfo_(g);
if(myTank.isLive){
drawTank(myTank.x,myTank.y,g,0,myTank.dir);
}
for (int i = 0; i < myTank.shots.size(); i++) {
Shot shot = myTank.shots.get(i);
if(shot.isLive){
g.draw3DRect(shot.x,shot.y,2,2,false);
}
else {
myTank.shots.remove(shot);
}
}
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
if(enemyTank.isLive){
drawTank(enemyTank.x,enemyTank.y,g,1,enemyTank.getDir());
for(int j = 0;j<enemyTank.shots.size();j++){
Shot shot = enemyTank.shots.get(j);
if(shot.isLive){
g.draw3DRect(shot.x, shot.y, 2, 2, false);
}else {
enemyTank.shots.remove(shot);
}
}
}
}
for (int i = 0; i < bombs.size(); i++) {
Bomb bomb = bombs.get(i);
if(bomb.life>6){
g.drawImage(image1, bomb.x, bomb.y, 60, 60, this
);
} else if (bomb.life > 3) {
g.drawImage(image2, bomb.x, bomb.y, 60, 60, this);
} else {
g.drawImage(image3, bomb.x, bomb.y, 60, 60, this);
}
bomb.lifeDown();
if (bomb.life == 0) {
bombs.remove(bomb);
}
}
}
public void hitTank(Shot s, Tank tank) {
switch (tank.dir) {
case 0:
case 2:
if( (s.x > tank.x && s.x < tank.x + 40 && s.y > tank.y && s.y < tank.y + 60) ){
s.isLive = false;
tank.isLive = false;
if(tank instanceof EnemyTank){
enemyTanks.remove(tank);
Reader.addAllTanks();
}
Bomb bomb = new Bomb(tank.x, tank.y);
bombs.add(bomb);
}
break;
case 1:
case 3:
if ((s.x > tank.x && s.x < tank.x + 60 && s.y > tank.y && s.y < tank.y + 40) ) {
s.isLive = false;
tank.isLive = false;
if(tank instanceof EnemyTank){
enemyTanks.remove(tank);
Reader.addAllTanks();
}
Bomb bomb = new Bomb(tank.x, tank.y);
bombs.add(bomb);
}
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_W){
myTank.setDir(0);
if(myTank.y>0){
myTank.moveUp();
}
}else if(e.getKeyCode()==KeyEvent.VK_A){
myTank.setDir(3);
if(myTank.x>0){
myTank.moveLeft();
}
}else if (e.getKeyCode() == KeyEvent.VK_D) {
myTank.setDir(1);
{
if (myTank.x + 60 < 1000) {
myTank.moveRight();
}
}
}else if(e.getKeyCode() == KeyEvent.VK_S){
myTank.setDir(2);
if(myTank.y +60 <750){
myTank.moveDown();
}
}
if(e.getKeyCode() == KeyEvent.VK_J){
myTank.shotEnemy();
}
this.repaint();
}
public void hitMyTank(){
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
for(int j = 0;j<enemyTank.shots.size();j++){
Shot shot = enemyTank.shots.get(j);
if(shot.isLive &&myTank.isLive){
hitTank(shot,myTank);
}
}
}
}
public void hitEnemyTank(){
for(int i = 0;i<myTank.shots.size();i++){
Shot shot = myTank.shots.get(i);
if(shot.isLive){
for (int j = 0; j < enemyTanks.size(); j++) {
EnemyTank enemyTank = enemyTanks.get(j);
hitTank(shot,enemyTank);
}
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
public void drawTank(int x, int y, Graphics g, int type, int dir) {
//用switch 语句来控制
switch (type) {
case 0:
//我方的坦克
g.setColor(Color.cyan);
break;
case 1:
//敌方的坦克
g.setColor(Color.yellow);
break;
}
//direction 表示坦克的方向,0表示向上,1表示向右,2表示向下,3表示向左
switch (dir) {
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;
default:
System.out.println("none");
}
}
@Override
public void run() {
while (true){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
hitMyTank();
hitEnemyTank();
TouchTank(myTank);
this.repaint();
}
}
}
package com.tankgamepractice1;
import java.util.Vector;
/**
* @author jessica~
* @version 1.0
*/
public class EnemyTank extends Tank implements Runnable{
Vector<Shot> shots = new Vector<>();
Vector<EnemyTank> enemyTanks = new Vector<>();
public EnemyTank(int x, int y) {
super(x, y);
}
public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
this.enemyTanks = enemyTanks;
}
//在哪里使用呢?在敌人坦克移动的时候
public Boolean isTouchTank(){
//判断当前敌人坦克的方向
switch (this.getDir()){
case 0://up
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
if(enemyTank != this){
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克左上角x,y
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+40
&&this.y >=enemyTank.y && this.y <= enemyTank.y+60){
return true;
}
//右上角x+40,y
if(this.x+40 >= enemyTank.x &&this.x+40 <= enemyTank.x+40
&&this.y >=enemyTank.y && this.y <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//左上角
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+60
&&this.y >=enemyTank.y && this.y <= enemyTank.y+40){
return true;
}
//右上角x+40,y
if(this.x+40 >= enemyTank.x &&this.x+40 <= enemyTank.x+60
&&this.y >=enemyTank.y && this.y <= enemyTank.y+40){
return true;
}
}
}
}
break;
case 1://right
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
if(enemyTank != this){
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克右上角x+60,y
if(this.x+60 >= enemyTank.x &&this.x+60 <= enemyTank.x+40
&&this.y >=enemyTank.y && this.y <= enemyTank.y+60){
return true;
}
//右下角x+60,y+40
if(this.x+60 >= enemyTank.x &&this.x+60 <= enemyTank.x+40
&&this.y+40 >=enemyTank.y && this.y+40 <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//右上角
if(this.x+60 >= enemyTank.x &&this.x+60 <= enemyTank.x+60
&&this.y >=enemyTank.y && this.y <= enemyTank.y+40){
return true;
}
//右下角x+60,y+40
if(this.x+60 >= enemyTank.x &&this.x+60 <= enemyTank.x+60
&&this.y+40 >=enemyTank.y && this.y+40 <= enemyTank.y+40){
return true;
}
}
}
}
break;
case 2://down
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
if(enemyTank != this){
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克左下角x,y+60
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+40
&&this.y+60 >=enemyTank.y && this.y+60 <= enemyTank.y+60){
return true;
}
//右下角x+40,y+60
if(this.x+40 >= enemyTank.x &&this.x+40 <= enemyTank.x+40
&&this.y+60 >=enemyTank.y && this.y+60 <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//当前坦克左下角x,y+60
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+60
&&this.y+60 >=enemyTank.y && this.y+60 <= enemyTank.y+40){
return true;
}
//右下角x+40,y+60
if(this.x+40 >= enemyTank.x &&this.x+40 <= enemyTank.x+60
&&this.y+60 >=enemyTank.y && this.y+60 <= enemyTank.y+40){
return true;
}
}
}
}
break;
case 3://left
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
//不能和自己比较,自己比较的化,就永远碰撞
//只要比较对象就可以了
if(enemyTank != this){
//敌人的其它坦克向上/向下
//敌人坦克x的范围x,x+40
//y 的范围是y ,y+60
if(enemyTank.getDir() == 0 ||enemyTank.getDir() ==2){
//当前坦克左上角x,y
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+40
&&this.y >=enemyTank.y && this.y <= enemyTank.y+60){
return true;
}
//左下角x,y+40
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+40
&&this.y+40 >=enemyTank.y && this.y+40 <= enemyTank.y+60){
return true;
}
//敌人坦克左和右
//范围x,x+60;y,y+40
}
if(enemyTank.getDir() == 3 ||enemyTank.getDir() ==1){
//当前坦克左上角x,y
if(this.x >= enemyTank.x &&this.x <= enemyTank.x+60
&&this.y >=enemyTank.y && this.y<= enemyTank.y+40){
return true;
}
//左下角x,y+40
if(this.x>= enemyTank.x &&this.x <= enemyTank.x+60
&&this.y+40 >=enemyTank.y && this.y+40 <= enemyTank.y+40){
return true;
}
}
}
}
break;
}
return false;
}
@Override
public void run() {
Shot shot = null;
while (isLive) {
if (shots.size() < 4) {
switch (getDir()) {
case 0:
shot = new Shot(x + 20, y, 0);
break;
case 1:
shot = new Shot(x + 60, y + 20, 1);
break;
case 2:
shot = new Shot(x + 20, y + 60, 2);
break;
case 3:
shot = new Shot(x, y + 20, 3);
break;
}
shots.add(shot);
new Thread(shot).start();
}
switch (dir){
case 0:
for (int i = 0; i < 30; i++) {
if(y>0 && !isTouchTank()){
moveUp();
}
//每一次移动都需要休眠一下,不然看不出效果
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
case 1:
for (int i = 0; i < 30; i++) {
if (x + 60 < 1000&& !isTouchTank()) {
moveRight();
}
//每一步都让它休眠一下
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case 2:
for (int i = 0; i < 30; i++) {
if (y + 60 < 750&& !isTouchTank()) {
moveDown();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case 3:
for (int i = 0; i < 30; i++) {
if (x> 0 && !isTouchTank()) {
moveLeft();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
}
setDir((int)(Math.random()*4));
}
}
}
package com.tankgamepractice1;
/**
* @author jessica~
* @version 1.0
*/
public class Bomb {
int x;
int y;
int life = 9;
//是boolean ,不是Boolean
boolean isLive ;
public Bomb(int x, int y) {
this.x = x;
this.y = y;
}
public void lifeDown(){
//这里设置错误,我设置为>6,
// 结果就导致炸弹持续在最大的状态,不消失
if(life>0){
life --;
}else {
isLive = false;
}
}
}
package com.tankgamepractice1;
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
/**
* @author jessica~
* @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();
}
}
}