diff --git a/src/main/java/pacmanGame/Map.java b/src/main/java/pacmanGame/Map.java index 2d1845f..21051b1 100644 --- a/src/main/java/pacmanGame/Map.java +++ b/src/main/java/pacmanGame/Map.java @@ -131,4 +131,104 @@ public class Map { } } } + + public String FindPath(Vector2 from, Vector2 to) + { + char[][] tempMap = new char[size.x][size.y]; + + for(int x = 0; x < size.x; x++) { + for(int y = 0; y < size.y; y++) { + Vector2 pos = new Vector2(x,y); + Cell cell = GetCell(pos); + if(cell.type.equals("wall")) { + tempMap[x][y] = 'w'; + } + else { + tempMap[x][y] = 'e'; + } + } + } + + tempMap[to.x][to.y] = 't'; + + String targetChars = "tudlr"; + + boolean done = false; + + while(!done) { + int changes = 0; + + for(int x = 0; x < size.x; x++) { + for(int y = 0; y < size.y; y++) { + + if(tempMap[x][y] == 'e') { + + Vector2 pos = new Vector2(x,y); + char newChar = 'x'; + + if(targetChars.indexOf(tempMap[x + 1][y]) >= 0) { + newChar = 'r'; + } + else if(targetChars.indexOf(tempMap[x - 1][y]) >= 0) { + newChar = 'l'; + } + else if(targetChars.indexOf(tempMap[x][y + 1]) >= 0) { + newChar = 'u'; + } + else if(targetChars.indexOf(tempMap[x][y - 1]) >= 0) { + newChar = 'd'; + } + + if(newChar != 'x') { + tempMap[x][y] = newChar; + changes++; + + if(pos.equals(from)) { + done = true; + } + } + } + } + } + + if(changes == 0) { + done = true; + } + } + + if(tempMap[from.x][from.y] != 'e') { + boolean reading = true; + String path = ""; + Vector2 currentReadPos = from.Clone(); + + while(reading) { + char currentChar = tempMap[currentReadPos.x][currentReadPos.y]; + + if(currentReadPos.equals(to)) { + reading = false; + } + else { + path += currentChar; + + if(currentChar == 'l') { + currentReadPos = currentReadPos.Add(new Vector2(-1, 0)); + } + else if(currentChar == 'r') { + currentReadPos = currentReadPos.Add(new Vector2(1, 0)); + } + else if(currentChar == 'u') { + currentReadPos = currentReadPos.Add(new Vector2(0, 1)); + } + else if(currentChar == 'd') { + currentReadPos = currentReadPos.Add(new Vector2(0, -1)); + } + } + } + return path; + } + else { + //no path was found + return ""; + } + } } diff --git a/src/test/java/pacmanTests/MapTest.java b/src/test/java/pacmanTests/MapTest.java index 7fc442d..723fa63 100644 --- a/src/test/java/pacmanTests/MapTest.java +++ b/src/test/java/pacmanTests/MapTest.java @@ -57,4 +57,58 @@ class MapTest { assertThat(expectedMiddle).isEqualTo(middle); assertThat(expectedBottomRight).isEqualTo(bottomRight); } + + @Test + void Map_getPath_returnCorrectPathSimple() { + // arrange + String[] mapTest = { + "wwwww", + "w...w", + "w.w.w", + "w.w.w", + "wwwww" + }; + GameManager gameManager = new GameManager(); + gameManager.map = new Map(mapTest, gameManager); + + Vector2 from = new Vector2(1, 1); + Vector2 to = new Vector2(3, 1); + + String expectedPath = "uurrdd"; + + // act + + String path = gameManager.map.FindPath(from, to); + + // assert + assertThat(path).isEqualTo(expectedPath); + } + + @Test + void Map_getPath_returnCorrectPathComplex() { + // arrange + String[] mapTest = { + "wwwwwwwww", + "w.....w.w", + "w.www.w.w", + "w.w...w.w", + "w.w.www.w", + "w.w.....w", + "wwwwwwwww" + }; + GameManager gameManager = new GameManager(); + gameManager.map = new Map(mapTest, gameManager); + + Vector2 from = new Vector2(4, 3); + Vector2 to = new Vector2(1, 1); + + String expectedPath = "ruulllldddd"; + + // act + + String path = gameManager.map.FindPath(from, to); + + // assert + assertThat(path).isEqualTo(expectedPath); + } } diff --git a/team.md b/team.md new file mode 100644 index 0000000..6346c38 --- /dev/null +++ b/team.md @@ -0,0 +1,5 @@ +- fdai2751, fdai2751 +- fdai7012, fdai7012 +- fdai7753, fdai7753 +- fdai7910, fdai7910 +- Julian, fdai7012 \ No newline at end of file