大概用了两天半的课余,一共四五个多小时的时间做的,一千行代码的小游戏。先实现了尚学堂版坦克大战,一边看PPT一边自己写,不会实现的地方看视频,一点点做了来以后,然后根据自己的想法进行了修改:
1. 加强AI,优化了坦克撞墙不回头的问题
2. 敌我使用两种颜色子弹
3. 敌方坦克死光后,随机生成十辆坦克,并避免卡墙。
代码:
TankClient.java
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class TankClient extends Frame {
Image offScreenImage = null;
Tank tank = new Tank(600,325,this,Tank.Direction.STOP,true);
LinkedList<Missile> missiles = new LinkedList<Missile>();
LinkedList<Explode> explodes = new LinkedList<Explode>();
LinkedList<Tank> tanks = new LinkedList<Tank>();
LinkedList<Missile> eMissiles = new LinkedList<Missile>();
Blood b = new Blood();
Random r = new Random(); //添加随机数,用于随机生成坦克
Wall w=new Wall(500, 200, 20, 250, this);
public static final int WINDOW_HEIGHT = 600,WINDOW_WIDTH = 800;
public static void main(String[] args) {
new TankClient().launchFrame();
}
public void launchFrame(){
for(int i=0;i<10;i++){
tanks.add(new Tank(50, (50*i+120), this, Tank.Direction.D, false));
}
setBounds(600,300,WINDOW_WIDTH,WINDOW_HEIGHT);
setVisible(true);
this.setResizable(false);
this.addKeyListener(new KeyMonitor());
setBackground(Color.lightGray);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
setVisible(false);
System.exit(0);
}
});
new Thread(new rePaint()).start();
}
public void paint(Graphics g)
{
if(tanks.size()<=0){
for(int i=0;i<10;i++){
int newX,newY;
Tank t = new Tank(newX=r.nextInt(500),newY=r.nextInt(600), this, Tank.Direction.D, false); //用于随机生成坦克
while(new Rectangle(newX,newY,30,30).intersects( w.getRect())){ //与墙进行碰撞检测
t = new Tank(newX=r.nextInt(500),newY=r.nextInt(600), this, Tank.Direction.D, false);
}
tanks.add(t);
}
}
Color c = g.getColor();
/*
for(Missile m:missiles) //用此种循环会出现Exception,故放弃
{
if(!m.getExist())
missiles.remove(m);
m.drawMissile(g);
m.hitTank(eTank);
}
*/
for(int i=0;i<missiles.size();i++){
Missile m = missiles.get(i);
m.hitTanks(tanks);
m.hitTank(tank);
m.drawMissile(g);
m.hitWall(w);
}
for(int i=0;i<tanks.size();i++){
Tank t = tanks.get(i);
t.collidesWall(w);
t.drawTank(g);
t.collidesTanks(tanks);
}
tank.collidesWall(w);
tank.collidesTanks(tanks);
tank.eat();
for(int i=0;i<explodes.size();i++)
{
Explode e = explodes.get(i);
e.draw(g);
}
w.drawWall(g);
b.draw(g);
g.drawString("missiles count:"+missiles.size(), 30, 60);
g.drawString("explodes count:"+explodes.size(), 30, 75);
g.drawString("enemy tanks count:"+tanks.size(), 30, 90);
g.drawString("tank life:"+tank.getLife(), 30, 105);
tank.drawTank(g);
g.setColor(c);
}
public void update(Graphics g){
if(offScreenImage==null){
offScreenImage = this.createImage(WINDOW_WIDTH, WINDOW_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.lightGray);
gOffScreen.fillRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen