|
|
|
|
@ -3,78 +3,61 @@ import java.util.ArrayList;
|
|
|
|
|
public class CardGame {
|
|
|
|
|
public Player[] players;
|
|
|
|
|
Pile pot = new Pile();
|
|
|
|
|
Card[] draws;
|
|
|
|
|
Pile draws = new Pile();
|
|
|
|
|
int numberOfPlayers;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param numberOfCards
|
|
|
|
|
* @param numberOfPlayers
|
|
|
|
|
* @param numberOfCards Total number of cards
|
|
|
|
|
* @param numberOfPlayers Total number of players
|
|
|
|
|
*/
|
|
|
|
|
public CardGame(int numberOfCards, int numberOfPlayers) {
|
|
|
|
|
Pile deck = createDeck(numberOfCards);
|
|
|
|
|
deck.shuffle();
|
|
|
|
|
Pile deck = Pile.createDeck(numberOfCards);
|
|
|
|
|
createPlayersWithCards(numberOfPlayers, deck);
|
|
|
|
|
this.numberOfPlayers = numberOfPlayers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void createPlayersWithCards(int numberOfPlayers, Pile deck) {
|
|
|
|
|
this.players = new Player[numberOfPlayers];
|
|
|
|
|
draws = new Card[numberOfPlayers];
|
|
|
|
|
int cardsPerPlayer = deck.size() / numberOfPlayers;
|
|
|
|
|
for (int i = 0; i < numberOfPlayers; i++) {
|
|
|
|
|
players[i] = new Player(String.valueOf(i), deck.getCardsForPlayer(cardsPerPlayer));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Pile createDeck(int numberOfCards) {
|
|
|
|
|
Pile deck = new Pile();
|
|
|
|
|
for (int number = 1; number <= numberOfCards; number++) {
|
|
|
|
|
for (Card.Suit suit: Card.Suit.values()) {
|
|
|
|
|
deck.add(new Card(number, suit));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return deck;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void play() {
|
|
|
|
|
while (noWinner()) {
|
|
|
|
|
for (int i = 0; i < draws.length; i++) {
|
|
|
|
|
if (players[i].cardsCount() > 0) {
|
|
|
|
|
draws.clear();
|
|
|
|
|
for (int i = 0; i < numberOfPlayers; i++) {
|
|
|
|
|
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);
|
|
|
|
|
pot.add(draws[i]);
|
|
|
|
|
} else {
|
|
|
|
|
System.out.printf("Player %d broke!", i);
|
|
|
|
|
}
|
|
|
|
|
Card card = players[i].draw();
|
|
|
|
|
draws.add(card);
|
|
|
|
|
System.out.printf("%d - %s%n", card.number, card.suit);
|
|
|
|
|
}
|
|
|
|
|
processWinner(draws);
|
|
|
|
|
processWinner();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void processWinner(Card[] drawn) {
|
|
|
|
|
private void processWinner() {
|
|
|
|
|
int maxIndex = 0;
|
|
|
|
|
Card max = drawn[maxIndex];
|
|
|
|
|
for (int i = 1; i < drawn.length; i++) {
|
|
|
|
|
if (max.number < drawn[i].number) {
|
|
|
|
|
Card max = draws.get(maxIndex);
|
|
|
|
|
for (int i = 1; i < numberOfPlayers; i++) {
|
|
|
|
|
if (max.number < draws.get(i).number) {
|
|
|
|
|
maxIndex = i;
|
|
|
|
|
max = drawn[maxIndex];
|
|
|
|
|
max = draws.get(maxIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (uniqueMaximum(drawn, max, maxIndex)) {
|
|
|
|
|
System.out.printf("Player %d wins this round\n\n", maxIndex);
|
|
|
|
|
pot.addAll(draws);
|
|
|
|
|
if (draws.uniqueMaximum(max, maxIndex)) {
|
|
|
|
|
System.out.printf("Player %d wins this round%n%n", maxIndex);
|
|
|
|
|
players[maxIndex].discardPile.addAll(pot);
|
|
|
|
|
pot.clear();
|
|
|
|
|
} else {
|
|
|
|
|
System.out.printf("No winner in this round\n\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean uniqueMaximum(Card[] draws, Card max, int maxIndex) {
|
|
|
|
|
for (int i = 0; i < draws.length; i++) {
|
|
|
|
|
if (maxIndex != i && max.number == draws[i].number) {
|
|
|
|
|
return false;
|
|
|
|
|
System.out.println("No winner in this round%n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean noWinner() {
|
|
|
|
|
ArrayList<Player> activePlayers = new ArrayList<Player>();
|
|
|
|
|
ArrayList<Player> activePlayers = new ArrayList<>();
|
|
|
|
|
for (int i = 0; i < players.length; i++) {
|
|
|
|
|
if (players[i].cardsCount() > 0) {
|
|
|
|
|
activePlayers.add(players[i]);
|
|
|
|
|
|