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

110 篇文章 6 订阅
27 篇文章 1 订阅

按照项目来吧

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

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

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

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

获得随机方向:

首先定义一个变量

	//随机数
	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减少点 反之增大

全部源码点击下载



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值