import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
public class Poker {
private static final int HAND_SIZE = 5;
private static final int IDX_HIGH_PAIR = 0;
private static final int IDX_LOW_PAIR = 1;
private static final int IDX_HIGHCARD = 2;
private static final int PLAYERONE = 1;
private static final int PLAYERTWO = 2;
private static final int SPLIT = 0;
private static Card[] playerOne = new Card[HAND_SIZE];
private static Card[] playerTwo = new Card[HAND_SIZE];
public boolean legalHands(Card cardOnePlayerOne, Card cardTwoPlayerOne,
Card cardThreePlayerOne, Card cardFourPlayerOne,
Card cardFivePlayerOne, Card cardOnePlayerTwo,
Card cardTwoPlayerTwo, Card cardThreePlayerTwo,
Card cardFourPlayerTwo, Card cardFivePlayerTwo) {
Set<Card> testSet = new HashSet<Card>();
testSet.add(cardOnePlayerOne);
testSet.add(cardTwoPlayerOne);
testSet.add(cardThreePlayerOne);
testSet.add(cardFourPlayerOne);
testSet.add(cardFivePlayerOne);
testSet.add(cardOnePlayerTwo);
testSet.add(cardTwoPlayerTwo);
testSet.add(cardThreePlayerTwo);
testSet.add(cardFourPlayerTwo);
testSet.add(cardFivePlayerTwo);
return testSet.size() == 10;
}
public void generateHands() {
Random random = new Random();
do {
for (int i = 0; i < HAND_SIZE; i++) {
playerOne[i] = new Card(random.nextInt(13) + 2,
random.nextInt(4));
playerTwo[i] = new Card(random.nextInt(13) + 2,
random.nextInt(4));
}
} while (!legalHands(playerOne[0], playerOne[1], playerOne[2],
playerOne[3], playerOne[4], playerTwo[0], playerTwo[1],
playerTwo[2], playerTwo[3], playerTwo[4]));
}
public boolean legalCard(Card card) {
return card.getColor() >= 0 && card.getColor() <= 3
&& card.getValue() >= 2 && card.getValue() <= 14;
}
public int calculateWinningHandReduced(Card cardOnePlayerOne,
Card cardTwoPlayerOne, Card cardThreePlayerOne,
Card cardFourPlayerOne, Card cardFivePlayerOne,
Card cardOnePlayerTwo, Card cardTwoPlayerTwo,
Card cardThreePlayerTwo, Card cardFourPlayerTwo,
Card cardFivePlayerTwo) {
int[] resPlayerOne = getResult(cardOnePlayerOne, cardTwoPlayerOne,
cardThreePlayerOne, cardFourPlayerOne, cardFivePlayerOne);
int[] resPlayerTwo = getResult(cardOnePlayerTwo, cardTwoPlayerTwo,
cardThreePlayerTwo, cardFourPlayerTwo, cardFivePlayerTwo);
int critHighPair = compare(resPlayerOne[IDX_HIGH_PAIR],
resPlayerTwo[IDX_HIGH_PAIR]);
if (critHighPair == SPLIT) {
int critLowPair = compare(resPlayerOne[IDX_LOW_PAIR],
resPlayerTwo[IDX_LOW_PAIR]);
if (critLowPair == SPLIT) {
return compare(resPlayerOne[IDX_HIGHCARD],
resPlayerTwo[IDX_HIGHCARD]);
} else {
return critLowPair;
}
} else {
return critHighPair;
}
}
private int compare(int playerOne, int playerTwo) {
if (playerOne == playerTwo) {
return SPLIT;
}
return playerOne > playerTwo ? PLAYERONE : PLAYERTWO;
}
private int[] getResult(Card... cards) {
int maxPair = 0, minPair = 0, highCard = 0;
for (int testValue = 14; testValue > 1; testValue--) {
boolean found = false;
for (Card card : cards) {
if (card.getValue() == testValue)
if (highCard == 0) {
highCard = testValue;
if (found) {
if (maxPair == 0) {
maxPair = testValue;
} else if (minPair == 0) {
minPair = testValue;
}
if (highCard == testValue) {
highCard = 0;
}
} else {
found = true;
}
}
}
}
return new int[] { maxPair, minPair, highCard };
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Poker poker = new Poker();
System.out.println("Wollen Sie die Karten");
System.out.println("\t1) Manuell eingeben");
System.out.println("\t2) Automatisch generieren");
System.out.print(">");
int option = scanner.nextInt();
if (option == 1) {
cardInput(scanner, poker, "Spieler 1", playerOne);
cardInput(scanner, poker, "Spieler 2", playerTwo);
if (!poker.legalHands(playerOne[0], playerOne[1], playerOne[2],
playerOne[3], playerOne[4], playerTwo[0], playerTwo[1],
playerTwo[2], playerTwo[3], playerTwo[4])) {
System.out
.println("Ungültge Eingabe. Das Programm wird beendet.");
System.exit(3);
}
} else if (option == 2) {
poker.generateHands();
} else {
System.out.println("Ungültge Eingabe. Das Programm wird beendet.");
System.exit(1);
}
System.out.println("\nDie Karten von Spieler 1:");
for (Card card : playerOne) {
System.out.println("\t" + card);
}
System.out.println("\nDie Karten von Spieler 2:");
for (Card card : playerTwo) {
System.out.println("\t" + card);
}
int winner = poker.calculateWinningHandReduced(playerOne[0],
playerOne[1], playerOne[2], playerOne[3], playerOne[4],
playerTwo[0], playerTwo[1], playerTwo[2], playerTwo[3],
playerTwo[4]);
if (winner == SPLIT) {
System.out.println("Splitpot!!!");
} else {
System.out.println("\nSpieler " + winner + " hat gewonnen!!!");
}
}
private static void cardInput(Scanner scanner, Poker poker, String player,
Card[] deck) {
for (int i = 0; i < 5; i++) {
System.out.println("\nEingabe der " + (i + 1) + ". Karte von "
+ player);
System.out.print("\tBitte geben Sie eine " + "Farbe (0 - 3) ein >");
int color = scanner.nextInt();
System.out.print("\tBitte geben Sie einen einen "
+ "Wert (2 - 14) ein >");
int value = scanner.nextInt();
playerOne[i] = new Card(value, color);
if (poker.legalCard(deck[i])) {
System.out.println("\t" + deck[i] + " hinzugefügt");
} else {
System.out
.println("Ungültge Eingabe. Das Programm wird beendet.");
System.exit(2);
}
}
}
}
class Card {
private int value, color;
public Card(int value, int color) {
super();
this.value = value;
this.color = color;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
@Override
public String toString() {
String text = "error";
switch (color) {
case 0:
text = "Kreuz ";
break;
case 1:
text = "Pik ";
break;
case 2:
text = "Herz ";
break;
case 3:
text = "Karo ";
break;
}
if (value < 11) {
text += value;
} else {
switch (value) {
case 11:
text += "Bube";
break;
case 12:
text += "Dame";
break;
case 13:
text += "König";
break;
case 14:
text += "Ass";
break;
}
}
return text;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof Card)) {
return false;
}
Card otherCard = (Card) other;
return getColor() == otherCard.getColor()
&& getValue() == otherCard.getValue();
}
}