TankWar 单机(JAVA版)版本1.9 敌军坦克自动移动 自动攻击 及判断边界
原创
©著作权归作者所有:来自51CTO博客作者scx_white的原创作品,请联系作者获取转载授权,否则将追究法律责任
按照项目来吧
首先是让敌军坦克动起来 ,要想让敌军坦克动起来 要明白我方坦克是怎么动的呢?
你会说按上下左右键 ,仔细想想怎么让敌军坦克模拟按了上下左右键?
我们按上下左右键主要是让给坦克一个方向,不停按就会移动 也就是步数。
概括可以得到 只要给坦克步数和方向就能实现自动移动了。
获得随机方向:
首先定义一个变量
//随机数
private Random r=new Random();
然后为敌方坦克设置方向
private void setRandomDir() {
Direction[] ranDir = { Direction.U, Direction.D, Direction.L,
Direction.R, Direction.LU, Direction.RU, Direction.LD,
Direction.RD };
curDir=ptDir=ranDir[r.nextInt(ranDir.length)];
}
把所有的方向放到一个数组中 利用随机数 来为坦克的方向赋值
然后就是设置要移动的步数
也是利用随机数 。
定义一个变量
//移动的步数
private int step;
在move方法里面增加这一段代码
//如果是敌方坦克
if(!good)
{
//移动的步数为0时 重新赋值
if(step==0){
step=r.nextInt(20);
setRandomDir();
}
//步数减一
else{
step--;
}
}
然后在draw方法里面调用move方法即可
运行结果如下:
大家也可能发现了两个问题。
1.坦克可以移动出屏幕
2.坦克可以互相穿过
在这里我们首先把问题1解决。问题2会在后面解决
我们可以在坦克移动的时候判断坦克是否超出了边界 如果超出了,让坦克回到边界,并且重新给其一个步数和方向。
判断边界的方法为:
//判断边界
private boolean judgeLimit(){
if(x<0){
x=0;
return true;
}
if(y<0){
y=0;
return true;
}
//TankClient
// if(x>TankClient.SCREENWIDTH-width){
// x=TankClient.SCREENWIDTH-width;
// return true;
// }
// if(y>TankClient.SCREENHEIGHT-height){
// y=TankClient.SCREENHEIGHT-height;
// return true;
// }
//自定义panel
if(x>TankClient.tc.getTcp().getWidth()-width){
x=TankClient.tc.getTcp().getWidth()-width;
return true;
}
if(y>TankClient.tc.getTcp().getHeight()-height){
y=TankClient.tc.getTcp().getHeight()-height;
return true;
}
return false;
}
大家可以想想为什么我注释的代码不对。
起初我是用的注释的代码 发现坦克还是有一部分能够穿过屏幕 。搜了好久才想到
SCREENHEIGHT和SCREENWIDTH是TankClient的宽高
而我们的坦克是在自定义的panel里面的 。所以我又修改了TankClient类
在实例化自定义panel时为其声明一个变量 设置一个Get set方法 这样就能够在Tank类中使用了
运行结果如下图:
需求二就是让敌方坦克发子弹。
这个就更简单啦 直接调用fire函数 。而为了使敌方坦克的开火不密集 我们可以设置随机数
当这个随机数大于某一个值时发子弹,具体代码如下
if(r.nextInt(100)>97){
fire();
}
附上最终运行结果
如果觉得子弹稀疏可以修改上面的代码 把97减少点 反之增大
全部源码点击下载