mirror of
https://github.com/inf112-v20/Fiasko.git
synced 2025-01-31 23:29:36 +01:00
Legger til en utility klasse for å laste inn et brett fra en tekstfil
This commit is contained in:
parent
76cc495c11
commit
438bbd70a0
@ -0,0 +1,94 @@
|
|||||||
|
package inf112.fiasko.roborally.utility;
|
||||||
|
|
||||||
|
import inf112.fiasko.roborally.element_properties.*;
|
||||||
|
import inf112.fiasko.roborally.objects.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a board
|
||||||
|
*/
|
||||||
|
public final class BoardLoaderUtil {
|
||||||
|
private BoardLoaderUtil() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a board described in a file
|
||||||
|
* @param boardFile The file containing the board description
|
||||||
|
* @param robotList A list of robots on the board
|
||||||
|
* @return A board
|
||||||
|
* @throws IOException If the board file cannot be loaded
|
||||||
|
*/
|
||||||
|
public static Board loadBoard(String boardFile, List<Robot> robotList) throws IOException {
|
||||||
|
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
|
||||||
|
InputStream fileStream = classloader.getResourceAsStream(boardFile);
|
||||||
|
if (fileStream == null) {
|
||||||
|
throw new IllegalArgumentException("Board file could not be loaded.");
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(fileStream));
|
||||||
|
String infoLine = reader.readLine();
|
||||||
|
String[] infoData = infoLine.split(" ");
|
||||||
|
int gridWidth = Integer.parseInt(infoData[0]);
|
||||||
|
int gridHeight = Integer.parseInt(infoData[1]);
|
||||||
|
|
||||||
|
IGrid<Tile> tileGrid = loadTileGrid(reader, gridWidth, gridHeight);
|
||||||
|
IGrid<Wall> wallGrid = loadWallGrid(reader, gridWidth, gridHeight);
|
||||||
|
return new Board(tileGrid, wallGrid, robotList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads information about a tile grid from a buffered reader
|
||||||
|
* @param reader A buffered reader ready to read information about the grid
|
||||||
|
* @param gridWidth The width of the grid to load
|
||||||
|
* @param gridHeight The height of the grid to load
|
||||||
|
* @return A grid containing the tiles described by the buffered reader
|
||||||
|
* @throws IOException If the reader reads invalid grid information
|
||||||
|
*/
|
||||||
|
private static IGrid<Tile> loadTileGrid(BufferedReader reader, int gridWidth, int gridHeight) throws IOException {
|
||||||
|
IGrid<Tile> tileGrid = new Grid<>(gridWidth, gridHeight);
|
||||||
|
for (int i = 0; i < gridHeight; i++) {
|
||||||
|
String gridLine = reader.readLine();
|
||||||
|
String[] tilesOnLine = gridLine.split(" ");
|
||||||
|
for (int j = 0; j < gridWidth; j++) {
|
||||||
|
String[] tileData = tilesOnLine[j].split(";");
|
||||||
|
TileType tileType = TileType.getTileTypeFromID(Integer.parseInt(tileData[0]));
|
||||||
|
Direction direction = Direction.getDirectionFromID(Integer.parseInt(tileData[1]));
|
||||||
|
if (direction == null) {
|
||||||
|
throw new IllegalArgumentException("Invalid direction for tile encountered when loading board file.");
|
||||||
|
}
|
||||||
|
tileGrid.setElement(i, j, new Tile(tileType, direction));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tileGrid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads information about a wall grid from a buffered reader
|
||||||
|
* @param reader A buffered reader ready to read information about the grid
|
||||||
|
* @param gridWidth The width of the grid to load
|
||||||
|
* @param gridHeight The height of the grid to load
|
||||||
|
* @return A grid containing the walls described by the buffered reader
|
||||||
|
* @throws IOException If the reader reads invalid grid information
|
||||||
|
*/
|
||||||
|
private static IGrid<Wall> loadWallGrid(BufferedReader reader, int gridWidth, int gridHeight) throws IOException {
|
||||||
|
IGrid<Wall> wallGrid = new Grid<>(gridWidth, gridHeight);
|
||||||
|
for (int i = 0; i < gridHeight; i++) {
|
||||||
|
String gridLine = reader.readLine();
|
||||||
|
String[] wallsOnLine = gridLine.split(" ");
|
||||||
|
for (int j = 0; j < gridWidth; j++) {
|
||||||
|
if (wallsOnLine[j].equals("0")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String[] wallData = wallsOnLine[j].split(";");
|
||||||
|
WallType wallType = WallType.getWallTypeFromID(Integer.parseInt(wallData[0]));
|
||||||
|
Direction direction = Direction.getDirectionFromID(Integer.parseInt(wallData[1]));
|
||||||
|
if (direction == null) {
|
||||||
|
throw new IllegalArgumentException("Invalid direction for tile encountered when loading board file.");
|
||||||
|
}
|
||||||
|
wallGrid.setElement(i, j, new Wall(wallType, direction));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wallGrid;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package inf112.fiasko.roborally.utility;
|
||||||
|
|
||||||
|
import inf112.fiasko.roborally.objects.Robot;
|
||||||
|
import org.junit.Test;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BoardLoaderUtilTest {
|
||||||
|
@Test
|
||||||
|
public void loadTestBoard() throws IOException {
|
||||||
|
List<Robot> robotList = new ArrayList<>();
|
||||||
|
BoardLoaderUtil.loadBoard("boards/test_board.txt", robotList);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user