오늘은 과제를 정말 열심히했다.
포커 게임을 간단하게 구현하는 과제다.
열심히 구현했는데 로티플 뽑고 자야겠다.
import java.util.Scanner;
import java.util.Random;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
enum Pattern {
SPADE("♠"), DIAMOND("◆"), HEART("♥"), CLUB("♣");
private String pattern;
Pattern(String pattern) {
this.pattern = pattern;
}
String getPattern() {
return this.pattern;
}
}
enum Number {
TWO("2"),
THREE("3"),
FOUR("4"),
FIVE("5"),
SIX("6"),
SEVEN("7"),
EIGHT("8"),
NINE("9"),
TEN("10"),
JACK("J"),
QUEEN("Q"),
KING("K"),
ACE("A");
private String value;
Number(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
enum Rank {
StraightFlush,
FourCard,
FullHouse,
Flush,
Straight,
Treple,
TwoPairs,
OnePairs,
HighCard;
}
class Card implements Comparable<Card> { // 카드관리
private Pattern pattern;
private Number number;
public Card(Pattern pattern, Number number) {
this.pattern = pattern;
this.number = number;
}
public Pattern getPattern() {
return this.pattern;
}
public Number getNumber() {
return this.number;
}
@Override
public int compareTo(Card o) {
if (this.getNumber().ordinal() == o.getNumber().ordinal())
return o.getPattern().ordinal() - this.getPattern().ordinal();
return this.getNumber().ordinal() - o.getNumber().ordinal();
}
@Override
public String toString() {
return this.pattern.getPattern() + " " + this.number.getValue();
}
}
class Deck { // 전체 52장관리
private boolean deckList[][];
private static Deck deck;
private Deck() {
deckList = new boolean[4][13];
}
public static Deck getInstance() {
if (deck == null) {
deck = new Deck();
}
return deck;
}
public Card draw() { // 카드 뽑기
Random random = new Random();
Pattern[] patterns = Pattern.values();
Pattern cardpattern;
Number[] numbers = Number.values();
Number cardNumber;
while (true) {
cardpattern = patterns[random.nextInt(patterns.length)];
cardNumber = numbers[random.nextInt(numbers.length)];
if (!deckList[cardpattern.ordinal()][cardNumber.ordinal()]) {
deckList[cardpattern.ordinal()][cardNumber.ordinal()] = true;
return new Card(cardpattern, cardNumber);
}
}
}
}
class Player implements Comparable<Player> {
protected String name;
protected List<Card> cardList;
protected Rank rank;
protected Card top;
Player(String name) {
this.name = name;
cardList = new ArrayList<>();
rank = Rank.HighCard;
}
@Override
public int compareTo(Player o) {
if (this.rank.ordinal() == o.rank.ordinal()) {
if (top.getNumber().ordinal() == o.top.getNumber().ordinal()) {
return top.getPattern().ordinal() - o.top.getPattern().ordinal();
}
return o.top.getNumber().ordinal() - top.getNumber().ordinal();
}
return this.rank.ordinal() - o.rank.ordinal();
}
String getName() {
return this.name;
}
void addCard(Card card) {
cardList.add(card);
}
void sortCard() {
Collections.sort(cardList);
this.top = cardList.get(4);
}
boolean isStraight() {
for (int i = 0; i < 3; i++) {
if (cardList.get(i).getNumber().ordinal() + 1 != cardList.get(i + 1).getNumber().ordinal())
return false;
}
Number lastValue = cardList.get(4).getNumber();
if (cardList.get(0).getNumber().getValue() == "2" && lastValue.getValue() == "A") {
this.top = cardList.get(3);
return true;
} else if (lastValue.ordinal() == cardList.get(3).getNumber().ordinal() + 1) {
this.top = cardList.get(4);
return true;
}
return false;
}
boolean isFlush() {
for (int i = 1; i < cardList.size(); i++) {
if (cardList.get(0).getPattern() != cardList.get(i).getPattern())
return false;
}
this.top = cardList.get(4);
return true;
}
boolean isPair(Card card1, Card card2) {
return card1.getNumber() == card2.getNumber();
}
boolean isTreple(Card card1, Card card2, Card card3) {
return isPair(card1, card2) && isPair(card2, card3);
}
boolean isFour(Card card1, Card card2, Card card3, Card card4) {
return isTreple(card1, card2, card3) && isPair(card3, card4);
}
boolean isFullHouse() {
if (isTreple(cardList.get(0), cardList.get(1), cardList.get(2))
&& isPair(cardList.get(3), cardList.get(4))) {
this.top = cardList.get(2);
return true;
} else if (isTreple(cardList.get(4), cardList.get(3), cardList.get(2))
&& isPair(cardList.get(1), cardList.get(0))) {
this.top = cardList.get(4);
return true;
}
return false;
}
boolean isFourCard() {
if (isFour(cardList.get(0), cardList.get(1), cardList.get(2), cardList.get(3))) {
this.top = cardList.get(3);
return true;
} else if (isFour(cardList.get(1), cardList.get(2), cardList.get(3), cardList.get(4))) {
this.top = cardList.get(4);
return true;
}
return false;
}
boolean isTrepleCard() {
if (isTreple(cardList.get(0), cardList.get(1), cardList.get(2))) {
this.top = cardList.get(2);
return true;
} else if (isTreple(cardList.get(1), cardList.get(2), cardList.get(3))) {
this.top = cardList.get(3);
return true;
} else if (isTreple(cardList.get(2), cardList.get(3), cardList.get(4))) {
this.top = cardList.get(4);
return true;
}
return false;
}
int PairCount() {
int count = 0;
for (int i = 0; i < cardList.size() - 1; i++) {
if (isPair(cardList.get(i), cardList.get(i + 1))) {
this.top = cardList.get(i + 1);
count++;
}
}
return count;
}
boolean isTwoPair() {
return PairCount() == 2;
}
boolean isOnePair() {
return PairCount() == 1;
}
void printCard() {
System.out.println("Player: " + this.name + "\n" + rank.name() + " " + top);
for (Card card : cardList) {
System.out.print(card + " ");
}
System.out.println();
}
void rankHands() {
if (isFlush() && isStraight()) {
this.rank = Rank.StraightFlush;
} else if (isFourCard()) {
this.rank = Rank.FourCard;
} else if (isFullHouse()) {
this.rank = Rank.FullHouse;
} else if (isFlush()) {
this.rank = Rank.Flush;
} else if (isStraight()) {
this.rank = Rank.Straight;
} else if (isTrepleCard()) {
this.rank = Rank.Treple;
} else if (isTwoPair()) {
this.rank = Rank.TwoPairs;
} else if (isOnePair()) {
this.rank = Rank.OnePairs;
} else
this.rank = Rank.HighCard;
}
}
public class JBGW08_006_Poker {
public static void GameStart(List<Player> players) {
Deck deck = Deck.getInstance();
for (int i = 0; i < 5; i++) {
for (Player player : players) {
player.addCard(deck.draw());
}
}
for (Player player : players) {
player.sortCard();
player.rankHands();
}
Collections.sort(players);
for (Player player : players) {
player.printCard();
System.out.println();
}
System.out.print("Winner : " + players.get(0).getName());
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Player[] palyerlist = {
new Player("Stive"),
new Player("Mama"),
new Player("Choco"),
new Player("Jimmy")
};
System.out.print("플레이어가 몇 명 인가요? (2 ~ 5명 ) : ");
int numberOfPlayer = sc.nextInt();
if (numberOfPlayer < 2 || numberOfPlayer > 5) {
throw new IllegalArgumentException("2 ~ 5명만 가능합니다.");
}
System.out.print("사용자의 이름을 입력해주세요 : ");
String username = sc.next();
List<Player> players = new ArrayList<>();
players.add(new Player(username));
for (int i = 1; i < numberOfPlayer; i++) {
players.add(palyerlist[i - 1]);
}
GameStart(players);
}
}