Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package uk.ac.bris.cs.scotlandyard.model;
- import com.google.common.collect.ImmutableList;
- import com.google.common.collect.ImmutableSet;
- import javax.annotation.Nonnull;
- import java.util.HashSet;
- import java.util.Set;
- import uk.ac.bris.cs.scotlandyard.model.ScotlandYard.Factory;
- public final class MyModelFactory implements Factory<Model> {
- @Nonnull
- @Override
- public Model build(GameSetup setup, Player mrX, ImmutableList<Player> detectives) {
- Board.GameState initialState = new MyGameStateFactory().build(setup, mrX, detectives);
- Set<Model.Observer> observerRegistry = new HashSet<>();
- return new Model() {
- private Board.GameState currentState = initialState;
- @Nonnull
- @Override
- public Board getCurrentBoard() {
- return currentState;
- }
- @Override
- public void registerObserver(@Nonnull Observer observer) {
- if (observer == null) throw new NullPointerException("Observer cannot be null");
- if (!observerRegistry.add(observer)) {
- throw new IllegalArgumentException("Observer is already registered");
- }
- }
- @Override
- public void unregisterObserver(@Nonnull Observer observer) {
- if (observer == null) throw new NullPointerException("Observer cannot be null");
- if (!observerRegistry.remove(observer)) {
- throw new IllegalArgumentException("Observer is not registered");
- }
- }
- @Nonnull
- @Override
- public ImmutableSet<Observer> getObservers() {
- return ImmutableSet.copyOf(observerRegistry);
- }
- @Override
- public void chooseMove(@Nonnull Move move) {
- if (!currentState.getAvailableMoves().contains(move)) {
- throw new IllegalArgumentException("Invalid move: " + move);
- }
- // Advance the game state
- currentState = currentState.advance(move);
- // Determine the correct event type
- Model.Observer.Event event = currentState.getWinner().isEmpty()
- ? Model.Observer.Event.MOVE_MADE
- : Model.Observer.Event.GAME_OVER;
- // Notify observers
- for (Observer observer : observerRegistry) {
- observer.onModelChanged(getCurrentBoard(), event);
- }
- }
- };
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement