From 4d2044374e00404c4007964a35c6453bf38596db Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 7 Feb 2024 15:58:18 +0100 Subject: [PATCH] Added FindPath Function to Map --- src/main/java/pacmanGame/Map.java | 100 ++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/src/main/java/pacmanGame/Map.java b/src/main/java/pacmanGame/Map.java index b018895..c610ea3 100644 --- a/src/main/java/pacmanGame/Map.java +++ b/src/main/java/pacmanGame/Map.java @@ -128,4 +128,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 ""; + } + } }