diff --git a/README.md b/README.md index 003db037a..ebea473d3 100644 --- a/README.md +++ b/README.md @@ -74,3 +74,21 @@ jason: 패 - 기능을 구현하기 전에 java-baseball/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다. - Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다. - 커밋 메시지 [컨벤션 가이드](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)를 참고해 커밋 메시지를 작성한다. + +## 구현할 기능 목록 +-[x] 게임에 참여할 사람의 이름 입력받기 +-[ ] 딜러와 플레이어들에게 카드 나누기 + -[ ] 딜러는 카드 1장씩, 플레이어는 2장씩 나누기 +-[x] 한장의 카드를 더 부여받을지 구현 + -[ ] 딜러카드 숫자 계산 시 에이스 카드는 11로 계산 +-[x] 결과 계산 및 출력 +-[x] 최종 승패 계산 및 출력 + -[x] 딜러와 플레이어와 숫자 비교하여 딜러 승패 계산 + -[x] 플레이어 숫자를 딜러와 다른 플레이어와 비교하여 계산 +-[ ] 에러 처리 + -[ ] 사용자가 y, n 이외에 다른 입력을 했을시 + -[ ] 에이스카드 1 or 11 처리 + -[ ] 카드 중복처리 + -[ ] 결과 숫자가 21을 넘을경우 패 처리 +-[ ] mvc 패턴으로 변경 +-[ ] 기능별 test 코드 추가 \ No newline at end of file diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 000000000..db3d9e258 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,17 @@ +import controller.BlackJackGame; +import model.Dealer; +import model.Player; +import model.PlayerList; +import view.InputView; +import view.OutputView; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Application { + public static void main(String[] args) { + BlackJackGame.start(); + } +} diff --git a/src/main/java/controller/BlackJackGame.java b/src/main/java/controller/BlackJackGame.java new file mode 100644 index 000000000..612e5fc9f --- /dev/null +++ b/src/main/java/controller/BlackJackGame.java @@ -0,0 +1,127 @@ +package controller; + +import model.Dealer; +import model.Player; +import model.PlayerList; +import view.InputView; +import view.OutputView; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class BlackJackGame { + + public static void start() { + List players = inputPlayer(); + PlayerList playerList = new PlayerList(players); + Dealer dealer = new Dealer(); + assignCard(dealer, playerList); + drawCard(playerList, dealer); + OutputView.printResultSum(dealer, playerList); + getFinalWinLose(dealer, playerList); + } + + private static List inputPlayer() { + OutputView.printInputPlayerNameMessage(); + String playerNames = InputView.inputPlayerName(); + List playerNameList = Arrays.asList(playerNames.split(",")); + return playerNameList.stream() + .map(Player::new) + .collect(Collectors.toList()); + } + + private static void assignCard(Dealer dealer, PlayerList playerList) { + OutputView.printCardAssignment(playerList); + OutputView.printDealerAndPlayerCard(dealer, playerList); + } + + private static void drawCard(PlayerList playerList, Dealer dealer) { + for (Player player : playerList.getPlayerList()) { + drawPlayerCard(player); + } + drawDealerCard(dealer); + } + + private static void drawPlayerCard(Player player) { + while (true) { + OutputView.printDrawPlayerCardMessage(player); + String playerInput = InputView.inputPlayerMoreCard(); + if (playerInput.equals("y")) { + player.getCardList().addCard(); + } + OutputView.printPlayerCard(player); + if (playerInput.equals("n")) { + break; + } + } + } + + private static void drawDealerCard(Dealer dealer) { + if (dealer.getCardList().getSum() > 16) { + OutputView.printNotDrawDealerCardMessage(); + } + if (dealer.getCardList().getSum() <= 16) { + OutputView.printDrawDealerCardMessage(); + dealer.getCardList().addCard(); + } + } + + private static void getFinalWinLose(Dealer dealer, PlayerList playerList) { + calculateDealerWinLose(dealer, playerList); + calculatePlayerWinLose(dealer, playerList); + } + + private static void calculateDealerWinLose(Dealer dealer, PlayerList playerList) { + int dealerWin = 0; + int dealerLose = 0; + int dealerSum = dealer.getCardList().getSum(); + for (Player player : playerList.getPlayerList()) { + int playerSum = player.getCardList().getSum(); + dealerWin = getDealerWin(dealerSum, playerSum, dealerWin); + dealerLose = getDealerLose(dealerSum, playerSum, dealerLose); + } + OutputView.printFinalWin(dealerWin, dealerLose); + } + + private static int getDealerWin(int dealerSum, int playerSum, int dealerWin) { + if (dealerSum > playerSum) { + dealerWin += 1; + } + return dealerWin; + } + + private static int getDealerLose(int dealerSum, int playerSum, int dealerLose) { + if (dealerSum < playerSum) { + dealerLose += 1; + } + return dealerLose; + } + + private static void calculatePlayerWinLose(Dealer dealer, PlayerList playerList) { + int dealerSum = dealer.getCardList().getSum(); + for (Player player : playerList.getPlayerList()) { + boolean isWin = false; + int playerSum = player.getCardList().getSum(); + isWin(playerList, player, dealerSum, isWin); + if (isWin && playerSum > dealerSum) { + OutputView.printFinalPlayerResult(player, isWin); + } + } + } + + private static boolean isWin(PlayerList playerList, Player player, int dealerSum, boolean isWin) { + int playerSum = player.getCardList().getSum(); + for (Player otherPlayer : playerList.getPlayerList()) { + if (playerSum < otherPlayer.getCardList().getSum() || playerSum < dealerSum) { + isWin = false; + OutputView.printFinalPlayerResult(player, isWin); + break; + } + if (playerSum > otherPlayer.getCardList().getSum()) { + isWin = true; + } + } + return isWin; + } +} diff --git a/src/main/java/model/Card.java b/src/main/java/model/Card.java new file mode 100644 index 000000000..a08516f94 --- /dev/null +++ b/src/main/java/model/Card.java @@ -0,0 +1,31 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Card { + private Type type; + private Number number; + + public Card() { + Type randomType = Type.getRandomType(); + Number randomNumber = Number.getRandomNumber(); + //객체 간 중복체크 필요 + this.type = randomType; + this.number = randomNumber; + } + + public Type getType() { + return type; + } + + public Number getNumber() { + return number; + } + + @Override + public String toString() { + return number.toString()+type.toString(); + } +} diff --git a/src/main/java/model/CardList.java b/src/main/java/model/CardList.java new file mode 100644 index 000000000..30e4f96b3 --- /dev/null +++ b/src/main/java/model/CardList.java @@ -0,0 +1,44 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class CardList { + private List cardList; + private int sum = 0; + + public CardList() { + this.cardList = initCardList(); + this.sum = calculateSum(this.cardList); + } + + public List initCardList() { + List cardList = new ArrayList<>(); + cardList.add(new Card()); + cardList.add(new Card()); + return cardList; + } + + public int calculateSum(List cardList) { + return cardList.stream() + .mapToInt(card -> card.getNumber().getRank()) + .sum(); + } + + public List getCardList() { + return cardList; + } + + public int getSum() { + return sum; + } + + public void addCard() { + cardList.add(new Card()); + updateSum(); + } + + public void updateSum() { + this.sum = calculateSum(this.cardList); + } +} diff --git a/src/main/java/model/Dealer.java b/src/main/java/model/Dealer.java new file mode 100644 index 000000000..560c4623b --- /dev/null +++ b/src/main/java/model/Dealer.java @@ -0,0 +1,25 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Dealer { + private CardList cardList; + + public Dealer() { + this.cardList = new CardList(); + } + + @Override + public String toString() { + String cards = cardList.getCardList().stream() + .map(Card::toString) + .collect(Collectors.joining(", ")); + return "딜러: " + cards; + } + + public CardList getCardList() { + return cardList; + } +} diff --git a/src/main/java/model/Number.java b/src/main/java/model/Number.java new file mode 100644 index 000000000..a497a818f --- /dev/null +++ b/src/main/java/model/Number.java @@ -0,0 +1,33 @@ +package model; + +import java.util.Random; + +public enum Number { + A(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + K(10), + Q(10), + J(10); + private int rank; + + Number(int rank) { + this.rank = rank; + } + + public int getRank() { + return rank; + } + + public static Number getRandomNumber() { + Random random = new Random(); + return values()[random.nextInt(values().length)]; + } +} diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java new file mode 100644 index 000000000..89d261165 --- /dev/null +++ b/src/main/java/model/Player.java @@ -0,0 +1,34 @@ +package model; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Player { + private String name; + private CardList cardList; + + public Player(String name) { + this.name = name; + this.cardList = new CardList(); + } + + public String getName() { + return name; + } + + public CardList getCardList() { + return cardList; + } + + /* + playerlist에 있는 메서드와 구분 필요 + */ + @Override + public String toString() { + String cards = cardList.getCardList().stream() + .map(Card::toString) + .collect(Collectors.joining(", ")); + return name + "카드: " + cards; + } +} diff --git a/src/main/java/model/PlayerList.java b/src/main/java/model/PlayerList.java new file mode 100644 index 000000000..056d50f14 --- /dev/null +++ b/src/main/java/model/PlayerList.java @@ -0,0 +1,23 @@ +package model; + +import java.util.List; +import java.util.stream.Collectors; + +public class PlayerList { + private List playerList; + + public PlayerList(List playerList) { + this.playerList = playerList; + } + + public List getPlayerList() { + return playerList; + } + + @Override + public String toString() { + return playerList.stream() + .map(Player::getName) + .collect(Collectors.joining(", ")); + } +} diff --git a/src/main/java/model/Type.java b/src/main/java/model/Type.java new file mode 100644 index 000000000..ea106e3c2 --- /dev/null +++ b/src/main/java/model/Type.java @@ -0,0 +1,13 @@ +package model; + +import java.util.Random; + +public enum Type { + + 하트, 스페이드, 다이아몬드, 클로버; + + public static Type getRandomType() { + Random random = new Random(); + return values()[random.nextInt(values().length)]; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 000000000..9e782b1f8 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,16 @@ +package view; + +import java.util.Scanner; + +public class InputView { + + public static String inputPlayerName() { + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } + + public static String inputPlayerMoreCard() { + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 000000000..73450715d --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,71 @@ +package view; + +import model.Dealer; +import model.Player; +import model.PlayerList; + +public class OutputView { + + public static void printInputPlayerNameMessage() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + } + + public static void printCardAssignment(PlayerList playerList) { + System.out.println("딜러와 " + playerList.toString() + "에게 2장을 나누었습니다."); + } + + public static void printDealerAndPlayerCard(Dealer dealer, PlayerList playerList) { + System.out.println(dealer); + for (Player player : playerList.getPlayerList()) { + System.out.println(player); + } + System.out.println(""); + } + + public static void printDrawPlayerCardMessage(Player player) { + System.out.println(player.getName() + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + } + + public static void printPlayerCard(Player player) { + System.out.println(player); + } + + public static void printDrawDealerCardMessage() { + System.out.println("\n딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); + } + + public static void printNotDrawDealerCardMessage() { + System.out.println("\n딜러는 16초과라 카드를 뽑지 않습니다.\n"); + } + + public static void printResultSum(Dealer dealer, PlayerList playerList) { + System.out.println(dealer + " - 결과: " + dealer.getCardList().getSum()); + for (Player player : playerList.getPlayerList()) { + System.out.println(player + " - 결과: " + player.getCardList().getSum()); + } + System.out.println(""); + } + + public static void printFinalWin(int dealerWin, int dealerLose) { + System.out.println("## 최종 승패"); + if (dealerWin == 0) { + System.out.println("딜러: " + dealerLose + "패"); + } + if (dealerLose == 0) { + System.out.println("딜러: " + dealerWin + "승"); + } + if (dealerWin != 0 && dealerLose != 0) { + System.out.println("딜러: " + dealerWin + "승 " + dealerLose + "패"); + } + } + + public static void printFinalPlayerResult(Player player, boolean isWin) { + if (isWin) { + System.out.println(player.getName() + ": " + "승"); + } + if (!isWin) { + System.out.println(player.getName() + ": " + "패"); + } + } + +} diff --git a/src/test/java/.gitkeep b/src/test/java/.gitkeep deleted file mode 100644 index e69de29bb..000000000