/*
向上
判断当前坦克的 上面左右任一端 是否进入另一辆坦克的区域
*/
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
-
p 在面左上角的右下方
-
p 在面右上角的左下方
-
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、统计数量时采用原子类