mirror of
https://github.com/inf112-v20/Fiasko.git
synced 2025-03-03 00:29:45 +01:00
Forenkler transportbåndkode for å forbedre leselighet
This commit is contained in:
parent
cd92a14c6d
commit
38cec559d9
@ -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,8 +398,8 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user