Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.79 KB | None | 0 0
  1. package ch.epfl.javass.jass;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.EnumMap;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Random;
  10.  
  11. import ch.epfl.javass.jass.Card.Color;
  12. import ch.epfl.javass.jass.Card.Rank;
  13.  
  14. public final class JassGame {
  15.  
  16.     private TurnState turnState;
  17.     private Random shuffleRng;
  18.     private Random trumpRng;
  19.     private Map<PlayerId, Player> players;
  20.     private Map<PlayerId, String> playerNames;
  21.     private PlayerId firstPlayer;
  22.     private Map<PlayerId, CardSet> playerSet;
  23.    
  24.     public JassGame(long rngSeed, Map<PlayerId, Player> players,
  25.             Map<PlayerId, String> playerNames) {
  26.  
  27.         Random rng = new Random(rngSeed);
  28.         this.shuffleRng = new Random(rng.nextLong());
  29.         this.trumpRng = new Random(rng.nextLong());
  30.         this.players = Collections.unmodifiableMap(new EnumMap<>(players));
  31.         this.playerNames = Collections.unmodifiableMap(new EnumMap<>(playerNames));
  32.         playerSet = new EnumMap<>(PlayerId.class);
  33.         shuffleAndDistribute();
  34.         firstPlayer = starterPlayer();
  35.         this.turnState = TurnState.initial(trumpRandom(), Score.INITIAL, firstPlayer);
  36.  
  37.     }
  38.  
  39.     public boolean isGameOver() {
  40.         return (PackedScore.totalPoints(turnState.pkScore,
  41.                 TeamId.TEAM_1) >= 1000
  42.                 || PackedScore.totalPoints(turnState.pkScore,
  43.                      TeamId.TEAM_2) >= 1000);
  44.     }
  45.  
  46.     public void advanceToEndOfNextTrick() {
  47.         if (isGameOver()) {
  48.             return;
  49.         }
  50.  
  51.         turnState = turnState.withTrickCollected();
  52.  
  53.         for (Map.Entry<PlayerId, Player> p : players.entrySet()) {
  54.             p.getValue().updateScore(this.turnState.score());
  55.             ;
  56.         }
  57.  
  58.         for (Map.Entry<PlayerId, Player> p : players.entrySet()) {
  59.             p.getValue().setPlayers(p.getKey(), playerNames);
  60.         }
  61.         shuffleAndDistribute();
  62.         Color trump = trumpRandom();
  63.         if (this.turnState.isTerminal()) {
  64.             this.turnState.initial(trump, this.turnState.score(),
  65.                     this.turnState.nextPlayer());
  66.             players.get(this.turnState.nextPlayer()).setTrump(trump);
  67.             play();
  68.             play();
  69.             play();
  70.             play();
  71.         } else {
  72.             this.turnState.trick().nextEmpty();
  73.             play();
  74.             play();
  75.             play();
  76.             play();
  77.  
  78.         }
  79.  
  80.     }
  81.  
  82.     private PlayerId starterPlayer() {
  83.  
  84.         for (int i = 0; i < 4; ++i) {
  85.             if (playerSet.get(PlayerId.ALL.get(i)).contains(Card.of(Card.Color.DIAMOND, Card.Rank.SEVEN)))
  86.                 return PlayerId.ALL.get(i);
  87.         }
  88.         throw new IllegalArgumentException();
  89.  
  90.     }
  91.  
  92.     private Color trumpRandom() {
  93.         return Card.Color.ALL.get(trumpRng.nextInt(4));
  94.  
  95.     }
  96.  
  97.     private void shuffleAndDistribute() {
  98.         List<Card> deck = new ArrayList<Card>();
  99.         for (Color c : Card.Color.ALL) {
  100.             for (Rank r : Card.Rank.ALL) {
  101.                 deck.add(Card.of(c, r));
  102.             }
  103.         }
  104.         Collections.shuffle(deck, shuffleRng);
  105.        
  106.         for (int i = 0; i < 4; i++) {
  107.             playerSet.put(PlayerId.ALL.get(i), CardSet.of(deck.subList(i * 9, (i + 1) * 9)));
  108.         }
  109.     }
  110.  
  111.     private void play() {
  112.         PlayerId player = this.turnState.nextPlayer();
  113.         Card cardPlayed = players.get(player).cardToPlay(this.turnState,
  114.                 playerSet.get(player));
  115.         this.turnState.withNewCardPlayed(cardPlayed);
  116.         playerSet.replace(player, playerSet.get(player).remove(cardPlayed));
  117.         players.get(player).updateHand(playerSet.get(player));
  118.         players.get(player).updateTrick(this.turnState.trick());
  119.     }
  120.  
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement