您的位置:首页 > 编程语言 > Java开发

TankWar 单机(JAVA版)版本1.9 敌军坦克自动移动 自动攻击 及判断边界

2016-10-08 17:52 232 查看


按照项目来吧

首先是让敌军坦克动起来 ,要想让敌军坦克动起来 要明白我方坦克是怎么动的呢?

你会说按上下左右键 ,仔细想想怎么让敌军坦克模拟按了上下左右键?

我们按上下左右键主要是让给坦克一个方向,不停按就会移动 也就是步数。

概括可以得到 只要给坦克步数和方向就能实现自动移动了。

获得随机方向:

首先定义一个变量

//随机数
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方法即可
if(!good){
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减少点 反之增大

全部源码点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐