📄 smarttank.java
字号:
//------------------------------------------------------------------------------
public final class SmartTank extends EnemyTank{
protected SmartTank(boolean hasPrize) {
super(hasPrize);
direction=BattleField.SOUTH;
speed=ResourceManager.TILE_WIDTH/2;
score=Score.SCORE_300;
}
private boolean lookforPlayer(int dir){
PlayerTank playerTank=(PlayerTank)TANK_POOL[0];
int playerX = playerTank.getRefPixelX();
int playerY = playerTank.getRefPixelY();
int dx=0;int dy=0;
if(dir == BattleField.NORTH){
dy = -speed;
} else if(dir == BattleField.SOUTH){
dy = speed;
} else if(dir == BattleField.EAST){
dx = speed;
} else if(dir == BattleField.WEST){
dx = -speed;
} else{
return false;
}
int myx = this.getRefPixelX();
int myy = this.getRefPixelY();
int width = battleField.getWidth();
int height = battleField.getHeight();
while(myx > 0 && myx < width && myy > 0 && myy < height){
//if(battleField.hitWall(myx,myy,0)){return false;}
if(myx > playerX - speed && myx < playerX + speed && myy > playerY - speed && myy < playerY +speed){
return true;
}
myx+=dx;
myy+=dy;
}
return false;
}
public void think(){
PlayerTank playerTank=(PlayerTank)TANK_POOL[0];
int newdir = BattleField.SOUTH;
int minDistance=Integer.MAX_VALUE;
int distance=0;
boolean blockedeast = battleField.containsImpassableArea
(getX() + speed, getY(), getWidth(), getHeight());
boolean blockedsouth = battleField.containsImpassableArea
(getX(),getY() + speed, getWidth(), getHeight());
boolean blockedwest = battleField.containsImpassableArea
(getX()-speed,getY(),getWidth(), getHeight());
boolean blockednorth = battleField.containsImpassableArea
(getX(),getY() - speed, getWidth(), getHeight());
if(direction == BattleField.NORTH){
if(!blockedwest){
distance=(getX()-speed-playerTank.getX())*
(getX()-speed-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.WEST;
minDistance=distance;
}
}
if(!blockedeast){
distance=(getX()+speed-playerTank.getX())*
(getX()+speed-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.EAST;
minDistance=distance;
}
}
if(!blockednorth){
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-speed-playerTank.getY())*
(getY()-speed-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NORTH;
minDistance=distance;
}
}
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NONE;
minDistance=distance;
}
}else if(direction == BattleField.WEST){
if(!blockedwest){
distance=(getX()-speed-playerTank.getX())*
(getX()-speed-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.WEST;
minDistance=distance;
}
}
if(!blockedsouth){
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()+speed-playerTank.getY())*
(getY()+speed-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.SOUTH;
minDistance=distance;
}
}
if(!blockednorth){
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-speed-playerTank.getY())*
(getY()-speed-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NORTH;
minDistance=distance;
}
}
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NONE;
minDistance=distance;
}
}else if(direction == BattleField.SOUTH){
if(!blockedwest){
distance=(getX()-speed-playerTank.getX())*
(getX()-speed-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.WEST;
minDistance=distance;
}
}
if(!blockedsouth){
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()+speed-playerTank.getY())*
(getY()+speed-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.SOUTH;
minDistance=distance;
}
}
if(!blockedeast){
distance=(getX()+speed-playerTank.getX())*
(getX()+speed-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.EAST;
minDistance=distance;
}
}
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NONE;
minDistance=distance;
}
}else if(direction == BattleField.EAST){
if(!blockednorth){
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-speed-playerTank.getY())*
(getY()-speed-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NORTH;
minDistance=distance;
}
}
if(!blockedsouth){
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()+speed-playerTank.getY())*
(getY()+speed-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.SOUTH;
minDistance=distance;
}
}
if(!blockedeast){
distance=(getX()+speed-playerTank.getX())*
(getX()+speed-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.EAST;
minDistance=distance;
}
}
distance=(getX()-playerTank.getX())*
(getX()-playerTank.getX())+
(getY()-playerTank.getY())*
(getY()-playerTank.getY());
if(distance<minDistance){
newdir = BattleField.NONE;
minDistance=distance;
}
}else{
if((Math.abs(rnd.nextInt()) %10) >5){
//every so often, go crazy
newdir = Math.abs(rnd.nextInt()) % 4;
}
}
changeDirection(newdir);
shoot=false;
int shooting=Math.abs(rnd.nextInt()) % 100;
if(shooting>=50 ||lookforPlayer(direction)) {
shoot=true;
}
super.think();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -