From 6cd8f4cfa7849c0027817b23bb9c5d7c0c9f4286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sas=CC=8Ca=20Kocic=CC=81?= Date: Thu, 18 Jun 2020 19:19:21 +0200 Subject: [PATCH] Implemented Fisher-Yates shuffle() --- src/CardGame.java | 30 ++++++++++++++++++++---------- src/CardGameTest.java | 2 +- src/Pile.java | 20 -------------------- src/Player.java | 20 ++------------------ 4 files changed, 23 insertions(+), 49 deletions(-) diff --git a/src/CardGame.java b/src/CardGame.java index e5f9001..d8b53b7 100644 --- a/src/CardGame.java +++ b/src/CardGame.java @@ -1,9 +1,7 @@ import java.util.ArrayList; +import java.util.Collections; import java.util.Random; -import static java.util.Collections.shuffle; -//import org-apache-commons-lang3.ArrayUtils; - public class CardGame { public Player[] players; Pile pot; @@ -15,21 +13,21 @@ public class CardGame { */ public CardGame(int numberOfCards, int numberOfPlayers) { Pile deck = createDeck(numberOfCards); - shuffle(deck, new Random()); + shuffleArray(deck); this.players = new Player[numberOfPlayers]; draws = new Card[numberOfPlayers]; - int deckCount = deck.count(); + int cardsPerPlayer = deck.size() / numberOfPlayers; for (int i = 0; i < numberOfPlayers; i++) { - players[i] = new Player(String.valueOf(i), deck.getCardsForPlayer(deckCount / numberOfPlayers)); + players[i] = new Player(String.valueOf(i), deck.getCardsForPlayer(cardsPerPlayer)); } pot = new Pile(); } public Pile createDeck(int numberOfCards) { Pile deck = new Pile(); - for (int number = 0; number < numberOfCards; number++) { + for (int number = 1; number <= numberOfCards; number++) { for (Card.Suit suit: Card.Suit.values()) { - deck.add(new Card(number + 1, suit)); + deck.add(new Card(number, suit)); } } return deck; @@ -43,7 +41,7 @@ public class CardGame { private void round() { for (int i = 0; i < draws.length; i++) { - if (!players[i].broke()) { + if (players[i].cardsCount() > 0) { System.out.printf("Player %d (%d cards): ", i, players[i].cardsCount()); draws[i] = players[i].draw(); System.out.printf("%d - %s\n", draws[i].number, draws[i].suit); @@ -53,7 +51,6 @@ public class CardGame { } } processWinner(draws); - } private void processWinner(Card[] drawn) { @@ -85,4 +82,17 @@ public class CardGame { } return true; } + + /** + * Fisher-Yates shuffle() + * https://stackoverflow.com/questions/1519736/random-shuffling-of-an-array + */ + private static void shuffleArray(Pile pile) + { + Random random = new Random(); + for (int i = pile.size() - 1; i > 0; i--) + { + Collections.swap(pile, i, random.nextInt(i + 1)); + } + } } diff --git a/src/CardGameTest.java b/src/CardGameTest.java index 9c3b46a..75d515c 100644 --- a/src/CardGameTest.java +++ b/src/CardGameTest.java @@ -16,7 +16,7 @@ class CardGameTest { void createDeck() { assertEquals(2, cardGame.players.length); for (int i = 0; i < 2; i++) { - assertEquals(20, cardGame.players[i].drawPile.count()); + assertEquals(20, cardGame.players[i].drawPile.size()); } } diff --git a/src/Pile.java b/src/Pile.java index e42b692..e1c1d99 100644 --- a/src/Pile.java +++ b/src/Pile.java @@ -1,27 +1,11 @@ import java.util.ArrayList; public class Pile extends ArrayList { -// ArrayList pile = new ArrayList(); - -// public Boolean isEmpty() { -// return pile.isEmpty(); -// } -// -// public void shuffle() { -// } -// - public void takeDiscarded() { - } - public void addAll(Card[] cards) { for(Card card: cards) add(card); } - public int count() { - return size(); - } - public Pile getCardsForPlayer(int number) { Pile cardsForPlayer = new Pile(); for (int i = 0; i < number; i++) { @@ -30,8 +14,4 @@ public class Pile extends ArrayList { } return cardsForPlayer; } - -// public void add(Card card) { -// pile.add(card); -// } } diff --git a/src/Player.java b/src/Player.java index 75b9335..0e4744e 100644 --- a/src/Player.java +++ b/src/Player.java @@ -21,14 +21,6 @@ public class Player { return discardPile; } - public void setDrawPile(Pile drawPile) { - this.drawPile = drawPile; - } - - public void setDiscardPile(Pile discardPile) { - this.discardPile = discardPile; - } - public Card draw() throws NoMoreCardsException { if (getDrawPile().isEmpty()) { if (getDiscardPile().isEmpty()) { @@ -38,7 +30,7 @@ public class Player { drawPile.addAll(discardPile); discardPile.clear(); } - if (drawPile.count() > 0) { + if (drawPile.size() > 0) { Card draw = drawPile.get(0); drawPile.remove(0); return draw; @@ -46,15 +38,7 @@ public class Player { return null; } - public boolean broke() { - return drawPile.isEmpty() && discardPile.isEmpty(); - } - - public void addPot(Card[] draws) { - discardPile.addAll(draws); - } - public int cardsCount() { - return drawPile.count() + discardPile.count(); + return drawPile.size() + discardPile.size(); } }