From eddf9d3daa0efcd6688795b962eeca0022b8358d Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Tue, 22 Mar 2022 18:20:23 +0100 Subject: [PATCH] implemented PathFollowerMoveStrategy.java --- follower/challenge_points.txt | 19 ++++ src/main/java/ch/zhaw/pm2/racetrack/Game.java | 24 +++-- .../racetrack/strategy/MoveListStrategy.java | 8 +- .../strategy/PathFollowerMoveStrategy.java | 93 ++++++++++++++++++- 4 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 follower/challenge_points.txt diff --git a/follower/challenge_points.txt b/follower/challenge_points.txt new file mode 100644 index 0000000..d794046 --- /dev/null +++ b/follower/challenge_points.txt @@ -0,0 +1,19 @@ +(X:40, Y:22) +(X:43, Y:22) +(X:46, Y:21) +(X:48, Y:19) +(X:48, Y:17) +(X:46, Y:15) +(X:41, Y:13) +(X:41, Y:10) +(X:46, Y:9) +(X:49, Y:4) +(X:40, Y:2) +(X:30, Y:2) +(X:21, Y:3) +(X:16, Y:7) +(X:13, Y:10) +(X:14, Y:14) +(X:11, Y:19) +(X:13, Y:22) +(X:24, Y:22) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 413fef3..406cf40 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -44,32 +44,38 @@ public class Game implements GameSpecification { moveStrategies.add("Path Follow Move Strategy"); for (int i = 0; i < track.getCarCount(); i++) { Car car = track.getCar(i); - while (car.getMoveStrategy() == null) { + MoveStrategy moveStrategy = null; + while (moveStrategy == null) { + String filePath; int moveStrategie = userInterface.selectOption( "Select Strategy for Car " + i + " (" + track.getCarId(i) + ")", moveStrategies); switch (moveStrategie + 1) { case 1: - selectMoveStrategy(car, new DoNotMoveStrategy()); + moveStrategy = new DoNotMoveStrategy(); break; case 2: - selectMoveStrategy(car, new UserMoveStrategy(userInterface, i, track.getCarId(i))); + moveStrategy = new UserMoveStrategy(userInterface, i, track.getCarId(i)); break; case 3: - String path = ".\\moves\\" + selectedTrack.getName().split("\\.")[0] + "-car-" + track.getCar(i).getID() + ".txt"; + filePath = ".\\moves\\" + selectedTrack.getName().split("\\.")[0] + "-car-" + track.getCar(i).getID() + ".txt"; try { - MoveStrategy moveStrategy = new MoveListStrategy(path); - selectMoveStrategy(car, moveStrategy); + moveStrategy = new MoveListStrategy(filePath); } catch (FileNotFoundException e) { - userInterface.printInformation("There is no MoveList implemented. Choose another Strategy!"); + userInterface.printInformation("There is no Move-List implemented. Choose another Strategy!"); } //TODO: Backslash kompatibel für Linux break; case 4: - //TODO: add Arguments - selectMoveStrategy(car, new PathFollowerMoveStrategy()); + filePath = ".\\follower\\" + selectedTrack.getName().split("\\.")[0] + "_points.txt"; + try { + moveStrategy = new PathFollowerMoveStrategy(filePath, track.getCarPos(i)); + } catch (FileNotFoundException e) { + userInterface.printInformation("There is no Point-List implemented. Choose another Strategy!"); + } break; } } + selectMoveStrategy(car, moveStrategy); } return true; } else { diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java index 7d1e68e..774b323 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java @@ -20,14 +20,14 @@ public class MoveListStrategy implements MoveStrategy { readFile(new File(path)); } - private void readFile(File trackFile) throws FileNotFoundException { + protected void readFile(File trackFile) throws FileNotFoundException { Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); Direction[] directions = Direction.values(); while (scanner.hasNextLine()) { String line = scanner.nextLine(); - for (Direction dir : directions) { - if (dir.toString().equals(line)) { - moveList.add(dir); + for (Direction direction : directions) { + if (direction.toString().equals(line)) { + moveList.add(direction); break; } } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java index 23ad51f..f85a0e9 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java @@ -1,15 +1,104 @@ package ch.zhaw.pm2.racetrack.strategy; +import ch.zhaw.pm2.racetrack.PositionVector; import ch.zhaw.pm2.racetrack.PositionVector.Direction; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Scanner; + /** * The PathFollowerMoveStrategy class determines the next move based on a file containing points on a path. */ public class PathFollowerMoveStrategy implements MoveStrategy { + private PositionVector currentPosition; + private PositionVector currentVelocity; + private ArrayList pointList; + private int pointer; + + + public PathFollowerMoveStrategy(String path, PositionVector startPosition) throws FileNotFoundException { + pointList = new ArrayList<>(); + pointer = 0; + readFile(new File(path)); + currentPosition = startPosition; + currentVelocity = new PositionVector(0, 0); + } + + public void readFile(File trackFile) throws FileNotFoundException { + Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + String[] coordinates = line.split("(\\(X:|, Y:|\\))"); + pointList.add(new PositionVector(Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]))); + } + } @Override public Direction nextMove() { - // TODO: implementation - throw new UnsupportedOperationException(); + if (pointer >= pointList.size()) { + return null; + } + int accelerationX = 0; + int accelerationY = 0; + if (pointList.get(pointer).equals(currentPosition)) { + pointer ++; + } + + + if(currentVelocity.getX() > 0){ + accelerationX = -1; + } else if(currentVelocity.getX() < 0) { + accelerationX = 1; + } + if(currentVelocity.getY() > 0){ + accelerationY = -1; + } else if(currentVelocity.getY() < 0) { + accelerationY = 1; + } + + + PositionVector movementVector = new PositionVector(pointList.get(pointer).getX() - currentPosition.getX(), pointList.get(pointer).getY() - currentPosition.getY()); + if(movementVector.getX() > 0 && movementVector.getX()/2.0 > currentVelocity.getX()) { + accelerationX = 1; + } + else if(movementVector.getX() > 0 && movementVector.getX()/2.0 <= currentVelocity.getX()) { + accelerationX = -1; + } + else if(movementVector.getX() < 0 && movementVector.getX()/2.0 < currentVelocity.getX()) { + accelerationX = -1; + } + else if(movementVector.getX() < 0 && movementVector.getX()/2.0 >= currentVelocity.getX()) { + accelerationX = 1; + } + + if(movementVector.getY() > 0 && movementVector.getY()/2.0 > currentVelocity.getY()) { + accelerationY = 1; + } + else if(movementVector.getY() > 0 && movementVector.getY()/2.0 <= currentVelocity.getY()) { + accelerationY = -1; + } + else if(movementVector.getY() < 0 && movementVector.getY()/2.0 < currentVelocity.getY()) { + accelerationY = -1; + } + else if(movementVector.getY() < 0 && movementVector.getY()/2.0 >= currentVelocity.getY()) { + accelerationY = 1; + } + + + currentVelocity = new PositionVector(currentVelocity.getX() + accelerationX, currentVelocity.getY() + accelerationY); + currentPosition = new PositionVector(currentPosition.getX() + currentVelocity.getX(), currentPosition.getY() + currentVelocity.getY()); + + PositionVector acceleration = new PositionVector(accelerationX, accelerationY); + Direction[] directions = Direction.values(); + for (Direction direction : directions) { + if (direction.vector.equals(acceleration)) { + return direction; + } + } + return null; + } }