Advertisement
Ryan_Ho

MyModelFactory.java my ver.

Mar 10th, 2025
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.12 KB | None | 0 0
  1. package uk.ac.bris.cs.scotlandyard.model;
  2.  
  3. import com.google.common.collect.ImmutableList;
  4. import com.google.common.collect.ImmutableSet;
  5.  
  6. import javax.annotation.Nonnull;
  7. import java.util.HashSet;
  8. import java.util.Set;
  9.  
  10. import uk.ac.bris.cs.scotlandyard.model.ScotlandYard.Factory;
  11.  
  12. public final class MyModelFactory implements Factory<Model> {
  13.  
  14.     @Nonnull
  15.     @Override
  16.     public Model build(GameSetup setup, Player mrX, ImmutableList<Player> detectives) {
  17.         Board.GameState initialState = new MyGameStateFactory().build(setup, mrX, detectives);
  18.         Set<Model.Observer> observerRegistry = new HashSet<>();
  19.  
  20.         return new Model() {
  21.  
  22.             private Board.GameState currentState = initialState;
  23.  
  24.             @Nonnull
  25.             @Override
  26.             public Board getCurrentBoard() {
  27.                 return currentState;
  28.             }
  29.  
  30.             @Override
  31.             public void registerObserver(@Nonnull Observer observer) {
  32.                 if (observer == null) throw new NullPointerException("Observer cannot be null");
  33.                 if (!observerRegistry.add(observer)) {
  34.                     throw new IllegalArgumentException("Observer is already registered");
  35.                 }
  36.             }
  37.  
  38.             @Override
  39.             public void unregisterObserver(@Nonnull Observer observer) {
  40.                 if (observer == null) throw new NullPointerException("Observer cannot be null");
  41.                 if (!observerRegistry.remove(observer)) {
  42.                     throw new IllegalArgumentException("Observer is not registered");
  43.                 }
  44.             }
  45.  
  46.             @Nonnull
  47.             @Override
  48.             public ImmutableSet<Observer> getObservers() {
  49.                 return ImmutableSet.copyOf(observerRegistry);
  50.             }
  51.  
  52.             @Override
  53.             public void chooseMove(@Nonnull Move move) {
  54.                 if (!currentState.getAvailableMoves().contains(move)) {
  55.                     throw new IllegalArgumentException("Invalid move: " + move);
  56.                 }
  57.  
  58.                 // Advance the game state
  59.                 currentState = currentState.advance(move);
  60.  
  61.                 // Determine the correct event type
  62.                 Model.Observer.Event event = currentState.getWinner().isEmpty()
  63.                         ? Model.Observer.Event.MOVE_MADE
  64.                         : Model.Observer.Event.GAME_OVER;
  65.  
  66.                 // Notify observers
  67.                 for (Observer observer : observerRegistry) {
  68.                     observer.onModelChanged(getCurrentBoard(), event);
  69.                 }
  70.             }
  71.         };
  72.     }
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement