diff options
| author | Tyler Ferrari <69283684+Sowgro@users.noreply.github.com> | 2025-10-09 08:33:53 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-09 08:33:53 -0400 |
| commit | 1eca2f8681752ad359e8372780cdf719e2b1747d (patch) | |
| tree | ac1ece075909102027be22a5ae2472f286f09b10 /src/main/java | |
| parent | f115308210fd98e6b6f83f8c091ca72dbfb666fb (diff) | |
| parent | 7bbb3d8d7842c5e212124631c302b63bdc370f20 (diff) | |
| download | designproject-design-6-1eca2f8681752ad359e8372780cdf719e2b1747d.tar.gz designproject-design-6-1eca2f8681752ad359e8372780cdf719e2b1747d.tar.bz2 designproject-design-6-1eca2f8681752ad359e8372780cdf719e2b1747d.zip | |
Merge pull request #11 from RIT-SWEN-262/statistic-dev
Statistic dev - Menu implementation
Diffstat (limited to '')
4 files changed, 155 insertions, 8 deletions
diff --git a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java index c609177..3af790e 100644 --- a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java +++ b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java @@ -2,20 +2,136 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import design.model.Course; +import design.model.Golfer; +import design.model.Hole; +import design.model.Play; +import design.model.Round; +import design.model.statistics.CourseStats; +import design.model.statistics.HoleStats; +import design.model.statistics.LifetimeStats; +import design.model.statistics.RoundStats; +import design.model.statistics.Statistics; +import design.model.statistics.YearlyStats; +import design.runtime.Session; import java.util.List; +import java.util.Scanner; public class StatisticsMenu extends Menu { + Golfer golfer = Session.getCurrentGolfer(); + @Override public String getTitle() { return "statistics menu"; } + // Helper classes to get user input and handle finding the data they requested (Course, Hole, Year, etc.) + @SuppressWarnings("resource") + private Statistics getUserYear(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + + System.out.println("Enter year to search: "); + int year = Integer.parseInt(sc.nextLine()); + + Statistics yearStats = new YearlyStats(baseStats, year); + return yearStats; + } + + @SuppressWarnings("resource") + private Statistics getUserCourse(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + Course[] courses = golfer.getCourses(); + for(int i = 0; i < courses.length; i++){ + System.out.println((i+1) + ".) Name: " + courses[i].getName() + ". Location: " + courses[i].getLocation()); + } + System.out.println("Select the course number corresponding to the course. "); + int selection = Integer.parseInt(sc.nextLine()); + return new CourseStats(baseStats, courses[selection - 1]); + } + + @SuppressWarnings("resource") + private Statistics getUserRound(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + Round[] rounds = baseStats.getRounds(); + for(int i = 0; i < rounds.length; i++){ + System.out.println((i+1) + ".) Date: " + rounds[i].getDateTime().toLocalDate() + ". Time: " + rounds[i].getDateTime().toLocalTime() + ". Final Score: " + rounds[i].getTotalSwings() + ". Total Distance: " + rounds[i].getTotalDistance()); + } + System.out.println("Select the round number: "); + int selection = Integer.parseInt(sc.nextLine()); + return new RoundStats(baseStats, rounds[selection - 1]); + } + + @SuppressWarnings("resource") + private Statistics getUserHole(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + Round round = baseStats.getRounds()[0]; // Only 1 round + Play[] plays = round.getPlays(); + for(Play play : plays){ + System.out.println("Hole number: " + play.getHoleNumber()); + } + System.out.println("Enter the hole number: "); + int holeNum = Integer.parseInt(sc.nextLine()); + + Course course = round.getCourse(); + for(Hole hole : course.getHoles()){ + if(hole.getNumber() == holeNum){ + return new HoleStats(baseStats, hole); + } + } + return baseStats; + } + @Override public List<MenuOption> getMenuOptions() { return List.of( - new MenuOption("return to main menu", () -> new MainMenu().present()) + new MenuOption("return to main menu", () -> new MainMenu().present()), + new MenuOption("view lifetime statistics", () -> { + Statistics stats = new LifetimeStats(golfer); + + System.out.printf("Total swings: %d\n", stats.get_score()); + System.out.printf("Total distance: %.1f\n", stats.get_distance()); + this.present(); + }), + new MenuOption("view yearly statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + + System.out.printf("Total swings: %d\n", yearStats.get_score()); + System.out.printf("Total distance: %.1f\n", yearStats.get_distance()); + this.present(); + }), + new MenuOption("view course statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + Statistics courseStats = getUserCourse(yearStats); + + System.out.printf("Total swings: %d\n", courseStats.get_score()); + System.out.printf("Total distance: %.1f\n", courseStats.get_distance()); + this.present(); + }), + new MenuOption("view round statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + Statistics courseStats = getUserCourse(yearStats); + Statistics roundStats = getUserRound(courseStats); + + System.out.printf("Total swings: %d\n", roundStats.get_score()); + System.out.printf("Total distance: %.1f\n", roundStats.get_distance()); + this.present(); + }), + new MenuOption("view hole statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + Statistics courseStats = getUserCourse(yearStats); + Statistics roundStats = getUserRound(courseStats); + Statistics holeStats = getUserHole(roundStats); + + System.out.printf("Total swings: %d\n", holeStats.get_score()); + System.out.printf("Total distance: %.1f\n", holeStats.get_distance()); + this.present(); + }) ); } -} +}
\ No newline at end of file diff --git a/src/main/java/design/model/statistics/HoleStats.java b/src/main/java/design/model/statistics/HoleStats.java index 2c023b4..6f6104a 100644 --- a/src/main/java/design/model/statistics/HoleStats.java +++ b/src/main/java/design/model/statistics/HoleStats.java @@ -3,6 +3,7 @@ package design.model.statistics; import java.util.Arrays; import design.model.Hole; +import design.model.Play; import design.model.Round; public class HoleStats extends StatisticsDecorator{ @@ -16,7 +17,35 @@ public class HoleStats extends StatisticsDecorator{ @Override public Round[] getRounds(){ return Arrays.stream(super.getRounds()) - .filter(round -> round.getCourse().getHoles().stream().anyMatch(hole -> hole.equals(target_hole))) + .filter(round -> round.getCourse().getHoles().contains(target_hole)) .toArray(Round[]::new); } + + @Override + public int get_score() { + // Sum swings only on the target hole + int totalSwings = 0; + for (Round round : super.getRounds()) { + for (Play play : round.getPlays()) { + if (play.getHoleNumber() == target_hole.getNumber()) { + totalSwings += play.getSwingCount(); + } + } + } + return totalSwings; + } + + @Override + public double get_distance() { + // Sum distances only on the target hole + double totalDistance = 0; + for (Round round : super.getRounds()) { + for (Play play : round.getPlays()) { + if (play.getHoleNumber() == target_hole.getNumber()) { + totalDistance += play.getDistance(); + } + } + } + return totalDistance; + } } diff --git a/src/main/java/design/model/statistics/RoundStats.java b/src/main/java/design/model/statistics/RoundStats.java index 598ca59..4ce89b0 100644 --- a/src/main/java/design/model/statistics/RoundStats.java +++ b/src/main/java/design/model/statistics/RoundStats.java @@ -15,7 +15,7 @@ public class RoundStats extends StatisticsDecorator{ @Override public Round[] getRounds(){ return Arrays.stream(super.getRounds()) - .filter(round -> round == target_round) + .filter(round -> round.getDateTime().equals(target_round.getDateTime()) && round.getTotalSwings() == target_round.getTotalSwings() && round.getTotalDistance() == target_round.getTotalDistance()) .toArray(Round[]::new); } } diff --git a/src/main/java/design/model/statistics/StatisticsDecorator.java b/src/main/java/design/model/statistics/StatisticsDecorator.java index 91ca452..ed83a9e 100644 --- a/src/main/java/design/model/statistics/StatisticsDecorator.java +++ b/src/main/java/design/model/statistics/StatisticsDecorator.java @@ -1,5 +1,7 @@ package design.model.statistics; +import java.util.Arrays; + import design.model.Round; public abstract class StatisticsDecorator implements Statistics{ @@ -12,11 +14,11 @@ public abstract class StatisticsDecorator implements Statistics{ return wrapped_statistics.getRounds(); } @Override - public int get_score(){ - return wrapped_statistics.get_score(); + public int get_score() { + return Arrays.stream(getRounds()).mapToInt(Round::getTotalSwings).sum(); } @Override - public double get_distance(){ - return wrapped_statistics.get_distance(); + public double get_distance() { + return Arrays.stream(getRounds()).mapToDouble(Round::getTotalDistance).sum(); } } |
