0
点赞
收藏
分享

微信扫一扫

韩顺平老师坦克大战优化版

陈情雅雅 2022-04-29 阅读 58

/*

向上

判断当前坦克的 上面左右任一端 是否进入另一辆坦克的区域

*/

case Constant.UP:

// 当前坦克上方左侧

x1 = this.getX();

y1 = this.getY();

p1 = new Point(x1, y1);

// 当前坦克上方右侧

x2 = x1 + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

y2 = y1;

p2 = new Point(x2, y2);

// 判断当前坦克与其它坦克是否相撞

if(isTouchCurrentTankAndOtherTank(this, p1, p2)){

return true;

}

break;

/*

向右

判断当前坦克的 右面上下任一端 是否进入另一辆坦克的区域

*/

case Constant.RIGHT:

// 当前坦克右侧上方

x1 = this.getX() + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

y1 = this.getY();

p1 = new Point(x1, y1);

// 当前坦克右侧下方

x2 = x1;

y2 = y1 + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

p2 = new Point(x2, y2);

// 判断当前坦克与其它坦克是否相撞

if(isTouchCurrentTankAndOtherTank(this, p1, p2)){

return true;

}

break;

/*

向下

判断当前坦克的 下面左右任一端 是否进入另一辆坦克的区域

*/

case Constant.DOWN:

// 当前坦克下方左侧

x1 = this.getX();

y1 = this.getY() + Constant.TANK_WHEEL_HEIGHT;

p1 = new Point(x1, y1);

// 当前坦克下方右侧

x2 = x1 + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

y2 = y1;

p2 = new Point(x2, y2);

// 判断当前坦克与其它坦克是否相撞

if(isTouchCurrentTankAndOtherTank(this, p1, p2)){

return true;

}

break;

/*

向左

判断当前坦克的 左面上下任一端 是否进入另一辆坦克的区域

*/

default:

// 当前坦克左侧上方

x1 = this.getX();

y1 = this.getY();

p1 = new Point(x1, y1);

// 当前坦克左侧下方

x2 = x1;

y2 = y1 + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

p2 = new Point(x2, y2);

// 判断当前坦克与其它坦克是否相撞

if(isTouchCurrentTankAndOtherTank(this, p1, p2)){

return true;

}

}

}

return false;

}

/**

  • 判断当前坦克与其它坦克是否相撞

  • @param currentTank

  • @param p1 当前坦克前方一点

  • @param p2 当前坦克前方另一点

  • @return

*/

private boolean isTouchCurrentTankAndOtherTank(Tank currentTank,Point p1,Point p2){

// 目标坦克区域面

Bounds b;

// 遍历坦克集合。比较与其它坦克是否发生碰撞

for (Tank tank : allTanks) {

// 避免与自已比较

if (!currentTank.equals(tank)) {

// 得到 tank 的区域面

b = getBoundsByTank(tank);

// 判断当前坦克的 上左点p1 或 上右点p2 是否与 目标坦克区域面b 重叠

if (isPointInBounds(p1, b) || isPointInBounds(p2, b)) {

return true;

}

}

}

return false;

}

/**

  • 获取坦克的区域面

  • @param tank

  • @return

*/

private Bounds getBoundsByTank(Tank tank){

// 目标坦克的上左

int op1_x = tank.getX();
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】
int op1_y = tank.getY();

Point op1 = new Point(op1_x, op1_y);

// 目标坦克的上右x

int op2_x;

// 目标坦克的下右y

int op3_y;

// 目标坦克方向

int d = tank.getDirection();

if (d == Constant.UP || d == Constant.DOWN) { // 上下移动:计算方法一致

// 目标坦克的上右x

op2_x = op1_x + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

// 目标坦克的下右y

op3_y = op1_y + Constant.TANK_WHEEL_HEIGHT;

} else { // 左右移动:计算方法一致

// 目标坦克的上右x

op2_x = op1_x + Constant.TANK_WHEEL_HEIGHT;

// 目标坦克的下右y

op3_y = op1_y + 2 * Constant.TANK_WHEEL_WIDTH + Constant.TANK_BODY_WIDTH;

}

// 目标坦克的区域面

return new Bounds(op1, op2_x, op3_y);

}

/**

  • 判断点 p 是否在面 b 内部

  • @param p

  • @param b

  • @return

*/

private boolean isPointInBounds(Point p, Bounds b) {

/*

原理:

用点 p ,分别与面 b 的四个值比较

同时满足以下三个条件即表示点在面内,返回 true

  1. p 在面左上角的右下方

  2. p 在面右上角的左下方

  3. p 在面右下角的左上方

*/

/*

p 与 b 的左上角比较

如果不返回 false,说明 p 在 矩形左上角 的右下方

●---------------

| |

| |

| |

| |


|

|

*/

if (p.x < b.p1.x || p.y < b.p1.y) {

return false;

}

/*

p 与 b 的右上角 x 比较

如果不返回 false ,说明 p 不在矩形的右方

-------●

| |

| |

| |

| |


| |

| |

*/

if (p.x > b.p2x) {

return false;

}

/*

p 与 b 的右下角 y 比较

如果不返回 false ,说明 p 不在矩形的下方,可以确定 p 在 b 中(包括边界)


| |

| |

| |

| |

-------●

*/

if (p.y > b.p3y) {

return false;

}

return true;

}

/**

  • 内部类:点

*/

class Point {

int x;

int y;

public Point(int x, int y) {

this.x = x;

this.y = y;

}

}

/**

  • 内部类:面

  • 由于面是一个规则的矩形,由 左上(xy)、右上(x)、右下(y) 三个点即可确定位置

  • 右上点的 y 和 左上点的 y 相等

  • 右下点的 x 和 右上点的 x 相等

  • 左下点的 x 和 左上点的 x 相等

  • 左下点的 y 和 右下点的 y 相等

*/

class Bounds {

// 左上

Tank.Point p1;

// 右上x

int p2x;

// 右下y

int p3y;

public Bounds(Tank.Point p1, int p2x, int p3y) {

this.p1 = p1;

this.p2x = p2x;

this.p3y = p3y;

}

}

7、生成一组不重复随机整数


package util;

import java.util.HashSet;

import java.util.Random;

import java.util.Set;

/**

  • @author ajun

  • Date 2021/7/14

  • @version 1.0

  • 工具类

*/

public class MyUitls {

public static void main(String[] args) {

Set set = getRandoms(-30, -20, -5);

System.out.println(“数量:” + set.size());

for (Integer s : set) {

System.out.println(s);

}

}

/**

  • 生成一组不重复随机数

  • @param start 开始位置:可以为负数

  • @param end 结束位置:end > start

  • @param count 数量 >= 0

  • @return

*/

public static Set getRandoms(int start, int end, int count) {

// 参数有效性检查

if (start > end || count < 1) {

count = 0;

}

// 结束值 与 开始值 的差小于 总数量

if ((end - start) < count) {

count = (end - start) > 0 ? (end - start) : 0;

}

// 定义存放集合

Set set = new HashSet<>(count);

if (count > 0) {

Random r = new Random();

// 一直生成足够数量后再停止

while (set.size() < count) {

set.add(start + r.nextInt(end - start));

}

}

return set;

}

}

//结果

数量:5

-25

-26

-27

-30

-23

8、统计数量时采用原子类


举报

相关推荐

0 条评论