本版本做最后的修正:敌人死光重新加入,主战坦克死掉F2重新开始。
1.主类中: 画方法里面判断,如果无敌方坦克,就添加。
if(tanks.size()<=0){
for(int i=0;i<10;i++){
tanks.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this));
}
}
2.坦克类中:按键监听里面,如果战亡,重新复活。
case KeyEvent.VK_F2:
if(!this.live){
this.live = true;
this.life= 100;
}
本版本为最后一个版本,一个小坦克项目写了这么久也是不容易啊,希望以后多看,麻雀虽小五脏俱全,里面涉及到的java基础知识很多,面向对象,集合,泛型,内部类, 线程,监听,变量,数据,对象,构造方法,this等等的用法。还有做项目的思维,一步一步不能太急,再难的问题,分解下来就会很简单。
下一阶段:复习java知识,投递简历。
附tankClient的代码:
public class TankClient extends Frame {
public static final int GAME_WIDTH =800;
public static final int GAME_HEIGHT =600;
Tank myTank = new Tank(50, 50,true,Tank.Direction.STOP,this);
//Tank enemyTank = new Tank(100,100,false,this);
Wall w1 = new Wall(100, 200, 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);
Image offScreenImage = null;
List<Missile> missiles = new ArrayList<Missile>(); //泛型 删加 效率相对高
List<Explode> explodes = new ArrayList<Explode>();
List<Tank> tanks = new ArrayList<Tank>();
Blood b = new Blood();
public void paint(Graphics g) {
g.drawString("missiles count:"+missiles.size(), 10,50);
//g.drawString("explodes count:"+explodes.size(), 10,70);
if(tanks.size()<=0){
for(int i=0;i<10;i++){
tanks.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this));
}
}
for (int i = 0; i < missiles.size(); i++) {
Missile m = missiles.get(i);
m.hitWall(w1);
m.hitWall(w2);
m.draw(g);
m.hitTanks(tanks);
m.hitTank(myTank);
}
for (int i = 0; i < explodes.size(); i++) {
Explode e = explodes.get(i);
e.draw(g);
}
for(int i=0; i<10; i++){
Tank t = tanks.get(i);
t.collidesWithWall(w1);
t.collidesWithWall(w2);
t.collidesWithTanks(tanks);
t.draw(g);
}
b.draw(g);
w1.draw(g);
w2.draw(g);
myTank.draw(g);
myTank.eat(b);
}
public void update(Graphics g) {
if(offScreenImage == null){
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GRAY);
gOffScreen.fillRect(0, 0, 800, 600);
gOffScreen.setColor(c);
print(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public void lauchFrame(){
for(int i=0;i<10;i++){
tanks.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this));
}
this.setSize(GAME_WIDTH,GAME_HEIGHT);
this.setTitle("TankWar");
this.setLocation(80, 60);
this.setVisible(true);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
new Thread(new paintThread()).start();
this.addKeyListener(new KeyMonitor());
}
public static void main(String[] args) {
TankClient tc = new TankClient();
tc.lauchFrame();
}
private class paintThread implements Runnable { //线程 内部类 为此线程服务
public void run() {
while(true){
repaint();
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private class KeyMonitor extends KeyAdapter{
public void keyReleased(KeyEvent e) {
myTank.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
myTank.keyPressed(e);
}
}
}