Implemented Fisher-Yates shuffle()

master
Saša Kocić 6 years ago
parent 85ab159d53
commit 6cd8f4cfa7

@ -1,9 +1,7 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Random; import java.util.Random;
import static java.util.Collections.shuffle;
//import org-apache-commons-lang3.ArrayUtils;
public class CardGame { public class CardGame {
public Player[] players; public Player[] players;
Pile pot; Pile pot;
@ -15,21 +13,21 @@ public class CardGame {
*/ */
public CardGame(int numberOfCards, int numberOfPlayers) { public CardGame(int numberOfCards, int numberOfPlayers) {
Pile deck = createDeck(numberOfCards); Pile deck = createDeck(numberOfCards);
shuffle(deck, new Random()); shuffleArray(deck);
this.players = new Player[numberOfPlayers]; this.players = new Player[numberOfPlayers];
draws = new Card[numberOfPlayers]; draws = new Card[numberOfPlayers];
int deckCount = deck.count(); int cardsPerPlayer = deck.size() / numberOfPlayers;
for (int i = 0; i < numberOfPlayers; i++) { 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(); pot = new Pile();
} }
public Pile createDeck(int numberOfCards) { public Pile createDeck(int numberOfCards) {
Pile deck = new Pile(); 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()) { for (Card.Suit suit: Card.Suit.values()) {
deck.add(new Card(number + 1, suit)); deck.add(new Card(number, suit));
} }
} }
return deck; return deck;
@ -43,7 +41,7 @@ public class CardGame {
private void round() { private void round() {
for (int i = 0; i < draws.length; i++) { 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()); System.out.printf("Player %d (%d cards): ", i, players[i].cardsCount());
draws[i] = players[i].draw(); draws[i] = players[i].draw();
System.out.printf("%d - %s\n", draws[i].number, draws[i].suit); System.out.printf("%d - %s\n", draws[i].number, draws[i].suit);
@ -53,7 +51,6 @@ public class CardGame {
} }
} }
processWinner(draws); processWinner(draws);
} }
private void processWinner(Card[] drawn) { private void processWinner(Card[] drawn) {
@ -85,4 +82,17 @@ public class CardGame {
} }
return true; 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));
}
}
} }

@ -16,7 +16,7 @@ class CardGameTest {
void createDeck() { void createDeck() {
assertEquals(2, cardGame.players.length); assertEquals(2, cardGame.players.length);
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
assertEquals(20, cardGame.players[i].drawPile.count()); assertEquals(20, cardGame.players[i].drawPile.size());
} }
} }

@ -1,27 +1,11 @@
import java.util.ArrayList; import java.util.ArrayList;
public class Pile extends ArrayList<Card> { public class Pile extends ArrayList<Card> {
// ArrayList<Card> pile = new ArrayList<Card>();
// public Boolean isEmpty() {
// return pile.isEmpty();
// }
//
// public void shuffle() {
// }
//
public void takeDiscarded() {
}
public void addAll(Card[] cards) { public void addAll(Card[] cards) {
for(Card card: cards) for(Card card: cards)
add(card); add(card);
} }
public int count() {
return size();
}
public Pile getCardsForPlayer(int number) { public Pile getCardsForPlayer(int number) {
Pile cardsForPlayer = new Pile(); Pile cardsForPlayer = new Pile();
for (int i = 0; i < number; i++) { for (int i = 0; i < number; i++) {
@ -30,8 +14,4 @@ public class Pile extends ArrayList<Card> {
} }
return cardsForPlayer; return cardsForPlayer;
} }
// public void add(Card card) {
// pile.add(card);
// }
} }

@ -21,14 +21,6 @@ public class Player {
return discardPile; return discardPile;
} }
public void setDrawPile(Pile drawPile) {
this.drawPile = drawPile;
}
public void setDiscardPile(Pile discardPile) {
this.discardPile = discardPile;
}
public Card draw() throws NoMoreCardsException { public Card draw() throws NoMoreCardsException {
if (getDrawPile().isEmpty()) { if (getDrawPile().isEmpty()) {
if (getDiscardPile().isEmpty()) { if (getDiscardPile().isEmpty()) {
@ -38,7 +30,7 @@ public class Player {
drawPile.addAll(discardPile); drawPile.addAll(discardPile);
discardPile.clear(); discardPile.clear();
} }
if (drawPile.count() > 0) { if (drawPile.size() > 0) {
Card draw = drawPile.get(0); Card draw = drawPile.get(0);
drawPile.remove(0); drawPile.remove(0);
return draw; return draw;
@ -46,15 +38,7 @@ public class Player {
return null; return null;
} }
public boolean broke() {
return drawPile.isEmpty() && discardPile.isEmpty();
}
public void addPot(Card[] draws) {
discardPile.addAll(draws);
}
public int cardsCount() { public int cardsCount() {
return drawPile.count() + discardPile.count(); return drawPile.size() + discardPile.size();
} }
} }

Loading…
Cancel
Save