JAVA项目学习之坦克大战单机版

本科阶段尽管学过JAVA课程,却始终感觉在云里雾里。这段时间认真学习了马士兵老师JAVA基础教程,跟着写了TankWar的小项目,感觉对JAVA中类的使用有了许多新的认识,思路比原来也清晰多了,在此总结一下TankWar小项目。

TankWar项目一共有6个类:

TankClient类:相当于整个游戏的大管家,每个类都有一个TankClient的引用,其负责游戏窗口的重绘。难点:双缓冲消除闪烁;线程重绘保证移动均匀,paint()方法应该调用其他类自身的draw()方法,也就是所谓的画自己;同理,按键的相应也有其他类自身实现。

Tank类:可以根据属性产生自身或者是敌人,根据面向对象的思想,Tank发Missile,即fire()方法应该包含在Tank类中。难点:实现8个方向的移动;碰撞检测(Rectangle的使用);智能Tank的实现(使用Random),无规则运动,可自己发炮弹;设置记录先前位置的oldX、oldY变量,碰撞后可以回到先前位置(stay方法)。

Missile类:可以根据属性产生自身Missile或者是敌人Missile,根据面向对象的思想,Missile打Tank,即hitTank()方法应该包含在Missile类中。难点:可利用Tank所定义的枚举方向变量。

Explode类:产生Explode效果,即绘制一组从小到大再到小的圆。

Wall类:设置Wall障碍物。

Blood类:可以给Tank增加Blood。

难点代码示例:

(1)双缓冲消除闪烁

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.BLACK);
		gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
		gOffScreen.setColor(c);
		paint(gOffScreen);
		g.drawImage(offScreenImage, 0, 0, null);

	}
(2)实现8个方向的移动

enum direction {L, LU, U, RU, R, RD, D, LD, STOP};
private boolean bL = false, bU = false, bR = false, bD = false;
public void locateDirection() {
		if (bL && !bU && !bR && !bD)
			dir = direction.L;
		else if (bL && bU && !bR && !bD)
			dir = direction.LU;
		else if (!bL && bU && !bR && !bD)
			dir = direction.U;
		else if (!bL && bU && bR && !bD)
			dir = direction.RU;
		else if (!bL && !bU && bR && !bD)
			dir = direction.R;
		else if (!bL && !bU && bR && bD)
			dir = direction.RD;
		else if (!bL && !bU && !bR && bD)
			dir = direction.D;
		else if (bL && !bU && !bR && bD)
			dir = direction.LD;
		else if (!bL && !bU && !bR && !bD)
			dir = direction.STOP;
	}

	public void move() {
		switch (dir) {
		case L:
			x -= XSPEED;
			break;
		case LU:
			x -= XSPEED;
			y -= YSPEED;
			break;
		case U:
			y -= YSPEED;
			break;
		case RU:
			x += XSPEED;
			y -= YSPEED;
			break;
		case R:
			x += XSPEED;
			break;
		case RD:
			x += XSPEED;
			y += YSPEED;
			break;
		case D:
			y += YSPEED;
			break;
		case LD:
			x -= XSPEED;
			y += YSPEED;
			break;
		}
	}

(3)智能Tank的实现(使用Random),无规则运动,可自己发炮弹

 			private Random r = new Random();
			direction dirs[] = direction.values();
			if (step == 0) {
				step = r.nextInt(12) + 3;
				int rn = r.nextInt(dirs.length);
				dir = dirs[rn];
			}
			step--;
			if (r.nextInt(50) > 47)
				fire();

(4)碰撞检测(Rectangle的使用)

public Rectangle getRect() {
		return new Rectangle(x, y, WIDTH, HEIGHT);
	}
this.getRect().intersects(b.getRect());


你可能感兴趣的:(java,面向对象)