From 381ea44a9a9d9e28218446c585be18f368d4ce03 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sat, 5 Mar 2022 16:39:08 +0100 Subject: [PATCH 01/36] Created CarTest.java added Tests setPosition, nextPosition --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/test/java/ch/zhaw/pm2/racetrack/CarTest.java diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java new file mode 100644 index 0000000..eb013c6 --- /dev/null +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -0,0 +1,60 @@ + +package ch.zhaw.pm2.racetrack; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CarTest { + Car car; + + @BeforeEach + void setUp() { + car = new Car('a', new PositionVector(10, 10)); + } + + @AfterEach + void tearDown() { + } + + @Test + void setPosition() { + car.setPosition(new PositionVector(20, 20)); + checkPosition(20, 20); + } + + @Test + void nextPosition() { + checkPosition(10, 10); + } + + @Test + void accelerate() { + } + + @Test + void move() { + } + + @Test + void crash() { + } + + @Test + void isCrashed() { + } + + @Test + void setMoveStrategy() { + } + + @Test + void getMoveStrategy() { + } + + void checkPosition(int x, int y) { + assertTrue(car.nextPosition().equals(new PositionVector(x, y))); + } +} From 972f011a080c488eaabc6345a71570ed72e14c4a Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sun, 6 Mar 2022 17:06:42 +0100 Subject: [PATCH 02/36] changes in Tests car.CarTest setPosition, movement, crash, moveStrategy --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 124 ++++++++++++++---- 1 file changed, 100 insertions(+), 24 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index eb013c6..a6d91ba 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -1,60 +1,136 @@ package ch.zhaw.pm2.racetrack; -import org.junit.jupiter.api.AfterEach; +import ch.zhaw.pm2.racetrack.strategy.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import static org.junit.jupiter.api.Assertions.*; class CarTest { Car car; + int DEFAULT_X = 10; + int DEFAULT_Y = 10; @BeforeEach void setUp() { - car = new Car('a', new PositionVector(10, 10)); + car = new Car('a', new PositionVector(DEFAULT_X, DEFAULT_Y)); } - @AfterEach - void tearDown() { - } @Test void setPosition() { - car.setPosition(new PositionVector(20, 20)); - checkPosition(20, 20); + CheckNextPosition(DEFAULT_X, DEFAULT_Y); + + List validPositions = new ArrayList<>(); + validPositions.add(new PositionVector(20, 20)); + validPositions.add(new PositionVector(0, 0)); + validPositions.add(new PositionVector(20, 0)); + validPositions.add(new PositionVector(0, 20)); + + for(PositionVector positionVector : validPositions) { + car.setPosition(positionVector); + assertEquals(positionVector, car.nextPosition()); + } + + List invalidPositions = new ArrayList<>(); + invalidPositions.add(new PositionVector(0, -20)); + invalidPositions.add(new PositionVector(-20, 0)); + invalidPositions.add(new PositionVector(-20, -20)); + + for(PositionVector positionVector : invalidPositions) { + boolean exception = false; + try { + car.setPosition(positionVector); + } catch (IllegalArgumentException e) { + exception = true; + } + assertTrue(exception); + + CheckNextPosition(0, 0); + } } - @Test - void nextPosition() { - checkPosition(10, 10); - } + @Test - void accelerate() { + void movement() { + car.move(); + CheckNextPosition(DEFAULT_X, DEFAULT_Y); + + List directions = Arrays.asList(PositionVector.Direction.values()); + + for (PositionVector.Direction direction1 : directions){ + + setUp(); + int nextPosX = DEFAULT_X; + int nextPosY = DEFAULT_Y; + + car.accelerate(direction1); + nextPosX += direction1.vector.getX(); + nextPosY += direction1.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + car.move(); + nextPosX += direction1.vector.getX(); + nextPosY += direction1.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + for (PositionVector.Direction direction2 : directions) { + car.accelerate(direction2); + nextPosX += direction2.vector.getX(); + nextPosY += direction2.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + car.move(); + nextPosX += direction1.vector.getX(); + nextPosY += direction1.vector.getY(); + nextPosX += direction2.vector.getX(); + nextPosY += direction2.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + } + + } } - @Test - void move() { - } @Test void crash() { + assertFalse(car.isCrashed()); + car.crash(); + assertTrue(car.isCrashed()); + } @Test - void isCrashed() { + void MoveStrategy() { + MoveStrategy moveStrategy; + + moveStrategy = new DoNotMoveStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); + + moveStrategy = new MoveListStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); + + moveStrategy = new PathFollowerMoveStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); + + moveStrategy = new UserMoveStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); } - @Test - void setMoveStrategy() { - } - @Test - void getMoveStrategy() { - } - void checkPosition(int x, int y) { - assertTrue(car.nextPosition().equals(new PositionVector(x, y))); + void CheckNextPosition(int x, int y) { + assertEquals(new PositionVector(x, y), car.nextPosition()); } } From 8086111772e34c4079d87805ee1a8eff94111306 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sun, 6 Mar 2022 18:13:27 +0100 Subject: [PATCH 03/36] Fix in CarTest.java @Test setPosition --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index a6d91ba..5f0c462 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -51,7 +51,7 @@ class CarTest { } assertTrue(exception); - CheckNextPosition(0, 0); + CheckNextPosition(DEFAULT_X, DEFAULT_Y); } } From 40cd4f7b72e59e83fbcf60f9d7ad2759d6015fab Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sun, 6 Mar 2022 18:57:01 +0100 Subject: [PATCH 04/36] Added Javadoc and comments in CarTest.java --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 91 ++++++++++++------- 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 5f0c462..3468cbf 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -11,38 +11,62 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; +/** + * Tests for Class Car + */ class CarTest { + Car car; + + // Default coordinates for tests int DEFAULT_X = 10; int DEFAULT_Y = 10; + /** + * Create a new Car Object and set Position to a defined Default Position + */ @BeforeEach void setUp() { car = new Car('a', new PositionVector(DEFAULT_X, DEFAULT_Y)); } + /** + * Method to check nextPosition with coordinates as int + * + * @param x the expected value for x coordinate + * @param y the expected value for y coordinate + */ + void CheckNextPosition(int x, int y) { + assertEquals(new PositionVector(x, y), car.nextPosition()); + } + /** + * - checks if the position of the car can be set and saved correctly with valid positions. + * - checks if an exception is throwed and position keeps unchanged if invalid coordinates are entered. + */ @Test void setPosition() { CheckNextPosition(DEFAULT_X, DEFAULT_Y); + // List of valid Positions List validPositions = new ArrayList<>(); validPositions.add(new PositionVector(20, 20)); validPositions.add(new PositionVector(0, 0)); validPositions.add(new PositionVector(20, 0)); validPositions.add(new PositionVector(0, 20)); - for(PositionVector positionVector : validPositions) { + for (PositionVector positionVector : validPositions) { car.setPosition(positionVector); assertEquals(positionVector, car.nextPosition()); } + // List of invalid positions. List invalidPositions = new ArrayList<>(); invalidPositions.add(new PositionVector(0, -20)); invalidPositions.add(new PositionVector(-20, 0)); invalidPositions.add(new PositionVector(-20, -20)); - for(PositionVector positionVector : invalidPositions) { + for (PositionVector positionVector : invalidPositions) { boolean exception = false; try { car.setPosition(positionVector); @@ -51,62 +75,73 @@ class CarTest { } assertTrue(exception); + // position should keep unchanged CheckNextPosition(DEFAULT_X, DEFAULT_Y); } } - + /** + * Checks if the methods accelerate and move are working correctly with acceleration in all directions. + * Checks also if velocity is calculated correctly if method accelerate is called a second time. + */ @Test void movement() { + // add all possible directions in a List + List directions = Arrays.asList(PositionVector.Direction.values()); + + //position shouldn't be changed because velocity should be 0. car.move(); CheckNextPosition(DEFAULT_X, DEFAULT_Y); - List directions = Arrays.asList(PositionVector.Direction.values()); - - for (PositionVector.Direction direction1 : directions){ + for (PositionVector.Direction direction1 : directions) { + //create a new instance of Car with default coordinates and velocity 0. setUp(); - int nextPosX = DEFAULT_X; - int nextPosY = DEFAULT_Y; + + //variables to save the actual expected result of method nextPosition + int ExpectedNextPosX = DEFAULT_X; + int ExpectedNextPosY = DEFAULT_Y; car.accelerate(direction1); - nextPosX += direction1.vector.getX(); - nextPosY += direction1.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); + ExpectedNextPosX += direction1.vector.getX(); + ExpectedNextPosY += direction1.vector.getY(); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); car.move(); - nextPosX += direction1.vector.getX(); - nextPosY += direction1.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); + ExpectedNextPosX += direction1.vector.getX(); + ExpectedNextPosY += direction1.vector.getY(); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); for (PositionVector.Direction direction2 : directions) { car.accelerate(direction2); - nextPosX += direction2.vector.getX(); - nextPosY += direction2.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); + ExpectedNextPosX += direction2.vector.getX(); + ExpectedNextPosY += direction2.vector.getY(); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); car.move(); - nextPosX += direction1.vector.getX(); - nextPosY += direction1.vector.getY(); - nextPosX += direction2.vector.getX(); - nextPosY += direction2.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); - + ExpectedNextPosX += (direction1.vector.getX() + direction2.vector.getX()); + ExpectedNextPosY += (direction1.vector.getY() + direction2.vector.getY()); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); } - } } + /** + * test for methods crash and isCrashed. checks if state crashed is set and returned correctly. + */ @Test void crash() { assertFalse(car.isCrashed()); car.crash(); assertTrue(car.isCrashed()); - } + /** + * test for methods setMoveStrategy. Checks if the MoveStrategy Object is saved and returned correctly + * with all Types of MoveStrategy. + */ @Test void MoveStrategy() { MoveStrategy moveStrategy; @@ -127,10 +162,4 @@ class CarTest { car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); } - - - - void CheckNextPosition(int x, int y) { - assertEquals(new PositionVector(x, y), car.nextPosition()); - } } From dea430e418c1bf1aacec97bc766cfc0f996c5637 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Mon, 7 Mar 2022 17:43:32 +0100 Subject: [PATCH 05/36] Added Test for Method getID in CarTest.java --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 3468cbf..e8db6aa 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -21,13 +21,19 @@ class CarTest { // Default coordinates for tests int DEFAULT_X = 10; int DEFAULT_Y = 10; + char DEFAULT_ID = 'f'; /** * Create a new Car Object and set Position to a defined Default Position */ @BeforeEach void setUp() { - car = new Car('a', new PositionVector(DEFAULT_X, DEFAULT_Y)); + car = new Car(DEFAULT_ID, new PositionVector(DEFAULT_X, DEFAULT_Y)); + } + + @Test + void getID() { + assertEquals(DEFAULT_ID, car.getID()); } /** From 31a24120eb29b2a4c9d1ffdb355f1fd1a72a17d5 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Mon, 7 Mar 2022 20:44:05 +0100 Subject: [PATCH 06/36] added checks for method getVelocity in Test Movement in CarTest.java --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index e8db6aa..472b356 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -42,7 +42,7 @@ class CarTest { * @param x the expected value for x coordinate * @param y the expected value for y coordinate */ - void CheckNextPosition(int x, int y) { + void checkNextPosition(int x, int y) { assertEquals(new PositionVector(x, y), car.nextPosition()); } @@ -52,7 +52,7 @@ class CarTest { */ @Test void setPosition() { - CheckNextPosition(DEFAULT_X, DEFAULT_Y); + checkNextPosition(DEFAULT_X, DEFAULT_Y); // List of valid Positions List validPositions = new ArrayList<>(); @@ -82,13 +82,17 @@ class CarTest { assertTrue(exception); // position should keep unchanged - CheckNextPosition(DEFAULT_X, DEFAULT_Y); + checkNextPosition(DEFAULT_X, DEFAULT_Y); } } + void checkVelocity(int x, int y) { + assertEquals(new PositionVector(x, y), car.getVelocity()); + } + /** - * Checks if the methods accelerate and move are working correctly with acceleration in all directions. + * Checks if the methods accelerate, move and getVelocity are working correctly with acceleration in all directions. * Checks also if velocity is calculated correctly if method accelerate is called a second time. */ @Test @@ -98,7 +102,7 @@ class CarTest { //position shouldn't be changed because velocity should be 0. car.move(); - CheckNextPosition(DEFAULT_X, DEFAULT_Y); + checkNextPosition(DEFAULT_X, DEFAULT_Y); for (PositionVector.Direction direction1 : directions) { @@ -106,29 +110,41 @@ class CarTest { setUp(); //variables to save the actual expected result of method nextPosition - int ExpectedNextPosX = DEFAULT_X; - int ExpectedNextPosY = DEFAULT_Y; + int expectedNextPosX = DEFAULT_X; + int expectedNextPosY = DEFAULT_Y; + + //variables to save the acutal expected result of method getVelocity + int expectedVelocityX = 0; + int expectedVelocityY = 0; car.accelerate(direction1); - ExpectedNextPosX += direction1.vector.getX(); - ExpectedNextPosY += direction1.vector.getY(); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + expectedVelocityX += direction1.vector.getX(); + expectedVelocityY += direction1.vector.getY(); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); car.move(); - ExpectedNextPosX += direction1.vector.getX(); - ExpectedNextPosY += direction1.vector.getY(); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); for (PositionVector.Direction direction2 : directions) { car.accelerate(direction2); - ExpectedNextPosX += direction2.vector.getX(); - ExpectedNextPosY += direction2.vector.getY(); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + expectedVelocityX += direction2.vector.getX(); + expectedVelocityY += direction2.vector.getY(); + expectedNextPosX += direction2.vector.getX(); + expectedNextPosY += direction2.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); car.move(); - ExpectedNextPosX += (direction1.vector.getX() + direction2.vector.getX()); - ExpectedNextPosY += (direction1.vector.getY() + direction2.vector.getY()); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + checkVelocity(expectedVelocityX, expectedVelocityY); + expectedNextPosX += (direction1.vector.getX() + direction2.vector.getX()); + expectedNextPosY += (direction1.vector.getY() + direction2.vector.getY()); + checkNextPosition(expectedNextPosX, expectedNextPosY); } } } From 19b227c59fccb2b65816a3eebfbeda0c82d0b0d4 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 14:18:33 +0100 Subject: [PATCH 07/36] merged cartest branch into car branch --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 472b356..87154a6 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -74,6 +74,7 @@ class CarTest { for (PositionVector positionVector : invalidPositions) { boolean exception = false; + setUp(); try { car.setPosition(positionVector); } catch (IllegalArgumentException e) { From a67a96d19de2cb4bf71227229d115ca32bc8a437 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Thu, 10 Mar 2022 14:46:51 +0100 Subject: [PATCH 08/36] fix in CarTest.java --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 87154a6..89b1965 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -105,34 +105,37 @@ class CarTest { car.move(); checkNextPosition(DEFAULT_X, DEFAULT_Y); + + for (PositionVector.Direction direction1 : directions) { - - //create a new instance of Car with default coordinates and velocity 0. - setUp(); - - //variables to save the actual expected result of method nextPosition - int expectedNextPosX = DEFAULT_X; - int expectedNextPosY = DEFAULT_Y; - - //variables to save the acutal expected result of method getVelocity - int expectedVelocityX = 0; - int expectedVelocityY = 0; - - car.accelerate(direction1); - expectedVelocityX += direction1.vector.getX(); - expectedVelocityY += direction1.vector.getY(); - expectedNextPosX += direction1.vector.getX(); - expectedNextPosY += direction1.vector.getY(); - checkVelocity(expectedVelocityX, expectedVelocityY); - checkNextPosition(expectedNextPosX, expectedNextPosY); - - car.move(); - expectedNextPosX += direction1.vector.getX(); - expectedNextPosY += direction1.vector.getY(); - checkVelocity(expectedVelocityX, expectedVelocityY); - checkNextPosition(expectedNextPosX, expectedNextPosY); - for (PositionVector.Direction direction2 : directions) { + + //create a new instance of Car with default coordinates and velocity 0. + setUp(); + + //variables to save the actual expected result of method nextPosition + int expectedNextPosX = DEFAULT_X; + int expectedNextPosY = DEFAULT_Y; + + //variables to save the acutal expected result of method getVelocity + int expectedVelocityX = 0; + int expectedVelocityY = 0; + + car.accelerate(direction1); + expectedVelocityX += direction1.vector.getX(); + expectedVelocityY += direction1.vector.getY(); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); + + car.move(); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); + + car.accelerate(direction2); expectedVelocityX += direction2.vector.getX(); expectedVelocityY += direction2.vector.getY(); From 0fafa3e0e70027501ba1e7acf2c4d3de96a26d3f Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 15:17:04 +0100 Subject: [PATCH 09/36] finished both exceptions. --- .../ch/zhaw/pm2/racetrack/InvalidFileFormatException.java | 5 ++++- .../ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index e7d0c07..c60ea91 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -1,5 +1,8 @@ package ch.zhaw.pm2.racetrack; public class InvalidFileFormatException extends Exception { - // TODO: implementation + + public InvalidFileFormatException(String errorMessage) { + super(errorMessage); + } } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java index 25de664..97b0310 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java @@ -1,5 +1,7 @@ package ch.zhaw.pm2.racetrack; public class InvalidTrackFormatException extends Exception { - // TODO: implementation + public InvalidTrackFormatException(String errorMessage) { + super(errorMessage); + } } From 6080b48b828748ba31112fb313d3286b470a8bff Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 15:18:16 +0100 Subject: [PATCH 10/36] finished both exceptions. --- .../java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index c60ea91..91c59fa 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -1,7 +1,6 @@ package ch.zhaw.pm2.racetrack; public class InvalidFileFormatException extends Exception { - public InvalidFileFormatException(String errorMessage) { super(errorMessage); } From dca575999e4efe3335bff6aa91cb6b657f99b62a Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 15:20:53 +0100 Subject: [PATCH 11/36] Added javadocs to exceptions. --- .../java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java | 3 +++ .../ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index 91c59fa..6655e69 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -1,5 +1,8 @@ package ch.zhaw.pm2.racetrack; +/** + * Class for Exception when invalid Fileformat is used. + */ public class InvalidFileFormatException extends Exception { public InvalidFileFormatException(String errorMessage) { super(errorMessage); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java index 97b0310..3cdd04c 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java @@ -1,5 +1,8 @@ package ch.zhaw.pm2.racetrack; +/** + * Class for Exception when invalid track format is used. + */ public class InvalidTrackFormatException extends Exception { public InvalidTrackFormatException(String errorMessage) { super(errorMessage); From cf1a8d703e3deac19a614b6a9dbbef6315eb7b0c Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Mon, 21 Mar 2022 01:26:26 +0100 Subject: [PATCH 12/36] continued class PathFinderStrategy --- .../strategy/PathFinderStrategy.java | 83 +++++++++++++------ 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java index 23c8c9b..8f08461 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java @@ -1,5 +1,7 @@ package ch.zhaw.pm2.racetrack.strategy; +import ch.zhaw.pm2.racetrack.Game; +import ch.zhaw.pm2.racetrack.InvalidTrackFormatException; import ch.zhaw.pm2.racetrack.PositionVector; import ch.zhaw.pm2.racetrack.Track; @@ -10,53 +12,74 @@ import java.util.List; public class PathFinderStrategy implements MoveStrategy{ private ArrayList possiblePaths; - private Track track; - List directions = Arrays.asList(PositionVector.Direction.values()); + private Game game; + private boolean foundPath = false; + private List directions = Arrays.asList(PositionVector.Direction.values()); + private ArrayList directionToTake = new ArrayList<>(); + private int currentMove = 0; - public PathFinderStrategy(Track track, int carIndex) { - this.track = track; + public PathFinderStrategy(Game game, int carIndex) { + this.game = game; possiblePaths = new ArrayList<>(); + calculatePaths(); + try { + getDirections(); + } catch (InvalidTrackFormatException e) { + e.printStackTrace(); + } } - private void test(){ - ArrayList temporary = new ArrayList<>(); - Iterator it = possiblePaths.iterator(); - - while(it.hasNext()) { - tryOutPaths current = it.next(); - if (!current.isFeasible()) { - it.remove(); + private void calculatePaths() { + for (int i = 0; i < 50; i++) { + if(foundPath){ + break; } - else { - for (PositionVector.Direction direction : directions) { - temporary.add(current); - if (temporary.get(temporary.size() - 1).takeDirection(direction)){ - break; + + ArrayList temporary = new ArrayList<>(); + Iterator it = possiblePaths.iterator(); + + while (it.hasNext()) { + tryOutPaths current = it.next(); + if (!current.isFeasible()) { + it.remove(); + } else { + for (PositionVector.Direction direction : directions) { + temporary.add(current); + if (temporary.get(temporary.size() - 1).takeDirection(direction)) { + foundPath = true; + } } } } + possiblePaths.clear(); + possiblePaths.addAll(temporary); } - //ab hier zu löschen - for (tryOutPaths paths : possiblePaths){ - for (PositionVector.Direction direction : directions) { - temporary.add(paths); - temporary.get(temporary.size() - 1).takeDirection(direction); + } + + private void getDirections() throws InvalidTrackFormatException { + if(foundPath){ + for (tryOutPaths path: possiblePaths) { + if (path.isFinished()){ + directionToTake = path.getDirectionsTaken(); + } } + } else { + throw new InvalidTrackFormatException(); } - //bis hier löschen - possiblePaths.clear(); - possiblePaths.addAll(temporary); } @Override public PositionVector.Direction nextMove() { - return null; + PositionVector.Direction direction = directionToTake.get(currentMove); + currentMove++; + return direction; } public class tryOutPaths { ArrayList directionsTaken = new ArrayList<>(); PositionVector currentPosition; Track track; + private boolean feasible; private boolean finished; public tryOutPaths(Track track){ @@ -81,5 +104,13 @@ public class PathFinderStrategy implements MoveStrategy{ return false; } } + + public ArrayList getDirectionsTaken(){ + return directionsTaken; + } + + public boolean isFinished(){ + return finished; + } } } 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 13/36] 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; + } } From c59e4a30d87bc869a95787a2835c0b6fa7c64149 Mon Sep 17 00:00:00 2001 From: romanschenk37 Date: Tue, 22 Mar 2022 18:31:15 +0100 Subject: [PATCH 14/36] Update MoveListStrategy.java --- .../java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 774b323..3de3f23 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java @@ -20,7 +20,7 @@ public class MoveListStrategy implements MoveStrategy { readFile(new File(path)); } - protected void readFile(File trackFile) throws FileNotFoundException { + private void readFile(File trackFile) throws FileNotFoundException { Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); Direction[] directions = Direction.values(); while (scanner.hasNextLine()) { From 8877f1476f826cf5f4b11b6aefeeeb9b354b4524 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Tue, 22 Mar 2022 18:47:14 +0100 Subject: [PATCH 15/36] GameTest --- .../java/ch/zhaw/pm2/racetrack/GameTest.java | 129 ++++++++++++++++-- 1 file changed, 114 insertions(+), 15 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java index 03cb0f3..ebfb473 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java @@ -1,11 +1,14 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.strategy.UserMoveStrategy; +import org.junit.Before; import org.junit.jupiter.api.*; import java.io.File; +import java.util.List; import static ch.zhaw.pm2.racetrack.Game.NO_WINNER; +import static ch.zhaw.pm2.racetrack.PositionVector.Direction.*; class GameTest { private UserInterface userInterface; @@ -20,40 +23,40 @@ class GameTest { userInterface = new UserInterface("Test"); game = new Game(userInterface); track = game.selectTrack(new File(".\\tracks\\challenge.txt")); - game.selectMoveStrategy(track.getCar(0),new UserMoveStrategy(new UserInterface("Testing"),0, track.getCarId(0))); - game.selectMoveStrategy(track.getCar(1),new UserMoveStrategy(new UserInterface("Testing"),1, track.getCarId(1))); + game.selectMoveStrategy(track.getCar(0), new UserMoveStrategy(new UserInterface("Testing"), 0, track.getCarId(0))); + game.selectMoveStrategy(track.getCar(1), new UserMoveStrategy(new UserInterface("Testing"), 1, track.getCarId(1))); } @Test void getCurrentCarIndex() { - Assertions.assertEquals(0,game.getCurrentCarIndex()); + Assertions.assertEquals(0, game.getCurrentCarIndex()); game.switchToNextActiveCar(); - Assertions.assertEquals(1,game.getCurrentCarIndex()); + Assertions.assertEquals(1, game.getCurrentCarIndex()); } @Test void getCarId() { - Assertions.assertEquals('a',game.getCarId(0)); - Assertions.assertEquals('b',game.getCarId(1)); + Assertions.assertEquals('a', game.getCarId(0)); + Assertions.assertEquals('b', game.getCarId(1)); } @Test void getCarPosition() { - Assertions.assertEquals(new PositionVector(24,22),game.getCarPosition(0)); - Assertions.assertEquals(new PositionVector(24,24),game.getCarPosition(1)); + Assertions.assertEquals(new PositionVector(24, 22), game.getCarPosition(0)); + Assertions.assertEquals(new PositionVector(24, 24), game.getCarPosition(1)); } @Test void getCarVelocity() { - Assertions.assertEquals(new PositionVector(0,0),game.getCarVelocity(0)); - Assertions.assertEquals(new PositionVector(0,0),game.getCarVelocity(1)); + Assertions.assertEquals(new PositionVector(0, 0), game.getCarVelocity(0)); + Assertions.assertEquals(new PositionVector(0, 0), game.getCarVelocity(1)); } @Test void getWinner() { - Assertions.assertEquals(NO_WINNER,game.getWinner()); + Assertions.assertEquals(NO_WINNER, game.getWinner()); } @Test @@ -75,16 +78,16 @@ class GameTest { userInterface = new UserInterface("Test"); game = new Game(userInterface); track = game.selectTrack(new File(".\\tracks\\challenge.txt")); - game.selectMoveStrategy(track.getCar(0),new UserMoveStrategy(new UserInterface("Testing"),0, track.getCarId(0))); - game.selectMoveStrategy(track.getCar(1),new UserMoveStrategy(new UserInterface("Testing"),1, track.getCarId(1))); + game.selectMoveStrategy(track.getCar(0), new UserMoveStrategy(new UserInterface("Testing"), 0, track.getCarId(0))); + game.selectMoveStrategy(track.getCar(1), new UserMoveStrategy(new UserInterface("Testing"), 1, track.getCarId(1))); } @Test void carTurnCorrect() { try { - game.doCarTurn(PositionVector.Direction.RIGHT); - Assertions.assertEquals(new PositionVector(1,0),game.getCarVelocity(0)); + game.doCarTurn(RIGHT); + Assertions.assertEquals(new PositionVector(1, 0), game.getCarVelocity(0)); } catch (PositionVectorNotValid positionVectorNotValid) { positionVectorNotValid.printStackTrace(); } @@ -99,6 +102,102 @@ class GameTest { positionVectorNotValid.printStackTrace(); } } + } + + @Nested + @DisplayName("Playtrough") + class Play { + private Game game; + + @Test + void winner() { + game = new Game(new interFace("Test")); + try { + game.initPhase(); + Assertions.assertEquals('a',game.gamePhase()); + } catch (InvalidTrackFormatException | PositionVectorNotValid e) { + e.printStackTrace(); + } + } + + + + } + + private class interFace extends UserInterface { + + private static PositionVector.Direction[] directions = {RIGHT, + RIGHT, + RIGHT, + NONE, + NONE, + NONE, + NONE, + UP, + LEFT, + LEFT, + LEFT, + LEFT, + UP_LEFT, + NONE, + RIGHT, + RIGHT, + RIGHT, + NONE, + LEFT, + DOWN_LEFT, + DOWN_LEFT, + LEFT, + LEFT, + NONE, + RIGHT, + NONE, + DOWN, + DOWN, + RIGHT, + NONE, + RIGHT, + DOWN, + NONE, + UP_RIGHT, + RIGHT, + UP_RIGHT, + UP_RIGHT, + RIGHT, + RIGHT}; + + private static int pointer = -1; + + public interFace(String welcometxt) { + super(welcometxt); + } + + @Override + public int selectOption(String text, List options) { + if (text.equals("Select Track file")) { + return 1; + } else if (text.contains("Select Strategy for Car")) { + return 2; + } + return 0; + } + + public void printInformation(String text) { + } + + public void printTrack(Track track) { + } + + public void quit(String text) { + } + + public PositionVector.Direction selectDirection(int playingCarIndex, char playingCarID) { + pointer += 1; + if(pointer < directions.length) { + return directions[pointer]; + } + return NONE; + } } } From dc34d984f8212477bd53da9c532c41baea3f07ba Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Tue, 22 Mar 2022 19:04:26 +0100 Subject: [PATCH 16/36] -CarTest added winpoint test -added Klassendiagramm -create Constructor InvalidTrackFormatException --- Klassendiagramm.drawio | 1 + .../InvalidTrackFormatException.java | 3 ++ .../java/ch/zhaw/pm2/racetrack/CarTest.java | 37 ++++++++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 Klassendiagramm.drawio diff --git a/Klassendiagramm.drawio b/Klassendiagramm.drawio new file mode 100644 index 0000000..afde28c --- /dev/null +++ b/Klassendiagramm.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java index 3cdd04c..fa24c25 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java @@ -7,4 +7,7 @@ public class InvalidTrackFormatException extends Exception { public InvalidTrackFormatException(String errorMessage) { super(errorMessage); } + public InvalidTrackFormatException() { + super(); + } } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 89b1965..6325c9b 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -2,9 +2,11 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.strategy.*; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -176,7 +178,11 @@ class CarTest { car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); - moveStrategy = new MoveListStrategy(); + try { + moveStrategy = new MoveListStrategy(".\\moves\\challenge-car-a.txt"); + } catch (FileNotFoundException e) { + Assertions.fail(); + } car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); @@ -184,8 +190,35 @@ class CarTest { car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); - moveStrategy = new UserMoveStrategy(); + moveStrategy = new UserMoveStrategy(new UserInterface("Hello"),0,'a'); car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); } + + /** + * Test for get WinPoints + */ + @Test + void getWinPoints() { + assertEquals(0,car.getWinPoints()); + } + + /** + * Test for increase WinPoints + */ + @Test + void increaseWinPoints() { + car.increaseWinPoints(); + assertEquals(1,car.getWinPoints()); + } + + /** + * Test for deduct WinPoints + */ + @Test + void deductWinPoints() { + car.deductWinPoints(); + assertEquals(-1,car.getWinPoints()); + } + } From 45918124dfc3d8e0b2f234d0e5d6066df86a2291 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Wed, 23 Mar 2022 08:48:46 +0100 Subject: [PATCH 17/36] refactoring and javadoc in PathFollowerMoveStrategy.javaa --- .../strategy/PathFollowerMoveStrategy.java | 96 ++++++++++++------- 1 file changed, 59 insertions(+), 37 deletions(-) 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 f85a0e9..74f55c0 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java @@ -13,12 +13,30 @@ 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 { + + /** + * The current Position of the car. + */ private PositionVector currentPosition; + /** + * The current Velocity of the car. + */ private PositionVector currentVelocity; + /** + * List of all points on the path. + */ private ArrayList pointList; + /** + * The index of the next point on the path. + */ private int pointer; - + /** + * Constructer to create a new PathFollowerMoveStrategy for a car. + * @param path The location where the file is saved + * @param startPosition The start position of the car + * @throws FileNotFoundException If the file with the given path does not exist. + */ public PathFollowerMoveStrategy(String path, PositionVector startPosition) throws FileNotFoundException { pointList = new ArrayList<>(); pointer = 0; @@ -27,6 +45,11 @@ public class PathFollowerMoveStrategy implements MoveStrategy { currentVelocity = new PositionVector(0, 0); } + /** + * Method to read the given File and add the points to the pointList + * @param trackFile the File Object which should be read + * @throws FileNotFoundException If the file with the given path does not exist. + */ public void readFile(File trackFile) throws FileNotFoundException { Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); while (scanner.hasNextLine()) { @@ -36,61 +59,60 @@ public class PathFollowerMoveStrategy implements MoveStrategy { } } + /** + * Method to select the direction for the next move. + * @return The direction for the next move. null if there are no points left in the list. + */ @Override public Direction nextMove() { + // if no more points in the list --> return null if (pointer >= pointList.size()) { return null; } - int accelerationX = 0; - int accelerationY = 0; + + // increase pointer variable if the next point is reached. 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; - } - - + // calculate Vector from current Position to next Point 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; + + // select acceleration for X + int accelerationX; + if((movementVector.getX() == 0 && currentVelocity.getX() > 0) || //reduce velocity to 0 if the destination coordinate is reached + (movementVector.getX() > 0 && movementVector.getX()/2.0 <= currentVelocity.getX()) || //increase velocity + (movementVector.getX() < 0 && movementVector.getX()/2.0 < currentVelocity.getX())){ //reduce velocity + accelerationX = -1; + } else if((movementVector.getX() == 0 && currentVelocity.getX() < 0) || //reduce velocity to 0 if the destination coordinate is reached + (movementVector.getX() > 0 && movementVector.getX()/2.0 > currentVelocity.getX()) || //increase velocity + (movementVector.getX() < 0 && movementVector.getX()/2.0 >= currentVelocity.getX())) { //reduce velocity + 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; + else { //no acceleration + accelerationX = 0; } - if(movementVector.getY() > 0 && movementVector.getY()/2.0 > currentVelocity.getY()) { - accelerationY = 1; + // select acceleration for Y + int accelerationY; + if((movementVector.getY() == 0 && currentVelocity.getY() > 0) || //reduce velocity to 0 if the destination coordinate is reached + (movementVector.getY() > 0 && movementVector.getY()/2.0 <= currentVelocity.getY()) || //increase velocity + (movementVector.getY() < 0 && movementVector.getY()/2.0 < currentVelocity.getY())){ //reduce velocity + accelerationY = -1; + } else if((movementVector.getY() == 0 && currentVelocity.getY() < 0) || //reduce velocity to 0 if the destination coordinate is reached + (movementVector.getY() > 0 && movementVector.getY()/2.0 > currentVelocity.getY()) || //increase velocity + (movementVector.getY() < 0 && movementVector.getY()/2.0 >= currentVelocity.getY())) { //reduce velocity + 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; + else { //no acceleration + accelerationY = 0; } - + //update current Velocity and current Position with the selected acceleration currentVelocity = new PositionVector(currentVelocity.getX() + accelerationX, currentVelocity.getY() + accelerationY); currentPosition = new PositionVector(currentPosition.getX() + currentVelocity.getX(), currentPosition.getY() + currentVelocity.getY()); + //Find Direction for acceleration PositionVector acceleration = new PositionVector(accelerationX, accelerationY); Direction[] directions = Direction.values(); for (Direction direction : directions) { From b1a4f3b3dbe5c8244e36653055d40155d1dfae4f Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Wed, 23 Mar 2022 08:53:40 +0100 Subject: [PATCH 18/36] -CarTest added winpoint test -added Klassendiagramm -create Constructor InvalidTrackFormatException --- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 2 +- .../java/ch/zhaw/pm2/racetrack/GameTest.java | 164 +++++++++++------- 2 files changed, 98 insertions(+), 68 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 413fef3..44bf317 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -222,7 +222,7 @@ public class Game implements GameSpecification { direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); if (direction == null) { track.getCar(currentCarIndex).setMoveStrategy(new DoNotMoveStrategy()); - direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); //TODO: Entfernen? + track.getCar(currentCarIndex).getMoveStrategy().nextMove(); }else { doCarTurn(direction); } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java index ebfb473..0c1dea3 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java @@ -1,39 +1,51 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.strategy.UserMoveStrategy; -import org.junit.Before; -import org.junit.jupiter.api.*; - +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; import java.io.File; import java.util.List; - import static ch.zhaw.pm2.racetrack.Game.NO_WINNER; import static ch.zhaw.pm2.racetrack.PositionVector.Direction.*; + +/** + * Test for Class Game + */ class GameTest { private UserInterface userInterface; private Game game; private Track track; + private String TRACK_FILE_PATH = ".\\tracks\\challenge.txt"; + private int CAR_INDEX_ONE = 0; + private int CAR_INDEX_TWO = 1; + + /** + * This nested Class tests if the game gets initiatet correctly + */ @Nested @DisplayName("Test correct Setup") class Setup { + @BeforeEach void setup() { userInterface = new UserInterface("Test"); game = new Game(userInterface); - track = game.selectTrack(new File(".\\tracks\\challenge.txt")); - game.selectMoveStrategy(track.getCar(0), new UserMoveStrategy(new UserInterface("Testing"), 0, track.getCarId(0))); - game.selectMoveStrategy(track.getCar(1), new UserMoveStrategy(new UserInterface("Testing"), 1, track.getCarId(1))); + track = game.selectTrack(new File(TRACK_FILE_PATH)); + game.selectMoveStrategy(track.getCar(CAR_INDEX_ONE), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_ONE, track.getCarId(CAR_INDEX_ONE))); + game.selectMoveStrategy(track.getCar(CAR_INDEX_TWO), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_TWO, track.getCarId(CAR_INDEX_TWO))); } - @Test void getCurrentCarIndex() { - Assertions.assertEquals(0, game.getCurrentCarIndex()); + Assertions.assertEquals(CAR_INDEX_ONE, game.getCurrentCarIndex()); game.switchToNextActiveCar(); - Assertions.assertEquals(1, game.getCurrentCarIndex()); + Assertions.assertEquals(CAR_INDEX_TWO, game.getCurrentCarIndex()); } @Test @@ -70,16 +82,20 @@ class GameTest { } } + /** + * This nested Class makes basic manipulation after Game init. + */ @Nested @DisplayName("Basic manipulation") - class manipulation { + class Manipulation { + @BeforeEach void setup() { userInterface = new UserInterface("Test"); game = new Game(userInterface); - track = game.selectTrack(new File(".\\tracks\\challenge.txt")); - game.selectMoveStrategy(track.getCar(0), new UserMoveStrategy(new UserInterface("Testing"), 0, track.getCarId(0))); - game.selectMoveStrategy(track.getCar(1), new UserMoveStrategy(new UserInterface("Testing"), 1, track.getCarId(1))); + track = game.selectTrack(new File(TRACK_FILE_PATH)); + game.selectMoveStrategy(track.getCar(CAR_INDEX_ONE), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_ONE, track.getCarId(CAR_INDEX_ONE))); + game.selectMoveStrategy(track.getCar(CAR_INDEX_TWO), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_TWO, track.getCarId(CAR_INDEX_TWO))); } @@ -104,6 +120,9 @@ class GameTest { } } + /** + * This nested Class tests a Playtrough. And implements a UserInterface interagtion to pretend a real player + */ @Nested @DisplayName("Playtrough") class Play { @@ -111,75 +130,86 @@ class GameTest { @Test void winner() { - game = new Game(new interFace("Test")); + game = new Game(new interFace("Test",new Integer[]{0,2,1},new PositionVector.Direction[]{RIGHT, + RIGHT, + RIGHT, + NONE, + NONE, + NONE, + NONE, + UP, + LEFT, + LEFT, + LEFT, + LEFT, + UP_LEFT, + NONE, + RIGHT, + RIGHT, + RIGHT, + NONE, + LEFT, + DOWN_LEFT, + DOWN_LEFT, + LEFT, + LEFT, + NONE, + RIGHT, + NONE, + DOWN, + DOWN, + RIGHT, + NONE, + RIGHT, + DOWN, + NONE, + UP_RIGHT, + RIGHT, + UP_RIGHT, + UP_RIGHT, + RIGHT, + RIGHT})); try { game.initPhase(); - Assertions.assertEquals('a',game.gamePhase()); + Assertions.assertEquals("a",game.gamePhase()); } catch (InvalidTrackFormatException | PositionVectorNotValid e) { e.printStackTrace(); } } - + @Test + void crashA() { + game = new Game(new interFace("Test",new Integer[]{0,2,2},new PositionVector.Direction[]{UP})); + try { + game.initPhase(); + Assertions.assertEquals("b",game.gamePhase()); + } catch (InvalidTrackFormatException | PositionVectorNotValid e) { + e.printStackTrace(); + } + } } private class interFace extends UserInterface { - private static PositionVector.Direction[] directions = {RIGHT, - RIGHT, - RIGHT, - NONE, - NONE, - NONE, - NONE, - UP, - LEFT, - LEFT, - LEFT, - LEFT, - UP_LEFT, - NONE, - RIGHT, - RIGHT, - RIGHT, - NONE, - LEFT, - DOWN_LEFT, - DOWN_LEFT, - LEFT, - LEFT, - NONE, - RIGHT, - NONE, - DOWN, - DOWN, - RIGHT, - NONE, - RIGHT, - DOWN, - NONE, - UP_RIGHT, - RIGHT, - UP_RIGHT, - UP_RIGHT, - RIGHT, - RIGHT}; + private final PositionVector.Direction[] directions; + private final Integer[] instructions; + private int pointerDir,pointerInstruction; - private static int pointer = -1; - public interFace(String welcometxt) { + public interFace(String welcometxt, Integer[] instructions, PositionVector.Direction[] directions) { super(welcometxt); + pointerDir = -1; + pointerInstruction = -1; + this.instructions = instructions; + this.directions = directions; } @Override public int selectOption(String text, List options) { - if (text.equals("Select Track file")) { - return 1; - } else if (text.contains("Select Strategy for Car")) { - return 2; - } - return 0; + pointerInstruction++; + return instructions[pointerInstruction]; + } public void printInformation(String text) { @@ -192,9 +222,9 @@ class GameTest { } public PositionVector.Direction selectDirection(int playingCarIndex, char playingCarID) { - pointer += 1; - if(pointer < directions.length) { - return directions[pointer]; + pointerDir += 1; + if(pointerDir < directions.length) { + return directions[pointerDir]; } return NONE; } From 6ac4f644561fd61f7e18ee2d03b36bb59c1e519b Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Wed, 23 Mar 2022 08:55:32 +0100 Subject: [PATCH 19/36] Javadoc in PathFollowerMoveStrategy.java --- .../zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 74f55c0..807ddc8 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java @@ -32,7 +32,7 @@ public class PathFollowerMoveStrategy implements MoveStrategy { private int pointer; /** - * Constructer to create a new PathFollowerMoveStrategy for a car. + * Constructor to create a new PathFollowerMoveStrategy for a car. * @param path The location where the file is saved * @param startPosition The start position of the car * @throws FileNotFoundException If the file with the given path does not exist. From 826f67d125320c326cfa7d11c65a682dcad0836e Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Wed, 23 Mar 2022 09:10:51 +0100 Subject: [PATCH 20/36] gamePhase() prevent null direction --- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 44bf317..fcfd270 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -222,10 +222,9 @@ public class Game implements GameSpecification { direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); if (direction == null) { track.getCar(currentCarIndex).setMoveStrategy(new DoNotMoveStrategy()); - track.getCar(currentCarIndex).getMoveStrategy().nextMove(); - }else { - doCarTurn(direction); + direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); } + doCarTurn(direction); switchToNextActiveCar(); } userInterface.printTrack(track); From ded9023ff1d3c008d2874f48d7de426790c6aeb6 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Wed, 23 Mar 2022 11:24:58 +0100 Subject: [PATCH 21/36] adapted CarTest.java for PathFolowerMoveStrategy.java --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 6325c9b..ebac56c 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -186,7 +186,11 @@ class CarTest { car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); - moveStrategy = new PathFollowerMoveStrategy(); + try { + moveStrategy = new PathFollowerMoveStrategy(".\\follower\\challenge_points.txt", new PositionVector(0, 0)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); From a14327a2a7c40a2879a70b7f4951037fb97480ba Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Wed, 23 Mar 2022 21:07:44 +0100 Subject: [PATCH 22/36] started readme --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 9156ddf..7219a8b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,25 @@ # team02-AngryNerds-projekt1-racetrack PM2 Team 02 Projekt 1 Racetrack +Racetrack is a pen and paper game that dates back to the early 1960s in this version of the game, the game is digitalized and the math behind it is done automatically rather than calculated by hand and the winner gets informed automatically as well. + +The aim of the game is to finish the race faster than your opponent or win by being the only survivor in case the other cars crash. + +In order to not crash you have to keep in mind the acceleration and other players car to get to the finish line safely. + +#Initialization: +###The game can be initialized by the terminal command: + ./gradlew run +###You will then be prompted to select a track file from the selection by entering the corresponding number. +###For each car that is taking part in the race a strategy has to be chosen there are the following options: ++ ####Do not move Strategy +> This Strategy sets the car stationary and it won't make any moves during the game staying at the startpoint indefinitely. ++ User Move Strategy +> The player is prompted for each move to make a choice the different choices you are able to take are as followed: +> > 1=down-left
2=down
3=down-right
4=left
5=no acceleration
6=right
7=up-left
8=up
9=up-right
it is also possible to leave the game when it is your turn by entering 10 ++ Move List Strategy +> For this strategy a predefined list of moves have to be given, the list may contain all allowed moves like mentioned in User Move Strategy ++ Path Follow Move Strategy +> A list of point has to be given to the follow move strategy, the strategy will then calculate the route to cross each point in the given order. ++ Path Finder Strategy +> The pathfinder Strategy Calculates a route itself and follows it direction fully automatically. + From 1c63c0cb211e2cc11c4873ba1a2de4ac9e37d6f0 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Wed, 23 Mar 2022 21:08:57 +0100 Subject: [PATCH 23/36] started readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7219a8b..6bfff28 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,10 @@ In order to not crash you have to keep in mind the acceleration and other player ###The game can be initialized by the terminal command: ./gradlew run ###You will then be prompted to select a track file from the selection by entering the corresponding number. + ###For each car that is taking part in the race a strategy has to be chosen there are the following options: -+ ####Do not move Strategy + ++ Do not move Strategy > This Strategy sets the car stationary and it won't make any moves during the game staying at the startpoint indefinitely. + User Move Strategy > The player is prompted for each move to make a choice the different choices you are able to take are as followed: From 7c87f4b2fd45bd796516f3decb091ee53f7a3a96 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Wed, 23 Mar 2022 21:11:36 +0100 Subject: [PATCH 24/36] started readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6bfff28..4605561 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ The aim of the game is to finish the race faster than your opponent or win by be In order to not crash you have to keep in mind the acceleration and other players car to get to the finish line safely. -#Initialization: -###The game can be initialized by the terminal command: +# Initialization: +### The game can be initialized by the terminal command: ./gradlew run -###You will then be prompted to select a track file from the selection by entering the corresponding number. +### You will then be prompted to select a track file from the selection by entering the corresponding number. -###For each car that is taking part in the race a strategy has to be chosen there are the following options: +### For each car that is taking part in the race a strategy has to be chosen there are the following options: + Do not move Strategy > This Strategy sets the car stationary and it won't make any moves during the game staying at the startpoint indefinitely. From 082d1414f5deb330ddf65ee887409b27ed9a66c9 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Wed, 23 Mar 2022 21:19:37 +0100 Subject: [PATCH 25/36] started readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4605561..fd95499 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,11 @@ The aim of the game is to finish the race faster than your opponent or win by be In order to not crash you have to keep in mind the acceleration and other players car to get to the finish line safely. # Initialization: -### The game can be initialized by the terminal command: +#### The game can be initialized by the terminal command: ./gradlew run -### You will then be prompted to select a track file from the selection by entering the corresponding number. +You will then be prompted to select a track file from the selection by entering the corresponding number. -### For each car that is taking part in the race a strategy has to be chosen there are the following options: +#### For each car that is taking part in the race a strategy has to be chosen there are the following options: + Do not move Strategy > This Strategy sets the car stationary and it won't make any moves during the game staying at the startpoint indefinitely. @@ -25,3 +25,5 @@ In order to not crash you have to keep in mind the acceleration and other player + Path Finder Strategy > The pathfinder Strategy Calculates a route itself and follows it direction fully automatically. +##Determining a winner +The winner gets determined automatically.
The car that first passes the finish line (doing a complete round) is given the win, if all car except one crash the surviving car will be crowned as the winner.
The game will inform you of this, and you will have the option to quit the game or play another match. From dc704cce4c0a0d53a132ea8a80b028a23ea1ea9d Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Wed, 23 Mar 2022 21:32:15 +0100 Subject: [PATCH 26/36] continued readme --- README.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fd95499..e3e5c8a 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ You will then be prompted to select a track file from the selection by entering #### For each car that is taking part in the race a strategy has to be chosen there are the following options: + Do not move Strategy -> This Strategy sets the car stationary and it won't make any moves during the game staying at the startpoint indefinitely. +> This Strategy sets the car stationary, and it won't make any moves during the game staying at the startpoint indefinitely. + User Move Strategy -> The player is prompted for each move to make a choice the different choices you are able to take are as followed: +> The player is prompted for each move to make a choice the different choices you are able to take are as following: > > 1=down-left
2=down
3=down-right
4=left
5=no acceleration
6=right
7=up-left
8=up
9=up-right
it is also possible to leave the game when it is your turn by entering 10 + Move List Strategy > For this strategy a predefined list of moves have to be given, the list may contain all allowed moves like mentioned in User Move Strategy @@ -25,5 +25,15 @@ You will then be prompted to select a track file from the selection by entering + Path Finder Strategy > The pathfinder Strategy Calculates a route itself and follows it direction fully automatically. -##Determining a winner +The shown Track can be interpreted as following:
+'#' is a Wall
+'>,<,^,v' are finish line components
+And every other character represents a car. + +### Determining a winner The winner gets determined automatically.
The car that first passes the finish line (doing a complete round) is given the win, if all car except one crash the surviving car will be crowned as the winner.
The game will inform you of this, and you will have the option to quit the game or play another match. + +## Branching Model +We choose a simple branching model where all starting features got a branch and where merged into the main branch, some branches who needed unfinished code to be completed where taken from the game branch but merged into the main at the end as well.
Since there was just one end product we abstained from using a development branch and merges where done straight into main. + +## Class Diagramm From fa4842e440a2f5d79a0e1d1ad619b01fd6083f15 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Thu, 24 Mar 2022 13:32:12 +0100 Subject: [PATCH 27/36] refactoring of Method calculatePath from Game.java to Track.java --- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 59 +------------------ .../java/ch/zhaw/pm2/racetrack/Track.java | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+), 56 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index d10ec86..265cd15 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -271,64 +271,11 @@ public class Game implements GameSpecification { */ @Override public List calculatePath(PositionVector startPosition, PositionVector endPosition) { - ArrayList pathList = new ArrayList<>(); - // Use Bresenham's algorithm to determine positions. - int x = startPosition.getX(); - int y = startPosition.getY(); - - // Relative Distance (x & y axis) between end- and starting position - int diffX = endPosition.getX() - startPosition.getX(); - int diffY = endPosition.getY() - startPosition.getY(); - - // Absolute distance (x & y axis) between end- and starting position - int distX = Math.abs(diffX); - int distY = Math.abs(diffY); - - // Direction of vector on x & y axis (-1: to left/down, 0: none, +1 : to right/up) - int dirX = Integer.signum(diffX); - int dirY = Integer.signum(diffY); - - // Determine which axis is the fast direction and set parallel/diagonal step values - int parallelStepX, parallelStepY; - int diagonalStepX, diagonalStepY; - int distanceSlowAxis, distanceFastAxis; - if (distX > distY) { - // x axis is the 'fast' direction - parallelStepX = dirX; - parallelStepY = 0; // parallel step only moves in x direction - diagonalStepX = dirX; - diagonalStepY = dirY; // diagonal step moves in both directions - distanceSlowAxis = distY; - distanceFastAxis = distX; - } else { - // y axis is the 'fast' direction - parallelStepX = 0; - parallelStepY = dirY; // parallel step only moves in y direction - diagonalStepX = dirX; - diagonalStepY = dirY; // diagonal step moves in both directions - distanceSlowAxis = distX; - distanceFastAxis = distY; - } - - int error = distanceFastAxis / 2; - for (int step = 0; step < distanceFastAxis; step++) { - error -= distanceSlowAxis; - if (error < 0) { - error += distanceFastAxis; // correct error value to be positive again - // step into slow direction; diagonal step - x += diagonalStepX; - y += diagonalStepY; - } else { - // step into fast direction; parallel step - x += parallelStepX; - y += parallelStepY; - } - - pathList.add(new PositionVector(x, y)); - } - return pathList; + return track.calculatePointsOnPath(startPosition, endPosition); } + + private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { List path = calculatePath(start, finish); for (PositionVector point : path) { diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index c83839e..e0a6ff4 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -355,6 +355,65 @@ public class Track implements TrackSpecification { return currentSpace.getValue(); } + public ArrayList calculatePointsOnPath(PositionVector startPosition, PositionVector endPosition) { + ArrayList pathList = new ArrayList<>(); + // Use Bresenham's algorithm to determine positions. + int x = startPosition.getX(); + int y = startPosition.getY(); + + // Relative Distance (x & y axis) between end- and starting position + int diffX = endPosition.getX() - startPosition.getX(); + int diffY = endPosition.getY() - startPosition.getY(); + + // Absolute distance (x & y axis) between end- and starting position + int distX = Math.abs(diffX); + int distY = Math.abs(diffY); + + // Direction of vector on x & y axis (-1: to left/down, 0: none, +1 : to right/up) + int dirX = Integer.signum(diffX); + int dirY = Integer.signum(diffY); + + // Determine which axis is the fast direction and set parallel/diagonal step values + int parallelStepX, parallelStepY; + int diagonalStepX, diagonalStepY; + int distanceSlowAxis, distanceFastAxis; + if (distX > distY) { + // x axis is the 'fast' direction + parallelStepX = dirX; + parallelStepY = 0; // parallel step only moves in x direction + diagonalStepX = dirX; + diagonalStepY = dirY; // diagonal step moves in both directions + distanceSlowAxis = distY; + distanceFastAxis = distX; + } else { + // y axis is the 'fast' direction + parallelStepX = 0; + parallelStepY = dirY; // parallel step only moves in y direction + diagonalStepX = dirX; + diagonalStepY = dirY; // diagonal step moves in both directions + distanceSlowAxis = distX; + distanceFastAxis = distY; + } + + int error = distanceFastAxis / 2; + for (int step = 0; step < distanceFastAxis; step++) { + error -= distanceSlowAxis; + if (error < 0) { + error += distanceFastAxis; // correct error value to be positive again + // step into slow direction; diagonal step + x += diagonalStepX; + y += diagonalStepY; + } else { + // step into fast direction; parallel step + x += parallelStepX; + y += parallelStepY; + } + + pathList.add(new PositionVector(x, y)); + } + return pathList; + } + /** * Return a String representation of the track, including the car locations. * From 4b5802a0d085a0b52aab390d8c6f0d362edb03e4 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Thu, 24 Mar 2022 13:59:46 +0100 Subject: [PATCH 28/36] added PathFinderMoveStrategy in Game. --- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 14 ++- .../strategy/PathFinderMoveStrategy.java | 40 ++++++ .../strategy/PathFinderStrategy.java | 116 ------------------ 3 files changed, 49 insertions(+), 121 deletions(-) create mode 100644 src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java delete mode 100644 src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 265cd15..e5f0ed1 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -42,6 +42,7 @@ public class Game implements GameSpecification { moveStrategies.add("User Move Strategy"); moveStrategies.add("Move List Strategy"); moveStrategies.add("Path Follow Move Strategy"); + moveStrategies.add("Path Finder Move Strategy"); for (int i = 0; i < track.getCarCount(); i++) { Car car = track.getCar(i); MoveStrategy moveStrategy = null; @@ -49,14 +50,14 @@ public class Game implements GameSpecification { String filePath; int moveStrategie = userInterface.selectOption( "Select Strategy for Car " + i + " (" + track.getCarId(i) + ")", moveStrategies); - switch (moveStrategie + 1) { - case 1: + switch (moveStrategie) { + case 0: moveStrategy = new DoNotMoveStrategy(); break; - case 2: + case 1: moveStrategy = new UserMoveStrategy(userInterface, i, track.getCarId(i)); break; - case 3: + case 2: filePath = ".\\moves\\" + selectedTrack.getName().split("\\.")[0] + "-car-" + track.getCar(i).getID() + ".txt"; try { moveStrategy = new MoveListStrategy(filePath); @@ -65,7 +66,7 @@ public class Game implements GameSpecification { } //TODO: Backslash kompatibel für Linux break; - case 4: + case 3: filePath = ".\\follower\\" + selectedTrack.getName().split("\\.")[0] + "_points.txt"; try { moveStrategy = new PathFollowerMoveStrategy(filePath, track.getCarPos(i)); @@ -73,6 +74,9 @@ public class Game implements GameSpecification { userInterface.printInformation("There is no Point-List implemented. Choose another Strategy!"); } break; + case 4: + moveStrategy = new PathFinderMoveStrategy(track, i); + break; } } selectMoveStrategy(car, moveStrategy); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java new file mode 100644 index 0000000..04e79d8 --- /dev/null +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java @@ -0,0 +1,40 @@ +package ch.zhaw.pm2.racetrack.strategy; + +import ch.zhaw.pm2.racetrack.PositionVector; +import ch.zhaw.pm2.racetrack.Track; + +import java.util.ArrayList; +import java.util.List; + +public class PathFinderMoveStrategy implements MoveStrategy{ + private Track track; + private int carIndex; + private List moveList; + private int pointer; + + + public PathFinderMoveStrategy(Track track, int carIndex) { + this.track = track; + this.carIndex = carIndex; + createMoveList(); + pointer = -1; + } + + private void createMoveList(){ + moveList = new ArrayList<>(); + } + + + + @Override + public PositionVector.Direction nextMove() { + pointer += 1; + //TODO: Check if crash. if yes --> createMoveList(); + if (pointer < moveList.size()) { + return moveList.get(pointer); + } + return null; + } + + +} diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java deleted file mode 100644 index 8f08461..0000000 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderStrategy.java +++ /dev/null @@ -1,116 +0,0 @@ -package ch.zhaw.pm2.racetrack.strategy; - -import ch.zhaw.pm2.racetrack.Game; -import ch.zhaw.pm2.racetrack.InvalidTrackFormatException; -import ch.zhaw.pm2.racetrack.PositionVector; -import ch.zhaw.pm2.racetrack.Track; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -public class PathFinderStrategy implements MoveStrategy{ - private ArrayList possiblePaths; - private Game game; - private boolean foundPath = false; - private List directions = Arrays.asList(PositionVector.Direction.values()); - private ArrayList directionToTake = new ArrayList<>(); - private int currentMove = 0; - - public PathFinderStrategy(Game game, int carIndex) { - this.game = game; - possiblePaths = new ArrayList<>(); - calculatePaths(); - try { - getDirections(); - } catch (InvalidTrackFormatException e) { - e.printStackTrace(); - } - } - - private void calculatePaths() { - for (int i = 0; i < 50; i++) { - if(foundPath){ - break; - } - - ArrayList temporary = new ArrayList<>(); - Iterator it = possiblePaths.iterator(); - - while (it.hasNext()) { - tryOutPaths current = it.next(); - if (!current.isFeasible()) { - it.remove(); - } else { - for (PositionVector.Direction direction : directions) { - temporary.add(current); - if (temporary.get(temporary.size() - 1).takeDirection(direction)) { - foundPath = true; - } - } - } - } - possiblePaths.clear(); - possiblePaths.addAll(temporary); - } - } - - private void getDirections() throws InvalidTrackFormatException { - if(foundPath){ - for (tryOutPaths path: possiblePaths) { - if (path.isFinished()){ - directionToTake = path.getDirectionsTaken(); - } - } - } else { - throw new InvalidTrackFormatException(); - } - } - - @Override - public PositionVector.Direction nextMove() { - PositionVector.Direction direction = directionToTake.get(currentMove); - currentMove++; - return direction; - } - - public class tryOutPaths { - ArrayList directionsTaken = new ArrayList<>(); - PositionVector currentPosition; - Track track; - - private boolean feasible; - private boolean finished; - public tryOutPaths(Track track){ - this.track = track; - } - - public boolean isFeasible(){ - return feasible; - } - - public boolean takeDirection(PositionVector.Direction direction) { - if(directionsTaken.size() >= 50){ - feasible = false; - return false; - } - else if(finished){ - return true; - } - else { - //check if possible eventuell hier?? - directionsTaken.add(direction); - return false; - } - } - - public ArrayList getDirectionsTaken(){ - return directionsTaken; - } - - public boolean isFinished(){ - return finished; - } - } -} From 015dbac96c05db2c99b00e1dcc2433d84453d160 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 24 Mar 2022 14:36:48 +0100 Subject: [PATCH 29/36] added elements to README.md --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e3e5c8a..78d2a30 100644 --- a/README.md +++ b/README.md @@ -20,20 +20,25 @@ You will then be prompted to select a track file from the selection by entering > > 1=down-left
2=down
3=down-right
4=left
5=no acceleration
6=right
7=up-left
8=up
9=up-right
it is also possible to leave the game when it is your turn by entering 10 + Move List Strategy > For this strategy a predefined list of moves have to be given, the list may contain all allowed moves like mentioned in User Move Strategy +> > To create your own Move List strategy it needs to be located in /racetrack/moves and be named as *track_name*-car-*character_of_car*.txt and be a txt file. + Path Follow Move Strategy -> A list of point has to be given to the follow move strategy, the strategy will then calculate the route to cross each point in the given order. +> A list of points given in a txt file where on each lime a coordinate is placed like (X:24, Y:22) gets used to calculate a path which makes the car cross each point. +> > To create your own follow move strategy it needs to be located in /racetrack/moves and be named as *track_name*_points.txt and be a txt file. + Path Finder Strategy > The pathfinder Strategy Calculates a route itself and follows it direction fully automatically. The shown Track can be interpreted as following:
+'spaces' are part of the raceable track.
'#' is a Wall
'>,<,^,v' are finish line components
+'X' is shown if a car crashes at its crash location.
And every other character represents a car. - +> To create your own track it needs to be located inside /racetrack/tracks and be a txt file. ### Determining a winner The winner gets determined automatically.
The car that first passes the finish line (doing a complete round) is given the win, if all car except one crash the surviving car will be crowned as the winner.
The game will inform you of this, and you will have the option to quit the game or play another match. ## Branching Model -We choose a simple branching model where all starting features got a branch and where merged into the main branch, some branches who needed unfinished code to be completed where taken from the game branch but merged into the main at the end as well.
Since there was just one end product we abstained from using a development branch and merges where done straight into main. +We choose a simple branching model where all starting features got a branch and where merged into the main branch, some branches who needed unfinished code to be completed where taken from the game branch but merged into the main at the end as well.
Since there was just one end product we abstained from using a development branch and merges where done straight into main branch. ## Class Diagramm +![Classdiagramm of this program](/Klassendiagramm.drawio.svg) From bc0dd5236079d380d50c747b884cc555ab25728c Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 24 Mar 2022 14:38:08 +0100 Subject: [PATCH 30/36] added elements to README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 78d2a30..340f147 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,4 @@ The winner gets determined automatically.
The car that first passes the fin We choose a simple branching model where all starting features got a branch and where merged into the main branch, some branches who needed unfinished code to be completed where taken from the game branch but merged into the main at the end as well.
Since there was just one end product we abstained from using a development branch and merges where done straight into main branch. ## Class Diagramm -![Classdiagramm of this program](/Klassendiagramm.drawio.svg) +![Classdiagramm of this program](/Klassendiagramm.drawio) From 31ec1e9e645b1cc95f6021f2beffeb7dafd34ed8 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 24 Mar 2022 16:30:59 +0100 Subject: [PATCH 31/36] refactoring done in several classes --- src/main/java/ch/zhaw/pm2/racetrack/Car.java | 30 ++--- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 1 - src/main/java/ch/zhaw/pm2/racetrack/Main.java | 11 +- .../ch/zhaw/pm2/racetrack/PositionVector.java | 4 +- .../java/ch/zhaw/pm2/racetrack/Track.java | 105 ++++++++++++------ .../ch/zhaw/pm2/racetrack/UserInterface.java | 42 ++++--- .../racetrack/strategy/MoveListStrategy.java | 5 +- .../strategy/PathFollowerMoveStrategy.java | 5 +- .../racetrack/strategy/UserMoveStrategy.java | 6 +- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 2 +- .../java/ch/zhaw/pm2/racetrack/GameTest.java | 6 +- 11 files changed, 129 insertions(+), 88 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Car.java b/src/main/java/ch/zhaw/pm2/racetrack/Car.java index 8e9255e..da73693 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Car.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Car.java @@ -3,14 +3,12 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.CarSpecification; import ch.zhaw.pm2.racetrack.strategy.MoveStrategy; -import java.util.Vector; - /** * Class representing a car on the racetrack. * Uses {@link PositionVector} to store current position on the track grid and current velocity vector. - * Each car has an identifier character which represents the car on the race track board. + * Each car has an identifier character which represents the car on the racetrack board. * Also keeps the state, if the car is crashed (not active anymore). The state can not be changed back to uncrashed. - * The velocity is changed by providing an acelleration vector. + * The velocity is changed by providing an acceleration vector. * The car is able to calculate the endpoint of its next position and on request moves to it. */ public class Car implements CarSpecification { @@ -46,7 +44,8 @@ public class Car implements CarSpecification { /** * Constructor for class Car - * @param id unique Car identification + * + * @param id unique Car identification * @param position initial position of the Car */ public Car(char id, PositionVector position) { @@ -59,16 +58,16 @@ public class Car implements CarSpecification { * * @return id of the car. */ - public char getID(){ + public char getID() { return id; } public void increaseWinPoints() { - winPoints ++; + winPoints++; } public void deductWinPoints() { - winPoints --; + winPoints--; } public int getWinPoints() { @@ -80,9 +79,10 @@ public class Car implements CarSpecification { * * @return velocity current velocity of the car. */ - public PositionVector getVelocity(){ + public PositionVector getVelocity() { return velocity; } + /** * Set this Car position directly, regardless of current position and velocity. * This should only be used by the game controller in rare cases to set the crash or winning position. @@ -95,8 +95,7 @@ public class Car implements CarSpecification { public void setPosition(final PositionVector position) { if (position.getX() < 0 || position.getY() < 0) { throw new IllegalArgumentException(); - } - else { + } else { this.position = position; } } @@ -109,7 +108,7 @@ public class Car implements CarSpecification { */ @Override public PositionVector nextPosition() { - return new PositionVector(position.getX() + velocity.getX(),position.getY() + velocity.getY()); + return new PositionVector(position.getX() + velocity.getX(), position.getY() + velocity.getY()); } /** @@ -123,11 +122,10 @@ public class Car implements CarSpecification { */ @Override public void accelerate(PositionVector.Direction acceleration) { - if(acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1|| + if (acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1 || acceleration.vector.getY() < -1 || acceleration.vector.getY() > 1) { throw new IllegalArgumentException(); - } - else { + } else { velocity = new PositionVector(velocity.getX() + acceleration.vector.getX(), velocity.getY() + acceleration.vector.getY()); } @@ -161,6 +159,7 @@ public class Car implements CarSpecification { /** * Set move strategy + * * @param moveStrategy Strategy to be implemented */ public void setMoveStrategy(MoveStrategy moveStrategy) { @@ -169,6 +168,7 @@ public class Car implements CarSpecification { /** * Get current move strategy + * * @return MoveStrategy */ public MoveStrategy getMoveStrategy() { diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 265cd15..1486983 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -275,7 +275,6 @@ public class Game implements GameSpecification { } - private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { List path = calculatePath(start, finish); for (PositionVector point : path) { diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Main.java b/src/main/java/ch/zhaw/pm2/racetrack/Main.java index aec65bd..83bf6d8 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Main.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Main.java @@ -1,6 +1,5 @@ package ch.zhaw.pm2.racetrack; -import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -17,19 +16,17 @@ public class Main { optionsNewGame.add("exit"); optionsNewGame.add("new game"); String winnerText; - if(winner == null){ + if (winner == null) { winnerText = "There was no winner."; - } - else { + } else { winnerText = "The Winner was Car " + winner; } int selectedOption = userInterface.selectOption(winnerText + "\nStart new Game?", optionsNewGame); - if(selectedOption == 0) { + if (selectedOption == 0) { userInterface.quit("Thank you and goodbye\npress enter to close the application."); break; } - } - else { + } else { userInterface.quit("The initialisation of the game failed. Press enter to close the application."); break; } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java index 10209a3..4f3eafe 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java @@ -7,8 +7,8 @@ package ch.zhaw.pm2.racetrack; * Created by mach 21.01.2020 */ public final class PositionVector { - private int x; // horizontal component (position / velocity) - private int y; // vertical component (position / velocity) + private final int x; // horizontal component (position / velocity) + private final int y; // vertical component (position / velocity) /** * Enum representing a direction on the track grid. diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index e0a6ff4..79f5e70 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -3,7 +3,10 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.ConfigSpecification; import ch.zhaw.pm2.racetrack.given.TrackSpecification; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -57,8 +60,8 @@ import java.util.Scanner; public class Track implements TrackSpecification { public static final char CRASH_INDICATOR = 'X'; - private List track; - private List cars; + private final List track; + private final List cars; private final List finishLine; private ConfigSpecification.SpaceType finishTyp; @@ -85,13 +88,17 @@ public class Track implements TrackSpecification { * @throws FileNotFoundException if the FilePath is invalid. */ private void readFile(File trackFile) throws FileNotFoundException { - Scanner scanner = new Scanner(new FileInputStream(trackFile),"UTF-8"); + Scanner scanner = new Scanner(new FileInputStream(trackFile), StandardCharsets.UTF_8); while (scanner.hasNextLine()) { track.add(scanner.nextLine()); } } - + /** + * Goes through the track ArrayList and determines the locations of each cars and initializes them at the location. + * + * @throws InvalidTrackFormatException is thrown if a car is found more than once inside the track. + */ private void addCars() throws InvalidTrackFormatException { ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); List allSpaceTypesAsChar = new ArrayList<>(); @@ -101,23 +108,26 @@ public class Track implements TrackSpecification { allSpaceTypesAsChar.add(spaceType.getValue()); } - - for (int j = 0; j < track.size(); j++) { - String line = track.get(j); - for (int i = 0; i < line.length(); i++) { - char possibleCarChar = line.charAt(i); + for (int yPosition = 0; yPosition < track.size(); yPosition++) { + String line = track.get(yPosition); + for (int xPosition = 0; xPosition < line.length(); xPosition++) { + char possibleCarChar = line.charAt(xPosition); if (!allSpaceTypesAsChar.contains(possibleCarChar)) { if (usedSymbolForCar.contains(possibleCarChar)) { throw new InvalidTrackFormatException(); } usedSymbolForCar.add(possibleCarChar); - cars.add(new Car(possibleCarChar, new PositionVector(i, j))); + cars.add(new Car(possibleCarChar, new PositionVector(xPosition, yPosition))); } } } } - + //TODO: THIS + /** + * + * @throws InvalidTrackFormatException + */ private void findFinish() throws InvalidTrackFormatException { for (int i = 0; i < track.size(); i++) { String line = track.get(i); @@ -141,6 +151,12 @@ public class Track implements TrackSpecification { } } + /** + * Method to find the PositionVector of a chosen character + * + * @param symbol char that we are looking for on the track + * @return the PositionVector of the desired char + */ private PositionVector findChar(char symbol) { PositionVector vector = null; for (int i = 0; i < track.size(); i++) { @@ -154,37 +170,47 @@ public class Track implements TrackSpecification { return vector; } + /** + * Method that places a character at a chosen position + * + * @param positionVector position where char will be placed + * @param symbol char that should be placed at desired position + */ private void drawCharOnTrackIndicator(PositionVector positionVector, char symbol) { String line = track.get(positionVector.getY()); line = line.substring(0, positionVector.getX()) + symbol + line.substring(positionVector.getX() + 1); track.remove(positionVector.getY()); track.add(positionVector.getY(), line); } - + //TODO: check if this method is okay and needed + /** + * Determines if a location is valid PositionVector inside the track + * + * @param positionVector of location that has to be checked + * @throws PositionVectorNotValid if the PositionVector does not lie on the track. + */ private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValid { - try{ + try { track.get(positionVector.getY()).charAt(positionVector.getX()); - }catch (IndexOutOfBoundsException e) { + } catch (IndexOutOfBoundsException e) { throw new PositionVectorNotValid(); } } - /** - * @return all Cars - */ - public List getCars() { - return cars; - } /** - * @return finishLine + * Method that returns the finishline as a List + * + * @return finishLine List */ public List getFinishLine() { return finishLine; } /** - * @return the track + * Returns the whole Track as List of Strings + * + * @return track as List of Strings */ public List getTrack() { return track; @@ -203,7 +229,7 @@ public class Track implements TrackSpecification { } /** - * This class does change the Position of the car only in the track. + * This Method does change the Position of the car inside the track object. * * @param carIndex of the current car */ @@ -213,8 +239,8 @@ public class Track implements TrackSpecification { drawCharOnTrackIndicator(carPositionVector, ConfigSpecification.SpaceType.TRACK.getValue()); //Redraw finishline if Car was on finish-line Position - for(PositionVector finishLinePositionVector : finishLine){ - if(finishLinePositionVector.equals(carPositionVector)){ + for (PositionVector finishLinePositionVector : finishLine) { + if (finishLinePositionVector.equals(carPositionVector)) { drawCharOnTrackIndicator(carPositionVector, finishTyp.getValue()); } } @@ -225,10 +251,10 @@ public class Track implements TrackSpecification { } /** - * This Method will check if the Car could crash at the specific position + * This Method will check if the Car would crash at the specific position * - * @param positionVector the position to check if the car could crash - * @return true if car would crash. Else false. + * @param positionVector the position to check if the car would crash + * @return true if crash otherwise false */ public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValid { isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method? @@ -242,12 +268,12 @@ public class Track implements TrackSpecification { } /** - * This Method will make the Car Crash. In Track and in the Car Object + * This Method will mark the Car as crashed inside the track and the car Object. * - * @param carIndex representing current Car - * @param crashPositionVector where the Crash did happen + * @param carIndex of car that will be marked as crashed + * @param crashPositionVector of the location of the crash */ - public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValid{ + public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValid { isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method? PositionVector currentCarPosition = getCarPos(carIndex); drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue()); @@ -262,7 +288,7 @@ public class Track implements TrackSpecification { * If the location is outside the track bounds, it is considered a wall. * * @param position The coordinates of the position to examine - * @return The type of track position at the given location + * @return The type of space at the desired position */ @Override public Config.SpaceType getSpaceType(PositionVector position) { @@ -279,9 +305,9 @@ public class Track implements TrackSpecification { } /** - * Return the number of cars. + * Return the number of cars that are located in a track * - * @return Number of cars + * @return number of cars as int */ @Override public int getCarCount() { @@ -355,6 +381,13 @@ public class Track implements TrackSpecification { return currentSpace.getValue(); } + /** + * Determines all points that lie between the two position vectors including the endpoint VectorPosition using the Bresenham algorithm. + * + * @param startPosition PositionVector of the finish coordinate + * @param endPosition PositionVector of the start coordinate + * @return ArrayList containing PositionVectors of all position that are between the start and finish including the finish position. + */ public ArrayList calculatePointsOnPath(PositionVector startPosition, PositionVector endPosition) { ArrayList pathList = new ArrayList<>(); // Use Bresenham's algorithm to determine positions. diff --git a/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java index 96a8c04..b6c9e02 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java @@ -6,13 +6,20 @@ import org.beryx.textio.TextTerminal; import java.util.List; +/** + * Class representing the Userinterface. + * Used to get inputs from users via textio. + * + * @author Roman Schenk + */ public class UserInterface { private final TextIO textIO; private final TextTerminal textTerminal; /** - * Opens a new Terminal Window and prints the welcome Text + * Opens a new Terminal Window and prints the welcome Text. + * * @param welcomeText The Text which will be printed after the windows is opened. */ public UserInterface(String welcomeText) { @@ -24,6 +31,7 @@ public class UserInterface { /** * Prints the given Text in textTerminal + * * @param text The Text which should be printed. */ public void printInformation(String text) { @@ -31,23 +39,25 @@ public class UserInterface { } /** - * asks the user to choose one of the options given. - * @param text Text which is printed befor the options are printed. Example: "Select Track file:" + * Method which asks the user to choose one of the options given. + * + * @param text Text which is printed before the options are printed. Example: "Select Track file:" * @param options List with the options which can be selected. * @return the list index of the selected option */ public int selectOption(String text, List options) { textTerminal.println(text + ":"); - for(int option = 0; option < options.size(); option ++) { - textTerminal.println(" " + (option + 1) + ": " + options.get(option)); + for (int option = 0; option < options.size(); option++) { + textTerminal.println(" " + (option + 1) + ": " + options.get(option)); } return textIO.newIntInputReader().withMinVal(1).withMaxVal(options.size()).read("Enter your choice: ") - 1; } /** - * gives information which player's turn it is and asks for the direction to accelerate + * Gives information which player is at turn and asks for the direction to accelerate or quit the game. + * * @param playingCarIndex the index of the player - * @param playingCarID the ID of the player + * @param playingCarID the ID of the player * @return the direction which is selected by the player. If null -> quit game */ public PositionVector.Direction selectDirection(int playingCarIndex, char playingCarID) { @@ -70,7 +80,8 @@ public class UserInterface { } /** - * returns the the associated direction Object + * Method which returns the associated direction Object. + * * @param number the number which was typed by the user * @return the associated direction. If null -> unknown number */ @@ -90,22 +101,21 @@ public class UserInterface { } /** - * prints the given Track in the terminal + * Method to print the given Track in the terminal + * * @param track the track which should be printed */ public void printTrack(Track track) { - textTerminal.println(track.toString()); + textTerminal.println(track.toString()); } /** - * Method to dispose the Textterminal - * @param text OUtput Text + * Method to dispose of the Textterminal + * + * @param text Output Text */ - public void quit(String text){ + public void quit(String text) { textIO.newStringInputReader().withMinLength(0).read(text); textTerminal.dispose(); } - - - } 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 3de3f23..4966184 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java @@ -5,13 +5,14 @@ import ch.zhaw.pm2.racetrack.PositionVector.Direction; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class MoveListStrategy implements MoveStrategy { - private List moveList; + private final List moveList; private int pointer; public MoveListStrategy(String path) throws FileNotFoundException{ @@ -21,7 +22,7 @@ public class MoveListStrategy implements MoveStrategy { } private void readFile(File trackFile) throws FileNotFoundException { - Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); + Scanner scanner = new Scanner(new FileInputStream(trackFile), StandardCharsets.UTF_8); Direction[] directions = Direction.values(); while (scanner.hasNextLine()) { String line = scanner.nextLine(); 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 807ddc8..f1ab6a8 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java @@ -6,6 +6,7 @@ import ch.zhaw.pm2.racetrack.PositionVector.Direction; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Scanner; @@ -25,7 +26,7 @@ public class PathFollowerMoveStrategy implements MoveStrategy { /** * List of all points on the path. */ - private ArrayList pointList; + private final ArrayList pointList; /** * The index of the next point on the path. */ @@ -51,7 +52,7 @@ public class PathFollowerMoveStrategy implements MoveStrategy { * @throws FileNotFoundException If the file with the given path does not exist. */ public void readFile(File trackFile) throws FileNotFoundException { - Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); + Scanner scanner = new Scanner(new FileInputStream(trackFile), StandardCharsets.UTF_8); while (scanner.hasNextLine()) { String line = scanner.nextLine(); String[] coordinates = line.split("(\\(X:|, Y:|\\))"); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java index 06589ff..d0755aa 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java @@ -7,9 +7,9 @@ import ch.zhaw.pm2.racetrack.UserInterface; * Let the user decide the next move. */ public class UserMoveStrategy implements MoveStrategy { - private UserInterface userInterface; - private int carIndex; - private char carID; + private final UserInterface userInterface; + private final int carIndex; + private final char carID; public UserMoveStrategy(UserInterface userInterface, int carIndex, char carID) { this.userInterface = userInterface; diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index ebac56c..6a94e09 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -101,7 +101,7 @@ class CarTest { @Test void movement() { // add all possible directions in a List - List directions = Arrays.asList(PositionVector.Direction.values()); + PositionVector.Direction[] directions = PositionVector.Direction.values(); //position shouldn't be changed because velocity should be 0. car.move(); diff --git a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java index 0c1dea3..908375c 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java @@ -20,9 +20,9 @@ class GameTest { private Game game; private Track track; - private String TRACK_FILE_PATH = ".\\tracks\\challenge.txt"; - private int CAR_INDEX_ONE = 0; - private int CAR_INDEX_TWO = 1; + private final String TRACK_FILE_PATH = ".\\tracks\\challenge.txt"; + private final int CAR_INDEX_ONE = 0; + private final int CAR_INDEX_TWO = 1; /** * This nested Class tests if the game gets initiatet correctly From a143a9c7d764646a7ccf1f7994cc1217cda904c2 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Thu, 24 Mar 2022 16:50:18 +0100 Subject: [PATCH 32/36] refactoring several classes --- Klassendiagramm.drawio | 2 +- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 120 ++++++++++-------- .../racetrack/InvalidFileFormatException.java | 1 + src/main/java/ch/zhaw/pm2/racetrack/Main.java | 3 +- .../pm2/racetrack/PositionVectorNotValid.java | 9 -- .../PositionVectorNotValidException.java | 9 ++ .../java/ch/zhaw/pm2/racetrack/Track.java | 14 +- .../racetrack/given/GameSpecification.java | 6 +- .../java/ch/zhaw/pm2/racetrack/GameTest.java | 39 +++--- .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 23 ++-- 10 files changed, 123 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java create mode 100644 src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java diff --git a/Klassendiagramm.drawio b/Klassendiagramm.drawio index afde28c..99e08e5 100644 --- a/Klassendiagramm.drawio +++ b/Klassendiagramm.drawio @@ -1 +1 @@ -7Vtbd6I6GP01PraLi7c+qr3MzOn0OGNPe16jRMgxEE+Itc6vny8QQExVaGVorWt1rZKPkED2zpedDTbsgf98w9Hc+84cTBuW4Tw37MuGZZnwB/9kZBVHOu1mHHA5cVSlLDAiv7AKGiq6IA4OcxUFY1SQeT44YUGAJyIXQ5yzZb7alNF8r3PkYi0wmiCqRx+JI7w42rU6WfwLJq6X9Gy2L+IzPkoqqycJPeSw5VrIvmrYA86YiI/85wGmcvCScXn8unqkt7P2zbcf4f/on/5f93cPZ3Fj12UuSR+B40C8uulfs+n1l4fmf//Oh9c/lsZNb/ztTF1iPCG6UOM1xDxkgXpisUqGMVwSn6IASv0pC8RInYFB6CNK3ACOJ3B3mEPgCXNBAIGeOiHYHKITj1DnFq3YQj5DKNBklpT6HuPkFzSLKJwyIQCnuVBkstq5GiN5JYQNiHIcQp1hMjBmGrpFoVB1JoxSNA/JOLphWcVH3CVBnwnB/KQhtggc7KhSinRUEJzNUu7I6wvCoWCTo4Gf18io4LnBzMeCr6CKOttVaKiZ1lLFZUZbs61i3jpl7a6aLmqquGnLaWc/YWqhwIUhSHuz7Hx3ZrNgf4BHrjtEAfYACdyXgxiukxAO1h40C0XULEFTU6PpHfKxRlIYZ7FGSIqnYisdwzmakMC9jepcNrPIT/WkMsTg2imNqOARx8FBRBWBBIrZJPkxZyQQ0VC0+vAHAzYwzluNFtzQAMpmVoY/WZ2LAQuAVYhE9MFA1SWWdH2BWDsn7X5irfKIlUV2nUg5SMviZ+lpxmOBJOPdwh9D0jg2JHfkE0/4VB1WhXfLqhlvW8P7ykdEXtZzHMjQ4QnwgwLe6dYMeFMDXEOYkkg9qNEwX1xZ98DvA5CyuQTve0mHyzNT44Stc8J+AX+KxpgOWUgEYbJ9Htfd4EVdWds0msVQ3bH8vwnUlp61F3zioVAmbhBdMxje6OgI53NloJp15+a2hupILBz5mAU1v3HS/JVpfrtbreg37Vf2V4Po72wn6rHKxoJZp12YZe9lA9DVsOzB3UvrxjK+w0pydEgeVA+Wxrv2DcDFSQ8eHNSiIr8qOWjqZuFXSPzGFaARrbSWcc9kOeBMtnZkM3pdAjWrwrhbd6I2davtBssVd4R9EiAuAb9HM6w7xB8d36ogrV/xJzewKxvjwOnJty1QGlMmxXYfQkqNm0ZcvCY0Wbn2yOX88ocdFydTB9MxW15lgX4UgBMJU0qL7ZDBrhTvhwy2Fy4usJmTd7sT2JeA5JgiQZ7yL512aPOhJG6myy0jr8stw843ET+kumr9LU/ZhuJR0Bo6mFOvW39DzqY4DJku108bzOo3mLb5yh1fx9hL4hc2mHazQHed97HBNHXXcoQoUhn3E65t6eT9OBtLUzcpNfQ++06jPKxF94+VbTV0k/JTKZYEsXctWTYXls4rJcvmCmV1Nu6lasmiG43b3lKeBEv1gqW1oSAKf5Zi7lhjtguWVivf3bv+DEa3UUeCY6y/uvksgqVTmF3vRrDo1uiAiOOTnAc1wMvjXLsDnnw1mpurkB1OQB8W6No/fbF0xxSEvVzELWPAnBPgBwa88Gcx1SGu+6kDGBNxhMZB3VjbrxRjh8Na9zM1kD+9v1Ae11ZBGVaVwWDp1t8DQOQc4wJdHYrt2jOx7v79vRDzhXQXevJV5a2cBydECyN6UXu+Lef8sXk01uW8vdQWNOt3+tTY7jX6Eiz3On0KZ0mlnIuibuiNpp+98b2ieWHlmyhq+m26PFpDW0w/raGzzRdOG+2w6TTElfiGlu4bGufnCfAZXSMvbi0R7Ek7Y+XIxWt4H01mbsTfAaOMw/mAZf6jMrut4jkhmV/q55bqthrpjxyL+3Rnb2RUQsw/BpdunhXHKtFPHxWsw8z+5JPcPw6d7plReAq5wKOt3ueaHN9EVVfBRQz8VKPvxrqUif5GYmgE2MaV4uvExWGYknyevmHiv4UrUMx+bB1Xz36ybl/9Bg== \ No newline at end of file +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 \ No newline at end of file diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 265cd15..11e03d1 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -26,8 +26,11 @@ public class Game implements GameSpecification { this.userInterface = userInterface; } - - public boolean initPhase() throws InvalidTrackFormatException { + /** + * This method will initialize the game. Therefore it interacts with the user via UserInterface + * @return true if the initialization is completed. Returns false if there is an error. + */ + public boolean initPhase() { File folder = new File("tracks"); File[] listOfFiles = folder.listFiles(); if (listOfFiles.length > 0) { @@ -35,8 +38,17 @@ public class Game implements GameSpecification { for (File file : listOfFiles) { tracks.add(file.getName()); } + File selectedTrack = listOfFiles[userInterface.selectOption("Select Track file", tracks)]; - selectTrack(selectedTrack); + try { + selectTrack(selectedTrack); + } catch (FileNotFoundException e) { + userInterface.printInformation("There is an unexpected Error with the trackfile Path. Add trackfiles only to tracks path. Exit the Game and Fix the Problem"); + return false; + } catch (InvalidTrackFormatException e) { + userInterface.printInformation("There is an unexpected Error with the trackfile. Format does not match specifications! Exit the Game and Fix the Problem"); + return false; + } List moveStrategies = new ArrayList<>(); moveStrategies.add("Do not move Strategy"); moveStrategies.add("User Move Strategy"); @@ -63,7 +75,6 @@ public class Game implements GameSpecification { } catch (FileNotFoundException e) { userInterface.printInformation("There is no Move-List implemented. Choose another Strategy!"); } - //TODO: Backslash kompatibel für Linux break; case 4: filePath = ".\\follower\\" + selectedTrack.getName().split("\\.")[0] + "_points.txt"; @@ -86,17 +97,11 @@ public class Game implements GameSpecification { /** * The functionality was taken out of init to automate testing - * * @param selectedTrack */ - Track selectTrack(File selectedTrack) { - try { - track = new Track(selectedTrack); - return track; - } catch (FileNotFoundException | PositionVectorNotValid | InvalidTrackFormatException e) { - e.printStackTrace(); - } - return null; + Track selectTrack(File selectedTrack) throws InvalidTrackFormatException,FileNotFoundException { + track = new Track(selectedTrack); + return track; } /** @@ -198,9 +203,8 @@ public class Game implements GameSpecification { * for this turn */ @Override - public void doCarTurn(Direction acceleration) throws PositionVectorNotValid { + public void doCarTurn(Direction acceleration) throws PositionVectorNotValidException { track.getCar(currentCarIndex).accelerate(acceleration); - PositionVector crashPosition = null; List positionList = calculatePath(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition()); for (int i = 0; i < positionList.size(); i++) { @@ -221,7 +225,12 @@ public class Game implements GameSpecification { } } - public String gamePhase() throws PositionVectorNotValid { + /** + * This method implements the gameflow in a while loop. If there is a winner. The method will return its carid. + * + * @return the ID of the winning car return null if there is no winner. + */ + public String gamePhase() { while (carsMoving() && getWinner() == NO_WINNER) { userInterface.printTrack(track); Direction direction; @@ -230,7 +239,12 @@ public class Game implements GameSpecification { track.getCar(currentCarIndex).setMoveStrategy(new DoNotMoveStrategy()); direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); } - doCarTurn(direction); + try { + doCarTurn(direction); + } catch (PositionVectorNotValidException e) { + e.printStackTrace(); + userInterface.printInformation("There has been an unexpected Error. It seems that the trackfile is not Valid. Please do only use the given trackfiles. Otherwise please check that your selfmade tracks have borders arround the track."); + } switchToNextActiveCar(); } userInterface.printTrack(track); @@ -275,42 +289,46 @@ public class Game implements GameSpecification { } - + /** + * This method will check if a car is passing the finishline. + * If the car is passing the finishline in the wrong direction, the car will lose a winpoint. + * If the car is passing the finishline in the correct direction, the car will gain a winpoint. + * @param start the startposition of the car + * @param finish the expected finishpositon of the car after the move + * @param carIndex of the current player. + */ private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { List path = calculatePath(start, finish); for (PositionVector point : path) { - if (track.getSpaceType(point) != null) { - switch (track.getSpaceType(point)) { - case FINISH_UP: - if (start.getY() < finish.getY()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getY() > finish.getY()) { - track.getCar(carIndex).deductWinPoints(); - } - break; - case FINISH_DOWN: - if (start.getY() > finish.getY()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getY() < finish.getY()) { - track.getCar(carIndex).deductWinPoints(); - } - break; - case FINISH_RIGHT: - if (start.getX() < finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getX() > finish.getX()) { - track.getCar(carIndex).deductWinPoints(); - } - break; - case FINISH_LEFT: - if (start.getX() > finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getX() < finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); - } - break; - } - + switch (track.getSpaceType(point)) { + case FINISH_UP: + if (start.getY() < finish.getY()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getY() > finish.getY()) { + track.getCar(carIndex).deductWinPoints(); + } + break; + case FINISH_DOWN: + if (start.getY() > finish.getY()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getY() < finish.getY()) { + track.getCar(carIndex).deductWinPoints(); + } + break; + case FINISH_RIGHT: + if (start.getX() < finish.getX()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getX() > finish.getX()) { + track.getCar(carIndex).deductWinPoints(); + } + break; + case FINISH_LEFT: + if (start.getX() > finish.getX()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getX() < finish.getX()) { + track.getCar(carIndex).increaseWinPoints(); + } + break; } } } @@ -324,7 +342,7 @@ public class Game implements GameSpecification { * @return A boolean indicator if the car would crash with a WALL or another car. */ @Override - public boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValid { + public boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValidException { return track.willCrashAtPosition(carIndex, position); } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index 6655e69..f530593 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -4,6 +4,7 @@ package ch.zhaw.pm2.racetrack; * Class for Exception when invalid Fileformat is used. */ public class InvalidFileFormatException extends Exception { + public InvalidFileFormatException(){super();} public InvalidFileFormatException(String errorMessage) { super(errorMessage); } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Main.java b/src/main/java/ch/zhaw/pm2/racetrack/Main.java index aec65bd..625dc53 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Main.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Main.java @@ -1,12 +1,11 @@ package ch.zhaw.pm2.racetrack; -import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; public class Main { - public static void main(String[] args) throws InvalidTrackFormatException, PositionVectorNotValid { + public static void main(String[] args) { UserInterface userInterface = new UserInterface("Hello and Welcome to Racetrack by Team02-\"AngryNerds\""); while (true) { Game game = new Game(userInterface); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java deleted file mode 100644 index 2b70333..0000000 --- a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java +++ /dev/null @@ -1,9 +0,0 @@ -package ch.zhaw.pm2.racetrack; - -public class PositionVectorNotValid extends Throwable { - public PositionVectorNotValid(String message) { - super(message); - } - - public PositionVectorNotValid() {} -} diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java new file mode 100644 index 0000000..e3d75b2 --- /dev/null +++ b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java @@ -0,0 +1,9 @@ +package ch.zhaw.pm2.racetrack; + +public class PositionVectorNotValidException extends Throwable { + public PositionVectorNotValidException(String message) { + super(message); + } + + public PositionVectorNotValidException() {} +} diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index e0a6ff4..da1b495 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -69,7 +69,7 @@ public class Track implements TrackSpecification { * @throws FileNotFoundException if the given track file could not be found * @throws InvalidTrackFormatException if the track file contains invalid data (no tracklines, ...) */ - public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException, PositionVectorNotValid { + public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException { track = new ArrayList<>(); cars = new ArrayList<>(); finishLine = new ArrayList<>(); @@ -161,11 +161,11 @@ public class Track implements TrackSpecification { track.add(positionVector.getY(), line); } - private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValid { + private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValidException { try{ track.get(positionVector.getY()).charAt(positionVector.getX()); }catch (IndexOutOfBoundsException e) { - throw new PositionVectorNotValid(); + throw new PositionVectorNotValidException(); } } @@ -230,7 +230,7 @@ public class Track implements TrackSpecification { * @param positionVector the position to check if the car could crash * @return true if car would crash. Else false. */ - public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValid { + public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValidException { isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method? char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX()); if (getCarId(carIndex) == charAtPosition) return false; @@ -247,7 +247,7 @@ public class Track implements TrackSpecification { * @param carIndex representing current Car * @param crashPositionVector where the Crash did happen */ - public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValid{ + public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValidException { isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method? PositionVector currentCarPosition = getCarPos(carIndex); drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue()); @@ -266,7 +266,6 @@ public class Track implements TrackSpecification { */ @Override public Config.SpaceType getSpaceType(PositionVector position) { - //isPositionVectorOnTrack(position); Should be used but we are not allowed to change method head. We don't use function anyway char charAtPosition = track.get(position.getY()).charAt(position.getX()); ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); for (ConfigSpecification.SpaceType spaceType : spaceTypes) { @@ -274,8 +273,7 @@ public class Track implements TrackSpecification { return spaceType; } } - - return null; + return ConfigSpecification.SpaceType.WALL; } /** diff --git a/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java b/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java index c9148e5..4810ad1 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java @@ -1,7 +1,7 @@ package ch.zhaw.pm2.racetrack.given; import ch.zhaw.pm2.racetrack.PositionVector; -import ch.zhaw.pm2.racetrack.PositionVectorNotValid; +import ch.zhaw.pm2.racetrack.PositionVectorNotValidException; import java.util.List; @@ -19,11 +19,11 @@ public interface GameSpecification { int getWinner(); - void doCarTurn(PositionVector.Direction acceleration) throws PositionVectorNotValid; + void doCarTurn(PositionVector.Direction acceleration) throws PositionVectorNotValidException; void switchToNextActiveCar(); List calculatePath(PositionVector startPosition, PositionVector endPosition); - boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValid; + boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValidException; } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java index 0c1dea3..f5a8005 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; import java.io.File; +import java.io.FileNotFoundException; import java.util.List; import static ch.zhaw.pm2.racetrack.Game.NO_WINNER; import static ch.zhaw.pm2.racetrack.PositionVector.Direction.*; @@ -35,7 +36,12 @@ class GameTest { void setup() { userInterface = new UserInterface("Test"); game = new Game(userInterface); - track = game.selectTrack(new File(TRACK_FILE_PATH)); + try { + track = game.selectTrack(new File(TRACK_FILE_PATH)); + } catch (InvalidTrackFormatException | FileNotFoundException e) { + e.printStackTrace(); + Assertions.fail(); + } game.selectMoveStrategy(track.getCar(CAR_INDEX_ONE), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_ONE, track.getCarId(CAR_INDEX_ONE))); game.selectMoveStrategy(track.getCar(CAR_INDEX_TWO), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_TWO, track.getCarId(CAR_INDEX_TWO))); @@ -93,7 +99,12 @@ class GameTest { void setup() { userInterface = new UserInterface("Test"); game = new Game(userInterface); - track = game.selectTrack(new File(TRACK_FILE_PATH)); + try { + track = game.selectTrack(new File(TRACK_FILE_PATH)); + } catch (InvalidTrackFormatException | FileNotFoundException e) { + e.printStackTrace(); + Assertions.fail(); + } game.selectMoveStrategy(track.getCar(CAR_INDEX_ONE), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_ONE, track.getCarId(CAR_INDEX_ONE))); game.selectMoveStrategy(track.getCar(CAR_INDEX_TWO), new UserMoveStrategy(new UserInterface("Testing"), CAR_INDEX_TWO, track.getCarId(CAR_INDEX_TWO))); @@ -104,8 +115,8 @@ class GameTest { try { game.doCarTurn(RIGHT); Assertions.assertEquals(new PositionVector(1, 0), game.getCarVelocity(0)); - } catch (PositionVectorNotValid positionVectorNotValid) { - positionVectorNotValid.printStackTrace(); + } catch (PositionVectorNotValidException positionVectorNotValidException) { + positionVectorNotValidException.printStackTrace(); } } @@ -114,8 +125,8 @@ class GameTest { try { game.doCarTurn(PositionVector.Direction.UP); Assertions.assertTrue(game.onlyOneCarLeft()); - } catch (PositionVectorNotValid positionVectorNotValid) { - positionVectorNotValid.printStackTrace(); + } catch (PositionVectorNotValidException positionVectorNotValidException) { + positionVectorNotValidException.printStackTrace(); } } } @@ -169,23 +180,15 @@ class GameTest { UP_RIGHT, RIGHT, RIGHT})); - try { - game.initPhase(); - Assertions.assertEquals("a",game.gamePhase()); - } catch (InvalidTrackFormatException | PositionVectorNotValid e) { - e.printStackTrace(); - } + game.initPhase(); + Assertions.assertEquals("a",game.gamePhase()); } @Test void crashA() { game = new Game(new interFace("Test",new Integer[]{0,2,2},new PositionVector.Direction[]{UP})); - try { - game.initPhase(); - Assertions.assertEquals("b",game.gamePhase()); - } catch (InvalidTrackFormatException | PositionVectorNotValid e) { - e.printStackTrace(); - } + game.initPhase(); + Assertions.assertEquals("b",game.gamePhase()); } } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index d5cff22..a19e607 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -21,10 +21,11 @@ public class TrackTest { File file = new File(".\\tracks\\challenge.txt"); try { trackObj = new Track(file); - - } catch (Exception | PositionVectorNotValid e) { - System.err.println("Error in Test compareTrack" + e.getMessage()); + } catch (FileNotFoundException | InvalidTrackFormatException e) { + e.printStackTrace(); + Assertions.fail(); } + } @Test @@ -79,7 +80,7 @@ public class TrackTest { track.add("##################################################"); track.add("##################################################"); Assertions.assertLinesMatch(track, trackObj.getTrack()); - } catch (FileNotFoundException | InvalidTrackFormatException | PositionVectorNotValid e) { + } catch (FileNotFoundException | InvalidTrackFormatException e) { e.printStackTrace(); } } @@ -115,8 +116,8 @@ public class TrackTest { Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22))); //Car will not Crash and is on finishLine Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0))); - } catch (PositionVectorNotValid positionVectorNotValid) { - positionVectorNotValid.printStackTrace(); + } catch (PositionVectorNotValidException positionVectorNotValidException) { + positionVectorNotValidException.printStackTrace(); Assertions.fail("Test should not throw error"); } } @@ -126,8 +127,8 @@ public class TrackTest { void makeCarCrash() { try { trackObj.carDoesCrash(0, new PositionVector(6, 22)); - } catch (PositionVectorNotValid positionVectorNotValid) { - positionVectorNotValid.printStackTrace(); + } catch (PositionVectorNotValidException positionVectorNotValidException) { + positionVectorNotValidException.printStackTrace(); Assertions.fail("Test should not throw exception"); } Assertions.assertEquals(Track.CRASH_INDICATOR, trackObj.getTrack().get(22).charAt(6)); @@ -146,7 +147,7 @@ public class TrackTest { try { trackObj = new Track(file); - } catch (Exception | PositionVectorNotValid e) { + } catch (InvalidTrackFormatException | FileNotFoundException e) { System.err.println("Error in Test compareTrack" + e.getMessage()); } } @@ -168,8 +169,8 @@ public class TrackTest { @Test @DisplayName("Invalid Position Vector used") void invalidPositionVector() { - Assertions.assertThrows(PositionVectorNotValid.class, () -> trackObj.willCrashAtPosition(0, new PositionVector(100, 200))); - Assertions.assertThrows(PositionVectorNotValid.class, () -> trackObj.carDoesCrash(1,new PositionVector(200,100))); + Assertions.assertThrows(PositionVectorNotValidException.class, () -> trackObj.willCrashAtPosition(0, new PositionVector(100, 200))); + Assertions.assertThrows(PositionVectorNotValidException.class, () -> trackObj.carDoesCrash(1,new PositionVector(200,100))); } } From eca2e2eb9bc155307a96dc5fe3a2a2ef94763685 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Thu, 24 Mar 2022 17:02:42 +0100 Subject: [PATCH 33/36] refactored merge conflict in Track --- .../java/ch/zhaw/pm2/racetrack/Track.java | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index d2d8036..02ddd9a 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -124,8 +124,8 @@ public class Track implements TrackSpecification { } //TODO: THIS + /** - * * @throws InvalidTrackFormatException */ private void findFinish() throws InvalidTrackFormatException { @@ -174,7 +174,7 @@ public class Track implements TrackSpecification { * Method that places a character at a chosen position * * @param positionVector position where char will be placed - * @param symbol char that should be placed at desired position + * @param symbol char that should be placed at desired position */ private void drawCharOnTrackIndicator(PositionVector positionVector, char symbol) { String line = track.get(positionVector.getY()); @@ -183,19 +183,17 @@ public class Track implements TrackSpecification { track.add(positionVector.getY(), line); } //TODO: check if this method is okay and needed + /** * Determines if a location is valid PositionVector inside the track * * @param positionVector of location that has to be checked - * @throws PositionVectorNotValid if the PositionVector does not lie on the track. + * @throws PositionVectorNotValidException if the PositionVector does not lie on the track. */ - private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValid { - try { - private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValidException { - try{ + try { track.get(positionVector.getY()).charAt(positionVector.getX()); - }catch (IndexOutOfBoundsException e) { + } catch (IndexOutOfBoundsException e) { throw new PositionVectorNotValidException(); } } @@ -256,8 +254,8 @@ public class Track implements TrackSpecification { /** * This Method will check if the Car would crash at the specific position * - * @param positionVector the position to check if the car would crash - * @return true if crash otherwise false + * @param positionVector the position to check if the car could crash + * @return true if car would crash. Else false. */ public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValidException { isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method? @@ -271,10 +269,10 @@ public class Track implements TrackSpecification { } /** - * This Method will mark the Car as crashed inside the track and the car Object. + * This Method will make the Car Crash. In Track and in the Car Object * - * @param carIndex of car that will be marked as crashed - * @param crashPositionVector of the location of the crash + * @param carIndex representing current Car + * @param crashPositionVector where the Crash did happen */ public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValidException { isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method? @@ -291,7 +289,7 @@ public class Track implements TrackSpecification { * If the location is outside the track bounds, it is considered a wall. * * @param position The coordinates of the position to examine - * @return The type of space at the desired position + * @return The type of track position at the given location */ @Override public Config.SpaceType getSpaceType(PositionVector position) { @@ -303,13 +301,14 @@ public class Track implements TrackSpecification { return spaceType; } } - return ConfigSpecification.SpaceType.WALL; + + return null; } /** - * Return the number of cars that are located in a track + * Return the number of cars. * - * @return number of cars as int + * @return Number of cars */ @Override public int getCarCount() { @@ -383,13 +382,6 @@ public class Track implements TrackSpecification { return currentSpace.getValue(); } - /** - * Determines all points that lie between the two position vectors including the endpoint VectorPosition using the Bresenham algorithm. - * - * @param startPosition PositionVector of the finish coordinate - * @param endPosition PositionVector of the start coordinate - * @return ArrayList containing PositionVectors of all position that are between the start and finish including the finish position. - */ public ArrayList calculatePointsOnPath(PositionVector startPosition, PositionVector endPosition) { ArrayList pathList = new ArrayList<>(); // Use Bresenham's algorithm to determine positions. From ad2e1c31049457e8b950da38a8a6faccdf4adb11 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Thu, 24 Mar 2022 17:09:05 +0100 Subject: [PATCH 34/36] worked on PathFinderMoveStrategy and Refactoring in Game.java --- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 28 +++-- .../strategy/PathFinderMoveStrategy.java | 104 +++++++++++++++++- 2 files changed, 116 insertions(+), 16 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index e5f0ed1..c8383df 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -220,7 +220,12 @@ public class Game implements GameSpecification { if (crashPosition != null) { track.carDoesCrash(currentCarIndex, crashPosition); } else { - calculateWinner(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition(), currentCarIndex); + int newWinPoints = calculateNewWinPoints(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition()); + if(newWinPoints == 1){ + track.getCar(currentCarIndex).increaseWinPoints(); + }else{ + track.getCar(currentCarIndex).deductWinPoints(); + } track.moveCar(currentCarIndex); } } @@ -280,43 +285,46 @@ public class Game implements GameSpecification { - private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { + private int calculateNewWinPoints(PositionVector start, PositionVector finish) { List path = calculatePath(start, finish); for (PositionVector point : path) { if (track.getSpaceType(point) != null) { switch (track.getSpaceType(point)) { case FINISH_UP: if (start.getY() < finish.getY()) { - track.getCar(carIndex).increaseWinPoints(); + return 1; } else if (start.getY() > finish.getY()) { - track.getCar(carIndex).deductWinPoints(); + return -1; } break; case FINISH_DOWN: if (start.getY() > finish.getY()) { - track.getCar(carIndex).increaseWinPoints(); + return 1; } else if (start.getY() < finish.getY()) { - track.getCar(carIndex).deductWinPoints(); + return -1; } break; case FINISH_RIGHT: if (start.getX() < finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); + return 1; } else if (start.getX() > finish.getX()) { - track.getCar(carIndex).deductWinPoints(); + return -1; } break; case FINISH_LEFT: if (start.getX() > finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); + return 1; } else if (start.getX() < finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); + return -1; } break; + default: + return 0; } } } + return 0; } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java index 04e79d8..049abbc 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java @@ -1,36 +1,128 @@ package ch.zhaw.pm2.racetrack.strategy; import ch.zhaw.pm2.racetrack.PositionVector; +import ch.zhaw.pm2.racetrack.PositionVectorNotValid; import ch.zhaw.pm2.racetrack.Track; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class PathFinderMoveStrategy implements MoveStrategy{ private Track track; private int carIndex; private List moveList; private int pointer; + private List allDirections; public PathFinderMoveStrategy(Track track, int carIndex) { this.track = track; this.carIndex = carIndex; + allDirections = Arrays.asList(PositionVector.Direction.values()); createMoveList(); - pointer = -1; } + private void createMoveList(){ - moveList = new ArrayList<>(); + PossibleMove finishedMove = null; + List possibleMoves= new ArrayList<>(); + for(PositionVector.Direction direction : allDirections){ + possibleMoves.add(new PossibleMove(null, direction)); + } + while(finishedMove == null){ + List newMoves = new ArrayList<>(); + for(PossibleMove previousMove : possibleMoves){ + for(PositionVector.Direction direction : allDirections){ + PossibleMove newMove = new PossibleMove(previousMove, direction); + + if(! (newMove.crashed() || newMove.drivingLoop())){ + newMoves.add(newMove); + } + } + } + possibleMoves = newMoves; + finishedMove = findFinishedMove(possibleMoves); + } + + moveList = finishedMove.directions; + + pointer = moveList.size(); + + + } + + private PossibleMove findFinishedMove(List moveList){ + for(PossibleMove move : moveList){ + if(move.finished()){ + return move; + } + } + return null; + } + + + public class PossibleMove { + List directions; + List positions; + PositionVector endVelocity; + + public PossibleMove(PossibleMove previousMove, PositionVector.Direction nextDirection){ + PositionVector startVelocity; + PositionVector startPosition; + positions = new ArrayList<>(); + directions = new ArrayList<>(); + if(previousMove != null){ + positions.addAll(previousMove.positions); + directions.addAll(previousMove.directions); + startPosition = positions.get(positions.size()-1); + startVelocity = previousMove.endVelocity; + } + else { + startPosition = track.getCarPos(carIndex); + startVelocity = track.getCar(carIndex).getVelocity(); + } + directions.add(nextDirection); + endVelocity = new PositionVector(startVelocity.getX() + nextDirection.vector.getX(), startVelocity.getY() + nextDirection.vector.getY()); + positions.add(new PositionVector(startPosition.getX() + endVelocity.getX(), startPosition.getY() + endVelocity.getY())); + } + + public boolean finished(){ + for(PositionVector finishPosition : track.getFinishLine()){ + if(finishPosition.equals(positions.get(positions.size()-1))){ + return true; //TODO: check direction + } + } + return false; + } + + public boolean crashed() { + try { + if(track.willCrashAtPosition(carIndex, positions.get(positions.size()-1))){ + return true; + } + } catch (PositionVectorNotValid e) { + return true; + } + return false; + } + + public boolean drivingLoop(){ + for(int i = 0; i < positions.size()-1; i++){ + if(positions.get(i).equals(positions.get(positions.size()-1))){ + return true; + } + } + return false; + } + } @Override public PositionVector.Direction nextMove() { - pointer += 1; + pointer -= 1; //TODO: Check if crash. if yes --> createMoveList(); - if (pointer < moveList.size()) { + if (pointer >= 0) { return moveList.get(pointer); } return null; From f6a16181cf41d05b474fbc4f6b8678b22fadb590 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Thu, 24 Mar 2022 17:27:30 +0100 Subject: [PATCH 35/36] removed PositionVectorNotValidException.java --- Klassendiagramm.drawio | 2 +- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 11 ++---- .../PositionVectorNotValidException.java | 9 ----- .../java/ch/zhaw/pm2/racetrack/Track.java | 22 ++---------- .../racetrack/given/GameSpecification.java | 5 ++- .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 35 +++++-------------- 6 files changed, 16 insertions(+), 68 deletions(-) delete mode 100644 src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java diff --git a/Klassendiagramm.drawio b/Klassendiagramm.drawio index 99e08e5..987ce13 100644 --- a/Klassendiagramm.drawio +++ b/Klassendiagramm.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 11e03d1..05698c0 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -203,7 +203,7 @@ public class Game implements GameSpecification { * for this turn */ @Override - public void doCarTurn(Direction acceleration) throws PositionVectorNotValidException { + public void doCarTurn(Direction acceleration) { track.getCar(currentCarIndex).accelerate(acceleration); PositionVector crashPosition = null; List positionList = calculatePath(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition()); @@ -239,12 +239,7 @@ public class Game implements GameSpecification { track.getCar(currentCarIndex).setMoveStrategy(new DoNotMoveStrategy()); direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); } - try { - doCarTurn(direction); - } catch (PositionVectorNotValidException e) { - e.printStackTrace(); - userInterface.printInformation("There has been an unexpected Error. It seems that the trackfile is not Valid. Please do only use the given trackfiles. Otherwise please check that your selfmade tracks have borders arround the track."); - } + doCarTurn(direction); switchToNextActiveCar(); } userInterface.printTrack(track); @@ -342,7 +337,7 @@ public class Game implements GameSpecification { * @return A boolean indicator if the car would crash with a WALL or another car. */ @Override - public boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValidException { + public boolean willCarCrash(int carIndex, PositionVector position) { return track.willCrashAtPosition(carIndex, position); } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java deleted file mode 100644 index e3d75b2..0000000 --- a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java +++ /dev/null @@ -1,9 +0,0 @@ -package ch.zhaw.pm2.racetrack; - -public class PositionVectorNotValidException extends Throwable { - public PositionVectorNotValidException(String message) { - super(message); - } - - public PositionVectorNotValidException() {} -} diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 02ddd9a..f7eee0e 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -182,22 +182,6 @@ public class Track implements TrackSpecification { track.remove(positionVector.getY()); track.add(positionVector.getY(), line); } - //TODO: check if this method is okay and needed - - /** - * Determines if a location is valid PositionVector inside the track - * - * @param positionVector of location that has to be checked - * @throws PositionVectorNotValidException if the PositionVector does not lie on the track. - */ - private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValidException { - try { - track.get(positionVector.getY()).charAt(positionVector.getX()); - } catch (IndexOutOfBoundsException e) { - throw new PositionVectorNotValidException(); - } - } - /** * Method that returns the finishline as a List @@ -257,8 +241,7 @@ public class Track implements TrackSpecification { * @param positionVector the position to check if the car could crash * @return true if car would crash. Else false. */ - public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValidException { - isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method? + public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) { char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX()); if (getCarId(carIndex) == charAtPosition) return false; return !(charAtPosition == ConfigSpecification.SpaceType.TRACK.value || @@ -274,8 +257,7 @@ public class Track implements TrackSpecification { * @param carIndex representing current Car * @param crashPositionVector where the Crash did happen */ - public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValidException { - isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method? + public void carDoesCrash(int carIndex, PositionVector crashPositionVector) { PositionVector currentCarPosition = getCarPos(carIndex); drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue()); Car car = cars.get(carIndex); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java b/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java index 4810ad1..3596335 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java @@ -1,7 +1,6 @@ package ch.zhaw.pm2.racetrack.given; import ch.zhaw.pm2.racetrack.PositionVector; -import ch.zhaw.pm2.racetrack.PositionVectorNotValidException; import java.util.List; @@ -19,11 +18,11 @@ public interface GameSpecification { int getWinner(); - void doCarTurn(PositionVector.Direction acceleration) throws PositionVectorNotValidException; + void doCarTurn(PositionVector.Direction acceleration); void switchToNextActiveCar(); List calculatePath(PositionVector startPosition, PositionVector endPosition); - boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValidException; + boolean willCarCrash(int carIndex, PositionVector position); } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index a19e607..4d88811 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -109,28 +109,19 @@ public class TrackTest { @Test @DisplayName("Will Car Crash") void willCarCrash() { - try { - //Car will Crash - Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21))); - //Car will not Crash and is on track - Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22))); - //Car will not Crash and is on finishLine - Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0))); - } catch (PositionVectorNotValidException positionVectorNotValidException) { - positionVectorNotValidException.printStackTrace(); - Assertions.fail("Test should not throw error"); - } + //Car will Crash + Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21))); + //Car will not Crash and is on track + Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22))); + //Car will not Crash and is on finishLine + Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0))); + } @Test @DisplayName("Make Car Crash") void makeCarCrash() { - try { - trackObj.carDoesCrash(0, new PositionVector(6, 22)); - } catch (PositionVectorNotValidException positionVectorNotValidException) { - positionVectorNotValidException.printStackTrace(); - Assertions.fail("Test should not throw exception"); - } + trackObj.carDoesCrash(0, new PositionVector(6, 22)); Assertions.assertEquals(Track.CRASH_INDICATOR, trackObj.getTrack().get(22).charAt(6)); Assertions.assertTrue(trackObj.getCar(0).isCrashed()); } @@ -140,7 +131,6 @@ public class TrackTest { @DisplayName("Negative TestCase") class negativeClass { File file; - @BeforeEach void setup() { file = new File(".\\tracks\\challenge.txt"); @@ -165,14 +155,5 @@ public class TrackTest { File testfile = new File(".\\src\\test\\InvalidTracks\\sameCar.txt"); Assertions.assertThrows(InvalidTrackFormatException.class, () -> new Track(testfile)); } - - @Test - @DisplayName("Invalid Position Vector used") - void invalidPositionVector() { - Assertions.assertThrows(PositionVectorNotValidException.class, () -> trackObj.willCrashAtPosition(0, new PositionVector(100, 200))); - Assertions.assertThrows(PositionVectorNotValidException.class, () -> trackObj.carDoesCrash(1,new PositionVector(200,100))); - } - } - } From 82911fcfb6323a8159d5f120abd0de4a7b7f0081 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Thu, 24 Mar 2022 17:45:15 +0100 Subject: [PATCH 36/36] merge Game.java --- .../racetrack/strategy/PathFinderMoveStrategy.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java index 12d07a9..51026d0 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFinderMoveStrategy.java @@ -1,7 +1,6 @@ package ch.zhaw.pm2.racetrack.strategy; import ch.zhaw.pm2.racetrack.PositionVector; -import ch.zhaw.pm2.racetrack.PositionVectorNotValid; import ch.zhaw.pm2.racetrack.Track; import java.util.*; @@ -93,14 +92,11 @@ public class PathFinderMoveStrategy implements MoveStrategy{ } public boolean crashed() { - try { - for(PositionVector point : track.calculatePointsOnPath(positions.get(positions.size()-1), positions.get(positions.size()-2))) - if(track.willCrashAtPosition(carIndex, point)){ - return true; + for(PositionVector point : track.calculatePointsOnPath(positions.get(positions.size()-1), positions.get(positions.size()-2))) { + if (track.willCrashAtPosition(carIndex, point)) { + return true; + } } - } catch (PositionVectorNotValid e) { - return true; - } return false; }