Forenkler transportbåndkode for å forbedre leselighet

This commit is contained in:
Kristian Knarvik 2020-04-24 04:37:29 +02:00
parent cd92a14c6d
commit 38cec559d9

View File

@ -356,10 +356,7 @@ public class Board {
} }
Position positionInFront = getNewPosition(conveyorBeltPosition, conveyorBeltDirection); Position positionInFront = getNewPosition(conveyorBeltPosition, conveyorBeltDirection);
//The tile in front of the robot is not a conveyor belt and has something on it stopping the conveyor belt //The tile in front of the robot is not a conveyor belt and has something on it stopping the conveyor belt
if ((!isValidPosition(positionInFront) && moveIsStoppedByWall(conveyorBeltPosition, positionInFront, if (conveyorBeltIsStoppedByWallOrRobot(positionInFront, conveyorBeltPosition, conveyorBeltDirection)) {
conveyorBeltDirection)) || (isValidPosition(positionInFront) &&
!isConveyorBelt(getTileOnPosition(positionInFront)) &&
hasFrontConflict(conveyorBeltPosition, positionInFront, conveyorBeltDirection))) {
return false; return false;
} }
//If a conveyor belt will move the robot outside the map, the move is valid //If a conveyor belt will move the robot outside the map, the move is valid
@ -368,7 +365,7 @@ public class Board {
} }
Tile tileInFront = getTileOnPosition(positionInFront); Tile tileInFront = getTileOnPosition(positionInFront);
//There is another robot trying to enter the same crossing //There is another robot trying to enter the same crossing
if (hasCrossingConflict(positionInFront, conveyorBeltDirection)) { if (conveyorBeltHasCrossingConflict(positionInFront, conveyorBeltDirection)) {
return false; return false;
} }
//The way forward seems clear //The way forward seems clear
@ -378,6 +375,21 @@ public class Board {
return conveyorBeltCanMove(new BoardElementContainer<>(tileInFront, positionInFront), iterations + 1); return conveyorBeltCanMove(new BoardElementContainer<>(tileInFront, positionInFront), iterations + 1);
} }
/**
* Checks whether a conveyor belt movement is stopped by either a wall or a robot
* @param positionInFront The position in front of the conveyor belt
* @param conveyorBeltPosition The position of the conveyor belt
* @param conveyorBeltDirection The direction of the conveyor belt
* @return True if the conveyor belt cannot move
*/
private boolean conveyorBeltIsStoppedByWallOrRobot(Position positionInFront, Position conveyorBeltPosition,
Direction conveyorBeltDirection) {
return ((!isValidPosition(positionInFront) && moveIsStoppedByWall(conveyorBeltPosition, positionInFront,
conveyorBeltDirection)) || (isValidPosition(positionInFront) &&
!isConveyorBelt(getTileOnPosition(positionInFront)) &&
conveyorBeltHasFrontConflict(conveyorBeltPosition, positionInFront, conveyorBeltDirection)));
}
/** /**
* Checks whether a conveyor belt has anything in front of it preventing it from moving forward * Checks whether a conveyor belt has anything in front of it preventing it from moving forward
* *
@ -386,7 +398,7 @@ public class Board {
* @param conveyorBeltDirection The direction of the conveyor belt * @param conveyorBeltDirection The direction of the conveyor belt
* @return True if the conveyor belt cannot move forward * @return True if the conveyor belt cannot move forward
*/ */
private boolean hasFrontConflict(Position conveyorBeltPosition, Position positionInFront, private boolean conveyorBeltHasFrontConflict(Position conveyorBeltPosition, Position positionInFront,
Direction conveyorBeltDirection) { Direction conveyorBeltDirection) {
return moveIsStoppedByWall(conveyorBeltPosition, positionInFront, conveyorBeltDirection) || return moveIsStoppedByWall(conveyorBeltPosition, positionInFront, conveyorBeltDirection) ||
hasRobotOnPosition(positionInFront); hasRobotOnPosition(positionInFront);
@ -399,24 +411,34 @@ public class Board {
* @param conveyorBeltDirection The direction of the conveyor belt * @param conveyorBeltDirection The direction of the conveyor belt
* @return True if there is a conflict. False otherwise * @return True if there is a conflict. False otherwise
*/ */
private boolean hasCrossingConflict(Position crossingPosition, Direction conveyorBeltDirection) { private boolean conveyorBeltHasCrossingConflict(Position crossingPosition, Direction conveyorBeltDirection) {
Position frontLeftPosition = getNewPosition(crossingPosition, //Checks for conflict at a conveyor belt coming in from the left
Direction.getLeftRotatedDirection(conveyorBeltDirection)); boolean frontLeftConflict = conveyorBeltHasConflict(getNewPosition(crossingPosition,
Position frontRightPosition = getNewPosition(crossingPosition, Direction.getLeftRotatedDirection(conveyorBeltDirection)),
Direction.getRightRotatedDirection(conveyorBeltDirection)); Direction.getRightRotatedDirection(conveyorBeltDirection));
Position twoForwardPosition = getNewPosition(crossingPosition, conveyorBeltDirection); //Checks for conflict at a conveyor belt coming in from the right
//If another robot is standing on a conveyor belt pointing to the tile in front, a conflict happens boolean frontRightConflict = conveyorBeltHasConflict(getNewPosition(crossingPosition,
return (isValidPosition(frontLeftPosition) && isConveyorBelt(getTileOnPosition(frontLeftPosition)) && Direction.getRightRotatedDirection(conveyorBeltDirection)),
getTileOnPosition(frontLeftPosition).getDirection() == Direction.getLeftRotatedDirection(conveyorBeltDirection));
Direction.getRightRotatedDirection(conveyorBeltDirection) && hasRobotOnPosition(frontLeftPosition)) || //Checks for conflict at a conveyor belt at the opposite side of the crossing
(isValidPosition(frontRightPosition) && isConveyorBelt(getTileOnPosition(frontRightPosition)) boolean frontConflict = conveyorBeltHasConflict(getNewPosition(crossingPosition, conveyorBeltDirection),
&& getTileOnPosition(frontRightPosition).getDirection() == Direction.getReverseDirection(conveyorBeltDirection));
Direction.getLeftRotatedDirection(conveyorBeltDirection) return frontLeftConflict || frontRightConflict || frontConflict;
&& hasRobotOnPosition(frontRightPosition)) || }
(isValidPosition(twoForwardPosition) && isConveyorBelt(getTileOnPosition(twoForwardPosition))
&& getTileOnPosition(twoForwardPosition).getDirection() == /**
Direction.getReverseDirection(conveyorBeltDirection) * Checks whether a poosible conflict position has a conflict
&& hasRobotOnPosition(twoForwardPosition)); * @param conflictPosition The position with a potential conflict
* @param conflictDirection The direction necessary to count as a conflict
* @return True if the position has a conflict
*/
private boolean conveyorBeltHasConflict(Position conflictPosition, Direction conflictDirection) {
if (!isValidPosition(conflictPosition)) {
return false;
}
Tile conflictTile = getTileOnPosition(conflictPosition);
return (isConveyorBelt(conflictTile) && conflictTile.getDirection() == conflictDirection &&
hasRobotOnPosition(conflictPosition));
} }
/** /**