mirror of
				https://github.com/inf112-v20/Fiasko.git
				synced 2025-11-04 03:33:45 +01:00 
			
		
		
		
	Rydder opp i og kommenterer respawning av roboter
This commit is contained in:
		@@ -448,7 +448,7 @@ public class Board {
 | 
			
		||||
    public void respawnRobots() {
 | 
			
		||||
        for (Robot robot : deadRobots) {
 | 
			
		||||
            if (robot.getAmountOfLives() > 0) {
 | 
			
		||||
                tryCircle(robot);
 | 
			
		||||
                respawnRobot(robot);
 | 
			
		||||
                robot.setDamageTaken(2);
 | 
			
		||||
                robots.put(robot.getRobotId(), robot);
 | 
			
		||||
            } else {
 | 
			
		||||
@@ -457,101 +457,119 @@ public class Board {
 | 
			
		||||
        }
 | 
			
		||||
        deadRobots = new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
    public void tryCircle(Robot robot){
 | 
			
		||||
        Position respawn = robot.getBackupPosition();
 | 
			
		||||
        int startX=respawn.getXCoordinate();
 | 
			
		||||
        int startY=respawn.getYCoordinate();
 | 
			
		||||
        if(!hasRobotOnPosition(respawn)){
 | 
			
		||||
            robot.setPosition(respawn);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Re-spawns a robot at the first available position relative to its backup position
 | 
			
		||||
     *
 | 
			
		||||
     * @param robot The robot to re-spawn
 | 
			
		||||
     */
 | 
			
		||||
    public void respawnRobot(Robot robot) {
 | 
			
		||||
        Position backupPosition = robot.getBackupPosition();
 | 
			
		||||
        int startX = backupPosition.getXCoordinate();
 | 
			
		||||
        int startY = backupPosition.getYCoordinate();
 | 
			
		||||
        if (!hasRobotOnPosition(backupPosition)) {
 | 
			
		||||
            robot.setPosition(backupPosition);
 | 
			
		||||
            //Tries to set the robot's facing direction to the true up direction
 | 
			
		||||
            List<BoardElementContainer<Tile>> robotSpawn = getPositionsOfTilesOnBoard(TileType.ROBOT_SPAWN_1);
 | 
			
		||||
            if (robotSpawn.size() == 1) {
 | 
			
		||||
                robot.setFacingDirection(robotSpawn.get(0).getElement().getDirection());
 | 
			
		||||
            } else {
 | 
			
		||||
                robot.setFacingDirection(Direction.NORTH);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        for(int i=1; i<3;i++){
 | 
			
		||||
            if(tryRespawn(robot,i,startX,startY,Direction.NORTH)){
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            if(tryRespawn(robot,i,startX,startY,Direction.SOUTH)){
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            if(tryRespawn(robot,i,startX,startY,Direction.EAST)){
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            if(tryRespawn(robot,i,startX,startY,Direction.WEST)){
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        int circleSize = 1;
 | 
			
		||||
        boolean hasRespawned = false;
 | 
			
		||||
        while (!hasRespawned) {
 | 
			
		||||
            hasRespawned = tryRobotRespawn(robot, circleSize, startX, startY, Direction.NORTH) ||
 | 
			
		||||
                    tryRobotRespawn(robot, circleSize, startX, startY, Direction.EAST) ||
 | 
			
		||||
                    tryRobotRespawn(robot, circleSize, startX, startY, Direction.SOUTH) ||
 | 
			
		||||
                    tryRobotRespawn(robot, circleSize, startX, startY, Direction.WEST);
 | 
			
		||||
            circleSize++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    public Boolean tryRespawn(Robot robot,int size,int startX,int startY,Direction direction){
 | 
			
		||||
        int axis;
 | 
			
		||||
        for(int i=1;i<=size;i++) {
 | 
			
		||||
            if (direction== Direction.NORTH ||direction== Direction.SOUTH) {
 | 
			
		||||
                axis=startX;
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                axis=startY;
 | 
			
		||||
            }
 | 
			
		||||
                for (int j = axis-i; j < axis+i; j++) {
 | 
			
		||||
                    int[] coordinates = switchForRespawn(startX,startY,direction,j,size);
 | 
			
		||||
                    int x=coordinates[0];
 | 
			
		||||
                    int y=coordinates[1];
 | 
			
		||||
                    Position tryRespawn = new Position(x, y);
 | 
			
		||||
                    System.out.println(tryRespawn);
 | 
			
		||||
                    if (!isValidPosition(tryRespawn)) {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    TileType tile = getTileOnPosition(tryRespawn).getType();
 | 
			
		||||
                    if(checkIfRespawnHasPit(tile, direction, robot, tryRespawn)){
 | 
			
		||||
                        return true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    private int[] switchForRespawn(int startX,int startY,Direction direction,int j,int size){
 | 
			
		||||
        int x;
 | 
			
		||||
        int y;
 | 
			
		||||
        switch (direction){
 | 
			
		||||
            case NORTH:
 | 
			
		||||
                x = j;
 | 
			
		||||
                y = startY-size;
 | 
			
		||||
                break;
 | 
			
		||||
            case SOUTH:
 | 
			
		||||
                x = j;
 | 
			
		||||
                y = startY+size;
 | 
			
		||||
                break;
 | 
			
		||||
            case WEST:
 | 
			
		||||
                x = startX-size;
 | 
			
		||||
                y = j;
 | 
			
		||||
                break;
 | 
			
		||||
            case EAST:
 | 
			
		||||
                x = startX+size;
 | 
			
		||||
                y = j;
 | 
			
		||||
                break;
 | 
			
		||||
            default: throw new IllegalArgumentException("invalid direction for tile");
 | 
			
		||||
        }
 | 
			
		||||
        return new int[]{x,y};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean checkIfRespawnHasPit(TileType tile,Direction direction,Robot robot,Position tryRespawn){
 | 
			
		||||
        if ( tile!=TileType.PIT_CORNER && tile!=TileType.PIT_EMPTY &&tile!=TileType.PIT_FULL &&
 | 
			
		||||
                tile!=TileType.PIT_NORMAL &&tile!=TileType.PIT_U && tile!=TileType.HOLE){
 | 
			
		||||
            if(!hasRobotOnPosition(tryRespawn)){
 | 
			
		||||
                robot.setFacingDirection(direction);
 | 
			
		||||
                robot.setPosition(tryRespawn);
 | 
			
		||||
                return true;
 | 
			
		||||
    /**
 | 
			
		||||
     * Tries to re-spawn a robot on one of the positions described
 | 
			
		||||
     *
 | 
			
		||||
     * @param robot     The robot to re-spawn
 | 
			
		||||
     * @param size      The size of the square relative to the robot's spawn to try
 | 
			
		||||
     * @param startX    The x coordinate of the robot's backup position
 | 
			
		||||
     * @param startY    The y coordinate of the robot's backup position
 | 
			
		||||
     * @param direction The direction of the face of the square to check
 | 
			
		||||
     * @return Whether the robot was re-spawned
 | 
			
		||||
     */
 | 
			
		||||
    public boolean tryRobotRespawn(Robot robot, int size, int startX, int startY, Direction direction) {
 | 
			
		||||
        int axis;
 | 
			
		||||
        for (int i = 1; i <= size; i++) {
 | 
			
		||||
            if (direction == Direction.NORTH || direction == Direction.SOUTH) {
 | 
			
		||||
                axis = startX;
 | 
			
		||||
            } else {
 | 
			
		||||
                axis = startY;
 | 
			
		||||
            }
 | 
			
		||||
            for (int j = axis - i; j < axis + i; j++) {
 | 
			
		||||
                Position potentialSpawn = calculatePotentialRobotSpawn(startX, startY, direction, j, size);
 | 
			
		||||
                if (isValidPosition(potentialSpawn) && !hasHole(potentialSpawn) && !hasRobotOnPosition(potentialSpawn)) {
 | 
			
		||||
                    robot.setFacingDirection(direction);
 | 
			
		||||
                    robot.setPosition(potentialSpawn);
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    public void updateRobotRespawn(){
 | 
			
		||||
        List<BoardElementContainer<Tile>> repaireTiles = getPositionsOfTilesOnBoard(TileType.WRENCH,
 | 
			
		||||
                TileType.WRENCH_AND_HAMMER,TileType.FLAG_1,TileType.FLAG_2,TileType.FLAG_3,TileType.FLAG_4);
 | 
			
		||||
        for (BoardElementContainer<Tile> repaireTile:repaireTiles) {
 | 
			
		||||
            Position pos = repaireTile.getPosition();
 | 
			
		||||
            if(hasRobotOnPosition(pos)){
 | 
			
		||||
                getRobot(getRobotOnPosition(pos)).setBackupPosition(pos);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Calculates a potential robot spawn from the input
 | 
			
		||||
     *
 | 
			
		||||
     * @param startX    The start position's x coordinate
 | 
			
		||||
     * @param startY    The start position's y coordinate
 | 
			
		||||
     * @param direction The direction which is checked
 | 
			
		||||
     * @param j         The offset from the start position
 | 
			
		||||
     * @param size      The size of the square around the start position
 | 
			
		||||
     * @return The position described by the input
 | 
			
		||||
     */
 | 
			
		||||
    private Position calculatePotentialRobotSpawn(int startX, int startY, Direction direction, int j, int size) {
 | 
			
		||||
        switch (direction) {
 | 
			
		||||
            case NORTH:
 | 
			
		||||
                return new Position(j, startY - size);
 | 
			
		||||
            case SOUTH:
 | 
			
		||||
                return new Position(j, startY + size);
 | 
			
		||||
            case WEST:
 | 
			
		||||
                return new Position(startX - size, j);
 | 
			
		||||
            case EAST:
 | 
			
		||||
                return new Position(startX + size, j);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new IllegalArgumentException("invalid direction for tile");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks whether a position contains a hole
 | 
			
		||||
     *
 | 
			
		||||
     * @param position The position to check
 | 
			
		||||
     * @return True if the position has a hole
 | 
			
		||||
     */
 | 
			
		||||
    private boolean hasHole(Position position) {
 | 
			
		||||
        TileType type = getTileOnPosition(position).getType();
 | 
			
		||||
        return type == TileType.HOLE || type == TileType.PIT_CORNER || type == TileType.PIT_EMPTY
 | 
			
		||||
                || type == TileType.PIT_FULL || type == TileType.PIT_NORMAL || type == TileType.PIT_U;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Updates backup position of all robots on a repair tile
 | 
			
		||||
     */
 | 
			
		||||
    public void updateRobotBackups() {
 | 
			
		||||
        List<BoardElementContainer<Tile>> repairTiles = getPositionsOfTilesOnBoard(TileType.WRENCH,
 | 
			
		||||
                TileType.WRENCH_AND_HAMMER, TileType.FLAG_1, TileType.FLAG_2, TileType.FLAG_3, TileType.FLAG_4);
 | 
			
		||||
        for (BoardElementContainer<Tile> repairTile : repairTiles) {
 | 
			
		||||
            Position position = repairTile.getPosition();
 | 
			
		||||
            if (hasRobotOnPosition(position)) {
 | 
			
		||||
                getRobot(getRobotOnPosition(position)).setBackupPosition(position);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a robot id for a robot on a specific position if such a robot exists
 | 
			
		||||
     *
 | 
			
		||||
@@ -582,7 +600,7 @@ public class Board {
 | 
			
		||||
     * Updates the flag of the robot if it stands on the correct flag.
 | 
			
		||||
     *
 | 
			
		||||
     * @param robotID The RobotID of a robot
 | 
			
		||||
     * @param flag  BoardElementContainer of the flag we check
 | 
			
		||||
     * @param flag    BoardElementContainer of the flag we check
 | 
			
		||||
     */
 | 
			
		||||
    public void updateRobotFlag(RobotID robotID, BoardElementContainer<Tile> flag) {
 | 
			
		||||
        Robot robot = robots.get(robotID);
 | 
			
		||||
 
 | 
			
		||||
@@ -65,8 +65,8 @@ public class Phase {
 | 
			
		||||
        updateRobotRespawn();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void updateRobotRespawn(){
 | 
			
		||||
        gameBoard.updateRobotRespawn();
 | 
			
		||||
    public void updateRobotRespawn() {
 | 
			
		||||
        gameBoard.updateRobotBackups();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -118,7 +118,7 @@ public final class BoardLoaderUtil {
 | 
			
		||||
     */
 | 
			
		||||
    private static void adjustRobotRotationToBoardRotation(Grid<Tile> tileGrid, List<Robot> robotList) {
 | 
			
		||||
        //The flags are always in the up direction
 | 
			
		||||
        List<BoardElementContainer<Tile>> flags = GridUtil.getMatchingElements(TileType.FLAG_1, tileGrid);
 | 
			
		||||
        List<BoardElementContainer<Tile>> flags = GridUtil.getMatchingElements(TileType.ROBOT_SPAWN_1, tileGrid);
 | 
			
		||||
        Direction boardDirection;
 | 
			
		||||
        if (flags.size() == 0) {
 | 
			
		||||
            boardDirection = Direction.NORTH;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
28 12
 | 
			
		||||
21;01 01;03 01;03 01;03 01;03 01;03 01;03 01;03 01;03 01;03 01;03 01;03 01;1 01;1 01;1 01;1 01;1 01;1 01;1 01;1 01;1 01;1 01;1 01;1 01;07 01;07 30;07 01;07
 | 
			
		||||
01;03 34;07 35;03 01;03 01;03 01;01 01;03 01;03 01;03 35;07 34;01 01;03 01;1 12;3 11;3 11;3 12;5 01;1 01;1 12;3 11;3 11;3 12;5 01;1 01;07 01;07 28;07 01;07
 | 
			
		||||
01;03 35;05 03;01 05;03 05;03 05;03 05;03 05;03 05;03 05;03 35;05 01;03 17;7 11;1 03;1 01;1 11;5 04;1 01;1 11;1 03;1 01;1 11;5 01;1 01;07 01;07 01;07 01;07
 | 
			
		||||
01;03 35;05 03;01 05;03 05;03 05;03 05;03 05;03 05;03 05;03 35;05 01;03 17;1 11;1 03;1 01;1 11;5 04;1 01;1 11;1 03;1 01;1 11;5 01;1 01;07 01;07 01;07 01;07
 | 
			
		||||
01;03 01;03 05;01 04;01 05;07 05;07 09;07 05;07 04;01 05;05 01;03 01;03 01;1 11;1 21;1 03;1 11;5 01;1 01;1 11;1 22;1 03;1 11;5 01;1 01;07 01;07 26;07 01;07
 | 
			
		||||
01;03 01;03 05;01 05;05 34;07 35;03 05;01 01;03 05;01 05;05 01;03 01;03 01;1 12;1 11;7 11;7 12;7 01;1 04;1 12;1 11;7 11;7 12;7 01;1 01;07 01;07 01;07 01;07
 | 
			
		||||
01;03 18;07 05;01 05;05 35;05 22;01 05;01 01;03 05;01 05;05 01;03 01;03 01;1 01;1 01;1 01;1 04;1 01;1 01;1 01;1 01;1 04;1 01;1 01;1 01;07 01;07 24;07 01;07
 | 
			
		||||
01;03 01;03 05;01 05;05 01;03 05;05 01;03 35;01 05;01 05;05 01;01 01;03 01;1 01;1 04;1 01;1 01;1 01;1 01;1 04;1 01;1 01;1 19;7 01;1 01;07 01;07 23;07 01;07
 | 
			
		||||
01;03 18;01 05;01 05;05 35;05 22;01 05;01 01;03 05;01 05;05 01;03 01;03 01;1 01;1 01;1 01;1 04;1 01;1 01;1 01;1 01;1 04;1 01;1 01;1 01;07 01;07 24;07 01;07
 | 
			
		||||
01;03 01;03 05;01 05;05 01;03 05;05 01;03 35;01 05;01 05;05 01;01 01;03 01;1 01;1 04;1 01;1 01;1 01;1 01;1 04;1 01;1 01;1 19;1 01;1 01;07 01;07 23;07 01;07
 | 
			
		||||
01;03 01;03 05;01 05;05 01;03 05;05 35;07 34;03 05;01 05;05 01;03 01;03 01;1 12;3 11;3 11;3 12;5 04;1 01;1 12;3 11;3 11;3 12;5 01;1 01;07 01;07 01;07 01;07
 | 
			
		||||
01;03 01;03 05;01 04;01 05;03 09;03 05;03 05;03 04;01 05;05 01;03 01;03 01;1 11;1 03;1 22;1 11;5 01;1 01;1 11;1 03;1 21;1 11;5 01;1 01;07 01;07 25;07 01;07
 | 
			
		||||
01;03 35;01 03;01 05;07 05;07 05;07 05;07 05;07 05;07 05;05 35;01 01;03 01;1 11;1 01;1 03;1 11;5 01;1 04;1 11;1 01;1 03;1 11;5 01;1 01;07 01;07 01;07 01;07
 | 
			
		||||
 
 | 
			
		||||
@@ -234,8 +234,8 @@ public class BoardTest {
 | 
			
		||||
    public void flagGetsUpdatedOnRobotWithCorrectLastVisitedFlag() {
 | 
			
		||||
        Robot testRobot = robotList.get(6);
 | 
			
		||||
        assertEquals(0, testRobot.getLastFlagVisited());
 | 
			
		||||
        BoardElementContainer<Tile> flag = new BoardElementContainer<>(new Tile(TileType.FLAG_1,Direction.NORTH)
 | 
			
		||||
                ,new Position(1,1));
 | 
			
		||||
        BoardElementContainer<Tile> flag = new BoardElementContainer<>(new Tile(TileType.FLAG_1, Direction.NORTH)
 | 
			
		||||
                , new Position(1, 1));
 | 
			
		||||
        board.updateRobotFlag(RobotID.ROBOT_7, flag);
 | 
			
		||||
        assertEquals(1, testRobot.getLastFlagVisited());
 | 
			
		||||
    }
 | 
			
		||||
@@ -244,8 +244,8 @@ public class BoardTest {
 | 
			
		||||
    public void flagDoesNotUpdatedOnRobotWithWrongLastVisitedFlag() {
 | 
			
		||||
        Robot testRobot = robotList.get(6);
 | 
			
		||||
        assertEquals(0, testRobot.getLastFlagVisited());
 | 
			
		||||
        BoardElementContainer<Tile> flag = new BoardElementContainer<>(new Tile(TileType.FLAG_2,Direction.NORTH)
 | 
			
		||||
                ,new Position(1,1));
 | 
			
		||||
        BoardElementContainer<Tile> flag = new BoardElementContainer<>(new Tile(TileType.FLAG_2, Direction.NORTH)
 | 
			
		||||
                , new Position(1, 1));
 | 
			
		||||
        board.updateRobotFlag(RobotID.ROBOT_7, flag);
 | 
			
		||||
        assertEquals(0, testRobot.getLastFlagVisited());
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user