package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; import design.model.Course; import design.model.Hole; import design.runtime.Session; import design.model.Club; import design.model.Round; import design.model.holeplay.HolePlayContext; import design.persistence.PersonalDatabase; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class HolePlayMenu extends Menu { private final Round round; private final HolePlayContext ctx; public HolePlayMenu() { this.round = createRound(); this.ctx = new HolePlayContext(Session.getCurrentGolfer(), round, PersonalDatabase.INSTANCE); } @Override public String getTitle() { return String.format("hole play - %s | hole %d", round.getCourse().getName(), round.getCurrentHole().getNumber()); } @Override public List getMenuOptions() { List opts = new ArrayList<>(); boolean inSetup = (ctx.getCurrentPlay() == null); if (inSetup) { // 0) Start hole opts.add(new MenuOption("start hole", () -> { ctx.startHole(); System.out.println("Started hole " + round.getCurrentHole().getNumber() + "."); this.present(); })); } else { // 0) Take a shot opts.add(new MenuOption("take a shot", () -> { var selector = new SelectClub(); selector.present(); Club club = selector.getResult(); Scanner sc = new Scanner(System.in); // Get shot distance (defaults to 0 of not stated) System.out.print("Distance (yds, blank=0): "); String ds = sc.nextLine().trim(); int dist = 0; if (!ds.isEmpty()) { dist = Integer.parseInt(ds); } // Records shot ctx.recordShot(club, dist); System.out.println("Shot recorded: " + dist + " yds with " + club.getNickname()); this.present(); })); // 1) Hole out opts.add(new MenuOption("hole out", () -> { // Precedes to next hole int prev = round.getCurrentHole().getNumber(); ctx.holeOut(); System.out.println("Holed out on " + prev + ". Next: " + round.getCurrentHole().getNumber()); this.present(); })); } // End round (always shown) opts.add(new MenuOption("end round", () -> { ctx.endRoundNow(); System.out.println("Round ended."); new MainMenu().present(); })); return opts; } private static Round createRound() { var golfer = Session.getCurrentGolfer(); var selector = new SelectCourse(); selector.present(); Course course = selector.getResult(); Scanner sc = new Scanner(System.in); // Gets starting hole on course int startHoleNum = 1; int holeCount = course.getHoleCount(); // Asks for a hole number until a valid number is selected System.out.print("Starting hole (1.." + holeCount + ", blank=1): "); String s = sc.nextLine().trim(); if (!s.isEmpty()) { int start; try { start = Integer.parseInt(s); } catch (NumberFormatException ex) { System.out.println("Input must be a number"); return createRound(); } if (start < 1 || start > holeCount) { System.out.println("Starting hole must be between 1 and " + holeCount + "."); return createRound(); } startHoleNum = start; } // Starts round and sends user to HolePlayMenu Hole startHole = course.getHoles().get(startHoleNum - 1); Round r = new Round(course, Session.getDateTime(), startHole); golfer.addRound(r); return r; } }