java GUI版坦克大战

★最近闲的无聊,刚好看了下java的GUI,然后就做了个坦克大战练练手。

★以下是效果图

用到的知识也就j算ava的基础,包括java的语法,面向对象的思路,GUI,多线程,一点文件操作知识等。

编程思路

1.这里的进入界面和游戏界面分为两个面板,通过界面的切换实现选择和游戏功能。

2.定义一个坦克类,子类分别为我方坦克和敌方坦克,同时还有一个子弹类,成员主要包括,x,y,speed。方法见代码。

3.首先,坦克的移动是通过x,y的改变来实现的,同样,子弹的实现也是如此。

其次,如何把实际的动作显示到界面上是通过repaint()函数结合面板的多线程来实现的,我设置的是面板线程45毫秒repaint一次面板内容。我方坦克通过按键实现移动和攻击,敌方坦克通过线程控制,使用随机数来确定方向和射击的时间间隔。子弹也相当于一个线程,把子弹放到集合里去方便以后检测是否击中坦克或者是否击中障碍物。

最后,就是碰撞问题,intersects()可以检测两个矩形是否碰撞,当然,你就要返回一个矩形让函数去判断。坦克与坦克的碰撞,坦克与子弹的碰撞都可以这样实现,至于边界问题,可以通过面板x,y的最大值来限制。

4.解决线程并发导致的集合越界问题,解决图片闪烁问题。

综上,大概就这几个方面。


主要的目录如下()


代码实现主要是 TankPanel较为复杂,所以只放了TankPanel.java的代码,如下

(包括界面的实现,图形的重绘,线程的操作,坦克的碰撞等)

class TankPanel extends JPanel  implements KeyListener,Runnable,MouseListener
{
Tank_08 tank_08;

MyTank mytank=null;

EnemyTank enemy=null;

Impact impact=null;     

Impact boss=null;

Protectwall protectwall=null; 

Vector<Impact> impacts=new Vector();            //阻碍物集合
Vector<Impact> impacts1=new Vector();            //阻碍物集合 (子弹测试集合)

Vector<Protectwall> prowall=new Vector();       //保护墙集合

Vector<EnemyTank> enemytank=new Vector();          //敌人坦克的集合
int enemyCount=0;                                  //敌人坦克数量
static int enemyMaxCount=4;                               //敌人坦克的最大数量


boolean hitenemy=false;                           //敌人坦克是否存活
int hitx;                                         //敌人坦克被击中的坐标x
int hity;                                         //敌人坦克被击中的坐标y

boolean mylive=true;                               //自己的坦克是否存活

boolean upwalllive=true;                 
boolean leftwalllive=true;
boolean rightwalllive=true;


int M=3;            //时间分
double S=60;        //时间秒


static String diffcult="简单";

int shottime=0;    //控制我的子弹的发射时间
int shotnum=10;     //控制子弹的发射数量(未完成,因没有完成子弹消亡时间的设定)

int shottime1=0;    //控制敌人子弹的发射时间

int killcount=0;        //击杀的坦克数量
int grade=0;            //得分
int scount=0;           //射击的子弹数 

Shot myshot;
Shot enemyshot;

Vector<Shot> mtshot=new Vector();             //我的子弹的集合
Vector<Shot> enemyshots=new Vector(30);          //敌人某坦克的子弹集合
Vector<Vector<Shot>> allenemyshot=new Vector<Vector<Shot>>();  //敌人所有子弹集合

int bosshplength=200;

static boolean gameover=false;

public TankPanel() 
{
mytank=new MyTank(500,500);
impact=new Impact(190,200,400,40);
impacts.add(impact);
impact=new Impact(790,200,400,40);
impacts.add(impact);
impact=new Impact(500,450,400,40);
impacts.add(impact);
boss =new Impact(630,730,120,120);

impact=new Impact(190-40,200-25,440,40);
impacts1.add(impact);
impact=new Impact(790-40,200-25,440,40);
impacts1.add(impact);
impact=new Impact(500-40,450-25,440,40);
impacts1.add(impact);

protectwall=new Protectwall(575,700,230,30,0); //保护墙上
prowall.add(protectwall); //get(0);
protectwall=new Protectwall(575,700,30,230,3); //保护墙左
prowall.add(protectwall); //get(1);
protectwall=new Protectwall(775,700,30,200,1); //保护墙右
prowall.add(protectwall); //get(2);
}

Image im0=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/MyTank0.gif"));   //导入我的坦克图片,下同
Image im1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/MyTank1.gif"));
Image im2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/MyTank2.gif"));
Image im3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/MyTank3.gif"));

Image in0=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/shot0.gif"));  //导入子弹图片,下同
Image in1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/shot1.gif"));
Image in2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/shot2.gif"));
Image in3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/shot3.gif"));

Image ie0=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/enemy0.gif")); //导入敌人坦克图片,下同
Image ie1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/enemy1.gif"));
Image ie2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/enemy2.gif"));
Image ie3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/enemy3.gif"));

Image boom=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boom.gif")); //导入坦克爆炸图

Image wall=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/wall.gif")); //导入墙图

Image pwall=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/pwall.gif"));   //导入保护墙图,下同
Image pwall1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/pwall1.gif")); 

Image protect=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/protect.gif"));  //导入保护图
Image protect1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/protect1.gif"));  //导入受伤保护图
Image help=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/help.gif"));  //导入求救图





//定义画笔
public void paint(Graphics g)
{
super.paint(g);

g.fillRect(0, 0, 1690, 900);             //背景大小和颜色填充

g.setColor(Color.yellow); 
g.drawLine(3, 3, 3, 850);               //左边界
g.drawLine(3, 3, 1380, 0);              //上边界
g.drawLine(1380, 3, 1380, 850);         //右边界
g.drawLine(3, 850, 1380, 850);          //下边界

g.drawImage(wall, 190, 200, 400, 40,this); //障碍墙,下同

      g.drawImage(wall, 790, 200, 400, 40,this); 
      
      g.drawImage(wall, 500, 450, 400, 40,this);

      
if(upwalllive)
{
g.drawImage(pwall, 575, 700, 230, 30,this);  //保护墙,上
}
if(leftwalllive)
{
g.drawImage(pwall1, 575, 700, 30, 200,this); //保护墙,左
}
if(rightwalllive)
{
g.drawImage(pwall1, 775, 700, 30, 200,this); //保护墙,右
}






/窗口右边素材
g.setColor(Color.yellow); 
g.fillRect(1380, 1, 10, 850);   
g.fillRect(1380, 200, 310, 10); 
g.fillRect(1380, 400, 310, 10); 
g.fillRect(1380, 450, 310, 10); 
g.fillRect(1380, 150, 310, 10); 

g.drawString("WELCOME TO TANK WAR",1468 ,20);
/我的血量  
g.setColor(Color.gray); 
g.fillRect(1470, 65, 200, 10); 
g.setColor(Color.green); 
g.setFont(new Font("宋体",Font.BOLD,30));
g.fillRect(1470, 65, 190, 10); 

g.drawString("HP",1430 ,80);

g.drawImage(im0, 1398, 54, 25,25,this);
/我的血量

/boss血量
g.setColor(Color.gray); 
g.fillRect(1470, 115, 200, 10); 

if(bosshplength<90)
{
g.drawImage(help, 630, 730, 120, 120,this); //需要保护的(受伤)
// g.drawImage(help, 630, 580, 120, 120,this); //help
g.setColor(Color.red); 
g.setFont(new Font("宋体",Font.BOLD,30));
g.fillRect(1470, 115, bosshplength, 10); 
g.drawString("HP",1430 ,130);
g.drawImage(help, 1398, 104, 25,25,this);


}
else
{
g.drawImage(help, 630, 730, 120, 120,this); //需要保护的


g.setColor(Color.green); 
g.setFont(new Font("宋体",Font.BOLD,30));
g.fillRect(1470, 115, bosshplength, 10); 
g.drawString("HP",1430 ,130);
g.drawImage(help, 1398, 104, 25,25,this);

}
//boss血量

///倒计时
String MM=String.valueOf(M);
String SS=String.valueOf((int)S);
g.setColor(Color.MAGENTA); 
g.setFont(new Font("宋体",Font.BOLD,25));
g.drawString("Time",1400 ,190);
g.drawString(MM,1500 ,190);
g.drawString(":",1525 ,190);
g.drawString(SS,1550 ,190);
g.drawString(diffcult,1600 ,190);
///倒计时



//提示
g.setColor(Color.blue);
g.setFont(new Font("宋体",Font.BOLD,25));
g.drawString("W",1420 ,250);
g.drawString("向上移动",1500 ,250);

g.drawString("D",1420 ,280);
g.drawString("向右移动",1500 ,280);

g.drawString("S",1420 ,310);
g.drawString("向下移动",1500 ,310);

g.drawString("A",1420 ,340);
g.drawString("向左移动",1500 ,340);

g.drawString("J",1420 ,370);
g.drawString("发射子弹",1500 ,370);
//提示

//得分规则
g.setFont(new Font("宋体",Font.BOLD,20));
g.setColor(Color.blue);
g.drawString("得分规则 F=(K*5000)/S",1420 ,438);
//得分规则

//得分

g.setFont(new Font("宋体",Font.BOLD,25));
g.setColor(Color.blue);
g.drawString("击杀",1420 ,508);
g.drawString("射击",1420 ,548);
g.drawString("得分",1420 ,588);
g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString("X",1545 ,506);
g.drawString("X",1545 ,546);
g.drawImage(ie0, 1490, 487, 25,25,this);
g.drawImage(in0, 1490, 527, 25,25,this);
g.setColor(Color.RED);
g.drawString((String.valueOf(killcount)),1585 ,507);
g.drawString((String.valueOf(scount)),1585 ,547);

g.setColor(Color.green);
g.setFont(new Font("宋体",Font.BOLD,25));
g.drawString((String.valueOf(grade)),1510 ,587);


//得分

说明
// g.setColor(Color.gray);
// g.fillRect(1390, 630, 310, 230); 



   说明
/窗口右边素材

if(gameover)
{
g.setColor(Color.black);
g.fillRect(400, 300, 600, 300); 
g.setColor(Color.blue);
g.setFont(new Font("华文行楷",Font.BOLD,40));
g.drawString("游戏结束",600 ,360);

g.setFont(new Font("宋体",Font.BOLD,25));
g.setColor(Color.gray);
g.drawString("击杀",550 ,410);
g.drawString("射击",550 ,450);
g.drawString("得分",550 ,490); 
g.drawString("排名",550 ,530); 
g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString("X",675 ,408); 
g.drawString("X",675 ,448);
g.drawImage(ie0, 625, 389, 25,25,this);
g.drawImage(in0, 625, 429, 25,25,this);
g.setColor(Color.RED);
g.drawString((String.valueOf(killcount)),710 ,409);
g.drawString((String.valueOf(scount)),710 ,449);

g.setColor(Color.green);
g.setFont(new Font("宋体",Font.BOLD,25));
g.drawString((String.valueOf(grade)),685 ,489);

g.setColor(Color.blue);
g.drawString("排行榜",852 ,375);
g.drawString("1.",840 ,405);
g.drawString("2.",840 ,435);
g.drawString("3.",840 ,465);
g.drawString("4.",840 ,495);

g.drawLine(830, 500, 950, 500);   //排行榜,下同
g.drawLine(830, 350, 950, 350);  
g.drawLine(830, 500, 830, 350);
g.drawLine(950, 500, 950, 350); 

g.drawLine(830, 380, 950, 380);  //排行榜分割线。下同
g.drawLine(830, 410, 950, 410); 
g.drawLine(830, 440, 950, 440); 
g.drawLine(830, 470, 950, 470); 

g.fillRect(540, 555, 80, 30);  //重新开始或者退出按钮
g.fillRect(680, 555, 80, 30); 

g.setColor(Color.white);
g.setFont(new Font("宋体",Font.BOLD,17));
g.drawString("重新开始",545 ,578);
g.drawString("查看排名",685 ,578);
g.setColor(Color.gray);
g.drawString("重新开始",546 ,579);
g.drawString("查看排名",686 ,579);

mylive=false;


}


if(!mylive)
{
g.drawImage(boom, mytank.x, mytank.y, 30, 30,this); 
g.drawImage(boom, mytank.x+20, mytank.y, 30, 30,this); 
g.drawImage(boom, mytank.x+20, mytank.y+20, 30, 30,this); 
g.drawImage(boom, mytank.x, mytank.y+20, 30, 30,this); 
}
else
{
switch(mytank.direct)                   //mytank画图
{
case 0:
g.drawImage(im0, mytank.x, mytank.y, 50, 50,this); 
break;
case 1:
g.drawImage(im1, mytank.x, mytank.y, 50, 50,this); 
break;
case 2:
g.drawImage(im2, mytank.x, mytank.y, 50, 50,this); 
break;
case 3:
g.drawImage(im3, mytank.x, mytank.y, 50, 50,this); 
break;  
}


for(int i = 0;i < mtshot.size();i++)      //我的坦克子弹画图
{ 
if(mtshot.get(i)!=null)       
{
if(Impactwall1(mtshot.get(i),impacts1) || SImpactWall(mtshot.get(i)) )    //子弹边界消亡判断
{
mtshot.remove(mtshot.get(i));                                        //如果边界条件触发,将子弹从当前集合中移除
}
else
{
switch(mtshot.get(i).direct)
{
case 0:
g.drawImage(in0, mtshot.get(i).x+23, mtshot.get(i).y, 10, 10,this); 
break;
case 1:
g.drawImage(in1, mtshot.get(i).x+47, mtshot.get(i).y+23, 10, 10,this); 
break;
case 2:
g.drawImage(in2, mtshot.get(i).x+23, mtshot.get(i).y+47, 10, 10,this); 
break;
case 3:
g.drawImage(in3, mtshot.get(i).x, mtshot.get(i).y+23, 10, 10,this); 
break;  
   }
} 
}
} 
}


int elx=50;
int ely=50;

for(int i=enemyCount;i<enemyMaxCount;i++)
{
enemy=new EnemyTank(elx,ely);
      elx+=((int)(Math.random()*2)+1)*100;          //通过随机数随机控制地方坦克的出现位置
      ely+=((int)(Math.random()*1)+1)*30;          //通过随机数随机控制地方坦克的出现位置
enemyCount++;
Thread TT=new Thread(enemy);
TT.start();
enemytank.add(enemy);
}


for(int i=0;i<enemytank.size();i++)
{
if(!hitenemy)
{
if(enemytank.get(i)!=null && !TImpactWall(enemytank.get(i)) && !Impactwall(enemytank.get(i),impacts) && !ImpactProwall(enemytank.get(i),prowall))  //检测敌人坦克是否碰撞障碍物(目前效果不行,待改进)
{
switch(enemytank.get(i).direct)                     //enemytank画图
{
case 0:
g.drawImage(ie0, enemytank.get(i).x, enemytank.get(i).y, 50, 50,this); 
break;
case 1:
g.drawImage(ie1, enemytank.get(i).x, enemytank.get(i).y, 50, 50,this); 
break;
case 2:
g.drawImage(ie2, enemytank.get(i).x, enemytank.get(i).y, 50, 50,this); 
break;
case 3:
g.drawImage(ie3, enemytank.get(i).x,enemytank.get(i).y, 50, 50,this); 
break;  
   }
    }
else
{
enemytank.get(i).direct = (int)(Math.random()*4);
}
}
else
{
g.drawImage(boom, hitx, hity, 30, 30,this);      //绘制爆炸效果图,下同
g.drawImage(boom, hitx+20, hity, 30, 30,this); 
g.drawImage(boom, hitx+20, hity+20, 30, 30,this); 
g.drawImage(boom, hitx, hity+20, 30, 30,this); 
hitenemy=false;
}

}









for(int i=0;i<allenemyshot.size();i++)
{
for(int j = 0;j < allenemyshot.get(i).size();j++)      //敌人坦克子弹画图
{ 
if(allenemyshot.get(i).get(j)!=null)       
{
if(allenemyshot.get(i).get(j).x<5 || SImpactWall(allenemyshot.get(i).get(j)) 
   || Impactwall1(allenemyshot.get(i).get(j),impacts1) || ShotHitProwall(allenemyshot.get(i).get(j),prowall) )           //子弹边界消亡判断
{
allenemyshot.get(i).remove(allenemyshot.get(i).get(j));                    //如果边界条件触发,将子弹从当前集合中移除
}
else
{
switch(allenemyshot.get(i).get(j).direct)
{
case 0:
g.drawImage(in0, allenemyshot.get(i).get(j).x+23, allenemyshot.get(i).get(j).y, 10, 10,this); 
break;
case 1:
g.drawImage(in1, allenemyshot.get(i).get(j).x+47, allenemyshot.get(i).get(j).y+23, 10, 10,this); 
break;
case 2:
g.drawImage(in2, allenemyshot.get(i).get(j).x+23, allenemyshot.get(i).get(j).y+47, 10, 10,this); 
break;
case 3:
g.drawImage(in3, allenemyshot.get(i).get(j).x, allenemyshot.get(i).get(j).y+23, 10, 10,this); 
break;  
   }
} 
}
} 
}




}//paint方法结束




@Override
public void keyTyped(KeyEvent e) {

}




@Override
public void keyPressed(KeyEvent e) {
if(mylive)
{
if(!TImpactWall(mytank)&& !Impactwall(mytank,impacts) && !ImpactProwall(mytank,prowall) ) //
{
if(e.getKeyCode()==KeyEvent.VK_W)         //坦克移动方向(上)
{
mytank.Moveup();
}
else if(e.getKeyCode()==KeyEvent.VK_D)    //坦克移动方向(右)
{
mytank.Moveright();
}
else if(e.getKeyCode()==KeyEvent.VK_S)    //坦克移动方向(下)
{
mytank.Movedown();
}
else if(e.getKeyCode()==KeyEvent.VK_A)    //坦克移动方向(左)
{
mytank.Moveleft();
} 
}
}



if(shottime>10)    //每450毫秒可以发射1发(Thread * 10)(我的坦克)
{ 
if(e.getKeyCode()==KeyEvent.VK_J)
{
myshot=new Shot(mytank.x,mytank.y ,mytank.direct);          //根据当前的坦克位置初始化子弹的构造函数
Thread T=new Thread(myshot);                
T.start();                                                  //子弹的多线程
mtshot.add(myshot);                                         //把当前的子弹加入到子弹集合中
shottime=0;
scount++;
}



}


}




@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseClicked(MouseEvent e) {
if(gameover==true)
{
if(e.getX()<620 &&e.getX()>540 && e.getY()<615 && e.getY()>580)
{
// System.out.println("当前的横坐标:"+e.getX());
// System.out.println("当前的纵坐标"+e.getY());
gameover=false;
mylive=true;

// tank_08=new Tank_08(new TankPanel());




}
if(e.getX()<760 &&e.getX()>700 && e.getY()<615 && e.getY()>580)
{
// System.out.println("当前的横坐标:"+e.getX());
// System.out.println("当前的纵坐标"+e.getY());
}
}


}




@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}




@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub


}




@Override
public void mouseEntered(MouseEvent e) {



}




@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}


@Override
public void run()                  //TankPanel的多线程绘图
{
while(true)
{
try {
Thread.sleep(45);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

GameOver();    //判断游戏是否结束

if(scount>1)  //当射击子弹数量大于1时开始计算积分,因为被除数不能为0,否则报错
{
grade=(killcount*5000)/scount;
}


S-=0.05;
if(S<0)
{
M--;
S=60;


}

shottime++;          //我的子弹发射时间间隔
shottime1++;         //敌人子弹发射时间间隔
repaint();           //TankPanel面板重绘

for(int i=0;i<prowall.size();i++)      //保护墙生命值判断
{
if(prowall.get(i).wallhp==0)
{
switch(prowall.get(i).direct)
{
case 0:
upwalllive=false;
break;
case 1:
rightwalllive=false;
break;
case 3:
leftwalllive=false;
break;
}
prowall.remove(prowall.get(i));
break;
}
}
// synchronized 

for(int i = 0;i < mtshot.size();i++)      //子弹击中敌人坦克消亡
{ 
if(mtshot.get(i)!=null)       
{
for(int j=0;j<enemytank.size();j++)
{ 
if(ShotHitTank(mtshot.get(i),enemytank.get(j)))
{
hitenemy=true;            //有敌人坦克被击中
hitx=enemytank.get(j).x;  //返回当前被击中坦克的坐标x
hity=enemytank.get(j).y;  //返回当前被击中坦克的坐标y

mtshot.remove(mtshot.get(i));          //将子弹从集合移除
enemytank.remove(enemytank.get(j));  //将敌人坦克从集合中移除
killcount++;
enemyCount--;
break;
}

}
}
}

for(int i = 0;i < allenemyshot.size();i++) //bosshp
{
for(int j=0;j<allenemyshot.get(i).size();j++)
{
if(Hitboss(allenemyshot.get(i).get(j)))
{
bosshplength-=10;
allenemyshot.get(i).remove(allenemyshot.get(i).get(j));
break;
}
}
}

for(int i = 0;i < allenemyshot.size();i++)      //子弹击中自己坦克消亡
{ 
if(mytank!=null)       
{
for(int j=0;j<allenemyshot.get(i).size();j++)
{ 
if(ShotHitTank(allenemyshot.get(i).get(j),mytank))
{
mylive=false;
break;
}

}
}
}

if(shottime1>20)        //敌人坦克发射控制
{
for(int i=0;i<enemytank.size();i++)
{
if(enemytank.get(i)!=null)
{
enemyshot=new Shot(enemytank.get(i).x,enemytank.get(i).y,enemytank.get(i).direct);
Thread T=new Thread(enemyshot);                
T.start(); 
enemyshots.add(enemyshot);
shottime1=0;
allenemyshot.add(enemyshots);
   }
}
}
}
}//run方法结束


public boolean Impactwall1(Shot s,Vector<Impact> v)       //子弹碰撞障碍物判断
{
for(int j=0;j<v.size();j++)
{
if(s.getRect().intersects(v.get(j).getRect()))
{
return true;
}
}
return false;
}

public boolean ShotHitProwall(Shot s,Vector<Protectwall> p)       //子弹碰撞保护墙判断
{
for(int j=0;j<p.size();j++)
{
if(s.getRect().intersects(p.get(j).getRect()))
{
p.get(j).wallhp--;
return true;
}
}
return false;
}


public boolean SImpactWall(Shot S)           //子弹碰撞边界判断
{
if(S.x<5 || S.x>1328 || S.y<5 || S.y>798)
{
return true;
}
else 
{
return false;
}
}




public boolean Impactwall(Tank e,Vector<Impact> v)       //坦克碰撞障碍物判断
{
for(int i=0;i<v.size();i++)
{
if(e.getRect().intersects(v.get(i).getRect()))
{

switch(e.direct)
{
case 0:
e.y+=3;
break;
case 1:
e.x-=3;
break;
case 2:
e.y-=3;
break;
case 3:
e.x+=3;
break;
}
return true;
}
}
return false;
}

public boolean ImpactProwall(Tank e,Vector<Protectwall> p)   //坦克碰撞保护墙判断
{

for(int i=0;i<p.size();i++)
{
if(e.getRect().intersects(p.get(i).getRect()))
{
switch(e.direct)
{
case 0:
e.y+=3;
break;
case 1:
e.x-=3;
break;
case 2:
e.y-=3;
break;
case 3:
e.x+=3;
break;
}
return true;
}
}
return false;
}


public boolean TImpactWall(Tank T)         //坦克边界条件判断
{
if(T.x<5)
{
T.x+=2;
return true;
}
else if(T.x>1329)
{
T.x-=2;
return true;
}
else if(T.y<5)
{
T.y+=2;
return true;
}
else if(T.y>800)
{
T.y-=2;
return true;
}
else
{
return false;
} 
}



public boolean ShotHitTank(Shot S,Tank T)  //子弹打中坦克
{
if(S.getRect().intersects(T.getRect1()))
{
return true;
}
else
{
return false;
}
}


public boolean Hitboss(Shot S)    //敌人坦克击中boss
{
if(S.getRect().intersects(boss.getRect()))
{
return true;
}
else
{
return false;
}
}


public void GameOver()
{
if(mylive==false || bosshplength==0 || (M==0 && S<=0) || killcount==20) //游戏结束条件   1.我的坦克死亡   2.boss生命值为0  3.游戏时间结束  4.击杀20辆坦克
{
gameover=true;
// System.exit(0);
}

}




}//TankPanel类结束



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值