🕵️♀️防止敌方坦克重叠
4大类 | 8种情况 | |||
---|---|---|---|---|
己上 | 敌上下 | 敌左右 | 左上角 | 右上角 |
己右 | 敌上下 | 敌左右 | 右上角 | 右下角 |
己下 | 敌上下 | 敌左右 | 左下角 | 右下角 |
己左 | 敌上下 | 敌左右 | 左上角 | 左下角 |
😲优化敌方坦克类
package com.Cx_330.TankGame4;
import java.util.Vector;
public class EnemyTank extends Tank implements Runnable{
//判断是否存活
boolean leap=true;
Shot shot=null;
//坦克的子弹数目
Vector<Shot> shots=new Vector<>();
int loc;
//获取敌人坦克集合
Vector<EnemyTank> enemyTanks=new Vector<>();
public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
this.enemyTanks = enemyTanks;
}
public EnemyTank(int x, int y) {
super(x, y);
}
public boolean isRunTank(){
/*
4大类 8种情况
己上 敌上下 敌左右 左上角 右上角
己右 敌上下 敌左右 右上角 右下角
己下 敌上下 敌左右 左下角 右下角
己左 敌上下 敌左右 左上角 左下角
*/
//先获取当前要判断的坦克的方向
switch (this.getDirect()){
case 0://上
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.getDirect()==0||enemyTank.getDirect()==2){
//左上角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+40
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+60){
return false;
}
//右上角
if(getX()+40>=enemyTank.getX()&&getX()+40<=enemyTank.getX()+40
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+60){
return false;
}
}
//其他坦克:当向左或右 x范围[x,x+60] y范围[y,y+40]
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
//左上角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+60
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+40){
return false;
}
//右上角
if(getX()+40>=enemyTank.getX()&&getX()+40<=enemyTank.getX()+60
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+40){
return false;
}
}
}
}
break;
case 1://右
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.getDirect()==0||enemyTank.getDirect()==2){
//右上角
if(getX()+60>=enemyTank.getX()&&getX()+60<=enemyTank.getX()+40
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+60){
return false;
}
//右下角
if(getX()+60>=enemyTank.getX()&&getX()+60<=enemyTank.getX()+40
&&getY()+40>=enemyTank.getY()&&getY()+40<=enemyTank.getY()+60){
return false;
}
}
//其他坦克:当向左或右 x范围[x,x+60] y范围[y,y+40]
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
//右上角
if(getX()+60>=enemyTank.getX()&&getX()+60<=enemyTank.getX()+60
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+40){
return false;
}
//右下角
if(getX()+60>=enemyTank.getX()&&getX()+60<=enemyTank.getX()+60
&&getY()+40>=enemyTank.getY()&&getY()+40<=enemyTank.getY()+40){
return false;
}
}
}
}
break;
case 2://下
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.getDirect()==0||enemyTank.getDirect()==2){
//左下角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+40
&&getY()+60>=enemyTank.getY()&&getY()+60<=enemyTank.getY()+60){
return false;
}
//右下角
if(getX()+40>=enemyTank.getX()&&getX()+40<=enemyTank.getX()+40
&&getY()+60>=enemyTank.getY()&&getY()+60<=enemyTank.getY()+60){
return false;
}
}
//其他坦克:当向左或右 x范围[x,x+60] y范围[y,y+40]
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
//左上角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+60
&&getY()+60>=enemyTank.getY()&&getY()+60<=enemyTank.getY()+40){
return false;
}
//右上角
if(getX()+40>=enemyTank.getX()&&getX()+40<=enemyTank.getX()+60
&&getY()+60>=enemyTank.getY()&&getY()+60<=enemyTank.getY()+40){
return false;
}
}
}
}
break;
case 3://左
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.getDirect()==0||enemyTank.getDirect()==2){
//左上角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+40
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+60){
return false;
}
//左下角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+40
&&getY()+40>=enemyTank.getY()&&getY()+40<=enemyTank.getY()+60){
return false;
}
}
//其他坦克:当向左或右 x范围[x,x+60] y范围[y,y+40]
if(enemyTank.getDirect()==1||enemyTank.getDirect()==3){
//左上角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+60
&&getY()>=enemyTank.getY()&&getY()<=enemyTank.getY()+40){
return false;
}
//左下角
if(getX()>=enemyTank.getX()&&getX()<=enemyTank.getX()+60
&&getY()+40>=enemyTank.getY()&&getY()+40<=enemyTank.getY()+40){
return false;
}
}
}
}
break;
}
return true;
}
@Override
public void run() {
while (true) {
//设置敌人最多发射的子弹数量
if(leap&&shots.size()<3){
switch (getDirect()){
case 0:
shot=new Shot(getX()+20,getY(),0);
break;
case 1:
shot=new Shot(getX()+60,getY()+20,1);
break;
case 2:
shot=new Shot(getX()+20,getY()+60,2);
break;
case 3:
shot=new Shot(getX(),getY()+20,3);
break;
}
shots.add(shot);
new Thread(shot).start();
}
boolean tag=true;
//敌人坦克移动
switch (getDirect()) {
case 0:
for (int i = 0; i < 30; i++) {
if(getY()>0&&isRunTank()){
moveUp();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 1:
for (int i = 0; i < 30; i++) {
if (getX()+60<1000&&isRunTank()){
moveRight();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 2:
for (int i = 0; i < 30; i++) {
if (getY()+60<750&&isRunTank()){
moveDown();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
case 3:
for (int i = 0; i < 30; i++) {
if (getX()>0&&isRunTank()){
moveLeft();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
break;
}
setDirect((int) (Math.random() * 4));
if (leap==false){
break;
}
}
}
}