From c8e92e38d5ae93a1413f44583c6386388ef952fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sas=CC=8Ca=20Kocic=CC=81?= Date: Sat, 20 Jun 2020 15:25:39 +0200 Subject: [PATCH] Players as ArrayList --- src/Game.java | 62 +++-------------------------------------------- src/GameTest.java | 6 ++--- src/Main.java | 3 +-- src/Pile.java | 16 ++++++++---- src/Players.java | 43 ++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 68 deletions(-) create mode 100644 src/Players.java diff --git a/src/Game.java b/src/Game.java index 044763e..ac6319e 100644 --- a/src/Game.java +++ b/src/Game.java @@ -1,10 +1,5 @@ -import java.util.ArrayList; - public class Game { - Player[] players; - final Pile pot = new Pile(); - final Pile draws = new Pile(); - final int numberOfPlayers; + final Players players = new Players(); /** * @param numberOfCards Total number of cards @@ -12,62 +7,13 @@ public class Game { */ public Game(int numberOfCards, int numberOfPlayers) { Pile deck = Pile.createDeck(numberOfCards); - createPlayersWithCards(numberOfPlayers, deck); - this.numberOfPlayers = numberOfPlayers; - } - - private void createPlayersWithCards(int numberOfPlayers, Pile deck) { - this.players = new Player[numberOfPlayers]; int cardsPerPlayer = deck.size() / numberOfPlayers; for (int i = 0; i < numberOfPlayers; i++) { - players[i] = new Player(String.valueOf(i), deck.take(cardsPerPlayer)); - } - } - - public void play() { - while (noWinner()) { - draws.clear(); - for (int i = 0; i < numberOfPlayers; i++) { - String output = String.format("Player %d (%d cards)", i, players[i].cardsCount()); - Card card = players[i].draw(); - draws.add(card); - Out.println(String.format("%s: %d - %s", output, card.number, card.suit)); - } - processWinner(); + Player player = new Player(String.valueOf(i), deck.take(cardsPerPlayer)); + players.add(player); } + players.play(); } - private void processWinner() { - int maxIndex = 0; - Card max = draws.get(maxIndex); - for (int i = 1; i < numberOfPlayers; i++) { - if (max.number < draws.get(i).number) { - maxIndex = i; - max = draws.get(maxIndex); - } - } - pot.addAll(draws); - if (draws.uniqueMaximum(max, maxIndex)) { - Out.println(String.format("Player %d wins this round", maxIndex)); - players[maxIndex].discardPile.addAll(pot); - pot.clear(); - } else { - Out.println("No winner in this round"); - } - Out.println(); - } - private boolean noWinner() { - ArrayList activePlayers = new ArrayList<>(); - for (Player player : players) { - if (player.cardsCount() > 0) { - activePlayers.add(player); - } - } - if (activePlayers.size() == 1) { - Out.println(String.format("Player %s wins the game!", activePlayers.get(0).name)); - return false; - } - return true; - } } diff --git a/src/GameTest.java b/src/GameTest.java index 5869ef3..82b7319 100644 --- a/src/GameTest.java +++ b/src/GameTest.java @@ -15,14 +15,14 @@ class GameTest { @Test void createDeck() { - assertEquals(2, game.players.length); + assertEquals(2, game.players.size()); for (int i = 0; i < 2; i++) { - assertEquals(20, game.players[i].drawPile.size()); + assertEquals(20, game.players.get(i).drawPile.size()); } } @Test void play() { - game.play(); + game.players.play(); } } \ No newline at end of file diff --git a/src/Main.java b/src/Main.java index 318b29f..6b0c323 100644 --- a/src/Main.java +++ b/src/Main.java @@ -4,8 +4,7 @@ public class Main { public static void main(String[] args) { - Game game = new Game(10, 2); - game.play(); + new Game(10, 2); System.out.print(Out.get()); } } diff --git a/src/Pile.java b/src/Pile.java index 4aa9595..0a4eb40 100644 --- a/src/Pile.java +++ b/src/Pile.java @@ -1,6 +1,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Random; +import java.util.stream.IntStream; public class Pile extends ArrayList { public static Pile createDeck(int numberOfCards) { @@ -38,12 +39,17 @@ public class Pile extends ArrayList { shuffle(random); } - public boolean uniqueMaximum(Card max, int maxIndex) { - for (int i = 0; i < this.size(); i++) { - if (maxIndex != i && max.number == this.get(i).number) { - return false; + public long occurrences(int max) { + return IntStream.range(0, size()).filter(i -> get(i).number == max).count(); + } + + public Card getMax() { + Card max = get(0); + for (int i = 1; i < this.size(); i++) { + if (max.number < get(i).number) { + max = get(i); } } - return true; + return max; } } diff --git a/src/Players.java b/src/Players.java new file mode 100644 index 0000000..f9b17a1 --- /dev/null +++ b/src/Players.java @@ -0,0 +1,43 @@ +import java.util.ArrayList; + +public class Players extends ArrayList { + private final Pile pot = new Pile(); + private final Pile draws = new Pile(); + + public void play() { + while (playersLeft() != 1) { + draws.clear(); + for (int i = 0; i < this.size(); i++) { + String output = String.format("Player %d (%d cards)", i, this.get(i).cardsCount()); + Card card = this.get(i).draw(); + draws.add(card); + Out.println(String.format("%s: %d - %s", output, card.number, card.suit)); + } + pot.addAll(draws); + givePotToWinner(); + } + Out.println(String.format("Player %s wins the game!", get(0).name)); + } + + private int playersLeft() { + for (int i = size() - 1; i >= 0; i--) { + if (get(i).cardsCount() == 0) { + remove(i); + } + } + return size(); + } + + private void givePotToWinner() { + Card max = draws.getMax(); + if (draws.occurrences(max.number) == 1) { + int maxIndex = draws.indexOf(max); + Out.println(String.format("Player %d wins this round", maxIndex)); + this.get(maxIndex).discardPile.addAll(pot); + pot.clear(); + } else { + Out.println("No winner in this round"); + } + Out.println(); + } +}