JAVA游戏《坦克大战》

JAVA游戏《坦克大战》

一、功能实现
游戏场景生成,坦克八方位自由移动,坦克炮弹发射摧毁敌军,敌军坦克自动生成且自动移动,坦克及炮弹的碰撞检测。
八方位自由移动
可使用方向键移动也可以使用“W、A、S、D”进行移动,同时按下“上键”与“右键”坦克可往右上角移动,左上角、右下角等同理。

发射炮弹摧毁敌军
可通过“空格”、“Ctrl”键发射炮弹,炮弹击中敌军可摧毁敌军并显示爆炸效果。

二、经典代码
坦克八方位移动的判断。

private boolean bl=false,bu=false,br=false,bd=false;//四个按键的状态
enum Direction{l,lu,u,ru,r,rd,d,ld,stop}; //枚举
private Direction dir=Direction.stop;
//监听键盘按下
public void keyPressed(KeyEvent e){
	int key=e.getKeyCode();
	char keyc=e.getKeyChar();
	if(key==KeyEvent.VK_RIGHT || keyc=='d'){//右
		br=true;
	}else if(key==KeyEvent.VK_LEFT  || keyc=='a'){//左
		bl=true;
	}else if(key==KeyEvent.VK_UP  || keyc=='w'){//上
		bu=true;
	}else if(key==KeyEvent.VK_DOWN || keyc=='s'){//下
		bd=true;
	}
	locateDirection(); 
}
//监听键盘抬起		
public void  keyReleased(KeyEvent e){
	int key=e.getKeyCode();
	char keyc=e.getKeyChar();
	if(key==KeyEvent.VK_RIGHT || keyc=='d'){//右
		br=false;
	}else if(key==KeyEvent.VK_LEFT  || keyc=='a'){//左
		bl=false;
	}else if(key==KeyEvent.VK_UP  || keyc=='w'){//上
		bu=false;
	}else if(key==KeyEvent.VK_DOWN || keyc=='s'){//下
		bd=false;
	}
	locateDirection();
}
//判断坦克移动方向	 
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(){
	int yx=x;int yy=y;
	switch(dir){
	case l:
		x -= speed;break;
	case lu:
		x -= speedxd;y -= speedxd;break;
	case u: 
		y -= speed;break;
	case ru:
		x += speedxd;y -= speedxd;break;
	case r:
		x += speed;break;
	case rd:
		x += speedxd;y += speedxd;break;
	case d:
		y += speed;break;
	case ld:
		x -= speedxd;y += speedxd;break;
	case stop:
		break; 
	}
	if(dir!=Direction.stop){
		ptdir=dir;
	}
	//判断是否移动后是否超出界面,超出则将位置恢复。
	if(x<=0 || y<=25 || x >= (tankedz.width-50) || y>=(tankedz.height-50) || gitTanks()){
		x=yx;y=yy;
	}
}

public boolean hitTank(Tank t){
	if(t!=this){
		if(this.getRect().intersects(t.getRect())){//检查碰撞
			return true;
		}
	}
	return false;
}
public boolean gitTanks(){
	//判断当前坦克是否与其它坦克碰撞
	for(int i=0;i<tc.tankes.size();i++){
		if(hitTank(tc.tankes.get(i))){
			return true;
		}
	}
	//判断当前坦克是否与玩家坦克碰撞
	if(this!=tc.mytank){
		if(this.getRect().intersects(tc.mytank.getRect())){
			return true;
		}
	}
	return false;
}

三、开发过程中遇到的问题与总结
在这个小游戏的开发过程中遇到了很多的小bug,不过都是一一解决了,其中敌军坦克的随机生成及自动生成行进路线弄的比较久,并且还要判断敌军坦克的移动是否会发生碰撞并要进行调头转弯等处理。通过这个游戏的开发获得的最大收获是我了解了JAVA面向对象的思想,将多个对象进行封装与处理,并且也了解游戏开发的难度,哪怕是个一个小游戏也要进行多方面的考虑。

你可能感兴趣的:(丘秋项目,JAVA)