diff --git a/BACKJAC_README.md b/BACKJAC_README.md new file mode 100644 index 00000000..e738a2fc --- /dev/null +++ b/BACKJAC_README.md @@ -0,0 +1,38 @@ +블랙잭 게임을 변형한 프로그램을 구현한다. + +블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +- 카드 덱 +♠♥♦♣ 네 수트(문양) +A, 2, 3, 4, 5, 6, 7, 8, 9, 10 + 잭(J, Jack), 퀸(Q, Queen), 킹(K, King) 메이저 카드 = 52장 + 조커 2장 = 54장 + +- Deck +1. spadeCard = 13장 + 조커 1장 [v] + - cardlist +2. heartCard = 13장 + 조커 1장 [v] + - cardlist +3. diamondCard = 13장 [v] + - cardlist +4. cloverCard = 13장 [v] + - cardlist + +- 셔플기능 [v] + +- player +1. UserA [v] +2. UserB [v] +3. dealer [v] + +- 10000 -> 1칩이라고 가정 + +1. 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다. +2. 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. [v] +3. 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. +4. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. +5. 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. +6. 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +7. 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. + + + + diff --git a/STREAM_README.md b/STREAM_README.md new file mode 100644 index 00000000..73a373f7 --- /dev/null +++ b/STREAM_README.md @@ -0,0 +1,5 @@ +1. 단어의 길이가 12자를 초과하는 단어를 추출한다. +2. 12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다. +3. 단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다. +4. 추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다. + diff --git a/src/main/java/nextstep/blackjac/Main.java b/src/main/java/nextstep/blackjac/Main.java new file mode 100644 index 00000000..3a53dce9 --- /dev/null +++ b/src/main/java/nextstep/blackjac/Main.java @@ -0,0 +1,13 @@ +package nextstep.blackjac; + +import nextstep.blackjac.controller.UserController; +import nextstep.blackjac.view.BlackJacView; + +public class Main { + private static UserController userController = new UserController(); + + public static void main(String[] args) { + userController.play(); + } + +} diff --git a/src/main/java/nextstep/blackjac/card/Card.java b/src/main/java/nextstep/blackjac/card/Card.java new file mode 100644 index 00000000..76182e6b --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/Card.java @@ -0,0 +1,47 @@ +package nextstep.blackjac.card; + +import java.util.*; + +public class Card { + private String cardName; + private String cardShape; + private int cardNumber; + + public Card(String cardName, String cardShape, int cardNumber) { + this.cardName = cardName; + this.cardShape = cardShape; + this.cardNumber = cardNumber; + } + + public Card(String cardName, String cardShape) { + this.cardName = cardName; + this.cardShape = cardShape; + } + + public Card(String cardShape, int cardNumber) { + this.cardShape = cardShape; + this.cardNumber = cardNumber; + } + + public int cardNumberTotal(Card card) { + return card.cardNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Card card = (Card) o; + return cardNumber == card.cardNumber && Objects.equals(cardName, card.cardName) && Objects.equals(cardShape, card.cardShape); + } + + @Override + public int hashCode() { + return Objects.hash(cardName, cardShape, cardNumber); + } + + @Override + public String toString() { + return cardNumber + cardShape; + } +} diff --git a/src/main/java/nextstep/blackjac/card/CardDeck.java b/src/main/java/nextstep/blackjac/card/CardDeck.java new file mode 100644 index 00000000..6a777a6b --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/CardDeck.java @@ -0,0 +1,56 @@ +package nextstep.blackjac.card; + + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CardDeck { + private SpadeCard spadeCardDeck; + private HeartCard heartCardDeck; + private DiamondCard diamondCardDeck; + private CloverCard cloverCardDeck; + private Stack cardDeck; + + public CardDeck() { + spadeCardDeck = new SpadeCard("spade"); + heartCardDeck = new HeartCard("heart"); + diamondCardDeck = new DiamondCard("diamond"); + cloverCardDeck = new CloverCard("clover"); + } + + public void shuffle() { + List cardDeck = concat(); + Collections.shuffle(cardDeck); + cardDeck = createDeck(cardDeck); + } + + private List concat() { + cardShuffle(); + List shuffleSpadeCardDeck = spadeCardDeck.getCardList(); + List shuffleHeartCardDeck = heartCardDeck.getCardList(); + List shuffleDiamondCardDeck = diamondCardDeck.getCardList(); + List shuffleCloverCardDeck = cloverCardDeck.getCardList(); + + return Stream.of(shuffleSpadeCardDeck, shuffleHeartCardDeck, shuffleDiamondCardDeck, shuffleCloverCardDeck) + .flatMap(List::stream) + .collect(Collectors.toList()); + } + + private void cardShuffle() { + spadeCardDeck.shuffle(); + heartCardDeck.shuffle(); + diamondCardDeck.shuffle(); + cloverCardDeck.shuffle(); + } + + private Stack createDeck(List shuffleCard) { + cardDeck = new Stack(); + cardDeck.addAll(shuffleCard); + return cardDeck; + } + + public Stack getCardDeck() { + return cardDeck; + } +} diff --git a/src/main/java/nextstep/blackjac/card/CloverCard.java b/src/main/java/nextstep/blackjac/card/CloverCard.java new file mode 100644 index 00000000..147e6ab4 --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/CloverCard.java @@ -0,0 +1,12 @@ +package nextstep.blackjac.card; + +public class CloverCard extends Deck { + public CloverCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + + } +} diff --git a/src/main/java/nextstep/blackjac/card/Deck.java b/src/main/java/nextstep/blackjac/card/Deck.java new file mode 100644 index 00000000..7d025c05 --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/Deck.java @@ -0,0 +1,45 @@ +package nextstep.blackjac.card; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public abstract class Deck { + + protected List cardList; + protected int cardCount = 13; + protected String cardShape; + + protected Deck(String cardShape) { + this.cardShape = Optional.ofNullable(cardShape) + .orElseThrow(() -> new IllegalArgumentException("카드 모양이 잘 못 되었습니다.")); + cardList = new ArrayList<>(); + init(); + addJoker(); + } + + void init() { + cardList.add(new Card("A", cardShape, 1)); + cardList.add(new Card("2", cardShape, 2)); + cardList.add(new Card("3", cardShape, 3)); + cardList.add(new Card("4", cardShape, 4)); + cardList.add(new Card("5", cardShape, 5)); + cardList.add(new Card("6", cardShape, 6)); + cardList.add(new Card("7", cardShape, 7)); + cardList.add(new Card("8", cardShape, 8)); + cardList.add(new Card("9", cardShape, 9)); + cardList.add(new Card("10", cardShape, 10)); + cardList.add(new Card("Jack", cardShape, 10)); + cardList.add(new Card("Queen", cardShape, 10)); + cardList.add(new Card("King", cardShape, 10)); + } + + void shuffle() { + Collections.shuffle(getCardList()); + } + abstract void addJoker(); + public List getCardList() { + return cardList; + } +} diff --git a/src/main/java/nextstep/blackjac/card/DiamondCard.java b/src/main/java/nextstep/blackjac/card/DiamondCard.java new file mode 100644 index 00000000..9dde8fa3 --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/DiamondCard.java @@ -0,0 +1,12 @@ +package nextstep.blackjac.card; + +public class DiamondCard extends Deck { + public DiamondCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + + } +} diff --git a/src/main/java/nextstep/blackjac/card/HeartCard.java b/src/main/java/nextstep/blackjac/card/HeartCard.java new file mode 100644 index 00000000..45ebedbe --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/HeartCard.java @@ -0,0 +1,12 @@ +package nextstep.blackjac.card; + +public class HeartCard extends Deck { + public HeartCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + cardList.add(new Card("Joker", cardShape, 10)); + } +} diff --git a/src/main/java/nextstep/blackjac/card/SpadeCard.java b/src/main/java/nextstep/blackjac/card/SpadeCard.java new file mode 100644 index 00000000..3518886b --- /dev/null +++ b/src/main/java/nextstep/blackjac/card/SpadeCard.java @@ -0,0 +1,13 @@ +package nextstep.blackjac.card; + +public class SpadeCard extends Deck { + public SpadeCard(String cardShape) { + super(cardShape); + } + + @Override + void addJoker() { + cardList.add(new Card("Joker", cardShape, 10)); + } + +} diff --git a/src/main/java/nextstep/blackjac/controller/UserController.java b/src/main/java/nextstep/blackjac/controller/UserController.java new file mode 100644 index 00000000..7805a157 --- /dev/null +++ b/src/main/java/nextstep/blackjac/controller/UserController.java @@ -0,0 +1,47 @@ +package nextstep.blackjac.controller; + +import nextstep.blackjac.card.Card; +import nextstep.blackjac.card.CardDeck; +import nextstep.blackjac.user.User; +import nextstep.blackjac.user.Users; +import nextstep.blackjac.utils.Utils; +import nextstep.blackjac.view.BlackJacView; + +import java.util.List; +import java.util.Stack; + +public class UserController { + + private BlackJacView blackJacView = new BlackJacView(); + private CardDeck cardDeck = new CardDeck(); + private Users users; + private Stack shuffleCardDeck; + + + public void play() { + while (true) { + String names = blackJacView.joinPeople(); + List userNames = Utils.splitName(names); + List money = blackJacView.batting(userNames); + + users = new Users(userNames, money); + List userList = users.getUsers(); + + cardDeck.shuffle(); + shuffleCardDeck = cardDeck.getCardDeck(); + + users.givenCards(shuffleCardDeck); + blackJacView.givenCard(names, userList); + + blackJacView.givenMoreCard(userList, shuffleCardDeck); + blackJacView.finalPayment(userList); + + if (blackJacView.endGame()) { + break; + } + } + } + + + +} diff --git a/src/main/java/nextstep/blackjac/domain/Condition.java b/src/main/java/nextstep/blackjac/domain/Condition.java new file mode 100644 index 00000000..663e2014 --- /dev/null +++ b/src/main/java/nextstep/blackjac/domain/Condition.java @@ -0,0 +1,6 @@ +package nextstep.blackjac.domain; + +@FunctionalInterface +public interface Condition { + boolean condition(int x); +} diff --git a/src/main/java/nextstep/blackjac/user/Chip.java b/src/main/java/nextstep/blackjac/user/Chip.java new file mode 100644 index 00000000..30452500 --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/Chip.java @@ -0,0 +1,14 @@ +package nextstep.blackjac.user; + +public class Chip { + private int chip; + + public Chip(int chip) { + this.chip = chip; + } + public Chip chip(int chip) { + this.chip = chip; + return this; + } + +} diff --git a/src/main/java/nextstep/blackjac/user/Dealer.java b/src/main/java/nextstep/blackjac/user/Dealer.java new file mode 100644 index 00000000..0fc98b9d --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/Dealer.java @@ -0,0 +1,11 @@ +package nextstep.blackjac.user; + +public class Dealer extends User { + private static final String name = "Dealer"; + public static final int AUTO_GIVEN_CARD = 16; + + public Dealer() { + super(name, UserRole.DEALER); + } + +} diff --git a/src/main/java/nextstep/blackjac/user/User.java b/src/main/java/nextstep/blackjac/user/User.java new file mode 100644 index 00000000..2197cc29 --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/User.java @@ -0,0 +1,69 @@ +package nextstep.blackjac.user; + +import nextstep.blackjac.card.Card; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class User { + private String name; + private int money; + private Chip chip; + private UserRole userRole; + private List givenCardList = new ArrayList<>(); + + public User() {} + + public User(String name, UserRole userRole) { + this.name = name; + this.userRole = userRole; + } + + public User(String name, int money) { + this.name = Optional.ofNullable(name) + .orElseThrow(() -> new NullPointerException("이름이 비어 있거나 Null입니다.")); + if (money <= 0) { + throw new IllegalArgumentException("배팅 금액이 너무 작습니다."); + } + this.money = money; + this.userRole = UserRole.getRole(name); + } + + public User givenCardList(Card card) { + givenCardList.add(card); + return this; + } + + public List getGivenCardList() { + return givenCardList; + } + + public int cardNumberTotal() { + return givenCardList.stream() + .map(item -> item.cardNumberTotal(item)) + .reduce(0, Integer::sum); + } + + public int payment(User loseUser, int userCount) { + return this.money += (loseUser.money / (userCount - 1)); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + User user = (User) object; + return money == user.money && Objects.equals(name, user.name) && Objects.equals(chip, user.chip) && userRole == user.userRole; + } + + @Override + public int hashCode() { + return Objects.hash(name, money, chip, userRole); + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/nextstep/blackjac/user/UserRole.java b/src/main/java/nextstep/blackjac/user/UserRole.java new file mode 100644 index 00000000..a6c06d87 --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/UserRole.java @@ -0,0 +1,31 @@ +package nextstep.blackjac.user; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; + +public enum UserRole { + USER, VIP, DEALER; + + public static UserRole getRole(String userName) { + String content = readVipFileList(); + if (content.contains(userName)) { + return UserRole.VIP; + } + return UserRole.USER; + } + + private static String readVipFileList() { + String content = null; + try { + content = new String(Files.readAllBytes(Paths + .get("src/main/resources/VIPLIST")), StandardCharsets.UTF_8); + } catch (IOException e) { + System.out.println(e.getMessage()); + } + return content; + } + +} diff --git a/src/main/java/nextstep/blackjac/user/Users.java b/src/main/java/nextstep/blackjac/user/Users.java new file mode 100644 index 00000000..c1d2070a --- /dev/null +++ b/src/main/java/nextstep/blackjac/user/Users.java @@ -0,0 +1,58 @@ +package nextstep.blackjac.user; + +import nextstep.blackjac.card.Card; +import nextstep.blackjac.domain.Condition; +import nextstep.blackjac.utils.Utils; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Users { + private List users; + private static final int CHIP_PRICE = 10000; + + public Users(List names, List money) { + checkUserCount(names); + Map result = groupUserNameMoney(names, money); + createUser(result); + } + + public List getUsers() { + return users; + } + + public void givenCards(Stack cardDeck) { + for (User user : users) { + user.givenCardList(cardDeck.pop()); + user.givenCardList(cardDeck.pop()); + } + } + + private void createUser(Map userAndMoney) { + users = userAndMoney.entrySet() + .stream() + .map(entry -> new User(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); + users.add(new Dealer()); + } + + private void checkUserCount(List users) { + long userCount = users.size(); + if (userCount < 2 || userCount > 8) { + throw new IllegalArgumentException("인원 수가 너무 적거나 많습니다."); + } + } + + private Map groupUserNameMoney(List userName, List money) { + return IntStream.range(0, Math.min(userName.size(), money.size())) + .boxed() + .collect(Collectors.toMap(userName::get, money::get)); + } + + private int givenChip(int money, int wantChip) { + return IntStream.rangeClosed(0, wantChip) + .boxed() + .reduce(0, (a, b) -> money - (b * money)); + } +} diff --git a/src/main/java/nextstep/blackjac/utils/Utils.java b/src/main/java/nextstep/blackjac/utils/Utils.java new file mode 100644 index 00000000..5118bc7f --- /dev/null +++ b/src/main/java/nextstep/blackjac/utils/Utils.java @@ -0,0 +1,28 @@ +package nextstep.blackjac.utils; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +public class Utils { + private static final String REGEX = ","; + public static List splitName(String names) { + String optName = Optional.ofNullable(names) + .orElseThrow(() -> new NullPointerException("이름이 정의되지않았습니다.")); + + return Arrays.stream(optName.split(REGEX)) + .filter(Utils::isEmpty) + .collect(Collectors.toList()); + } + + + private static boolean isEmpty(String name) { + return !name.isEmpty(); + } + + + + +} diff --git a/src/main/java/nextstep/blackjac/view/BlackJacView.java b/src/main/java/nextstep/blackjac/view/BlackJacView.java new file mode 100644 index 00000000..56601eeb --- /dev/null +++ b/src/main/java/nextstep/blackjac/view/BlackJacView.java @@ -0,0 +1,89 @@ +package nextstep.blackjac.view; + +import nextstep.blackjac.card.Card; +import nextstep.blackjac.user.Dealer; +import nextstep.blackjac.user.User; +import java.util.*; +import java.util.stream.Collectors; + +public class BlackJacView { + private Scanner input = new Scanner(System.in); + + public String joinPeople() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String userNames = input.next(); + return userNames; + } + + public List batting(List userNames) { + List money = new ArrayList<>(); + for (String name : userNames) { + System.out.println(name + "의 배팅 금액은?"); + money.add(input.nextInt()); + input.nextLine(); + } + + return money; + } + + public void givenCard(String userNames, List users) { + System.out.println("딜러," + userNames + "에게 각각 2장의 카드를 나누어 주었습니다."); + getUserCardList(users); + } + + public void givenMoreCard(List users, Stack cardDeck) { + for (User user : users) { + if (user instanceof Dealer) { + givenCardToDealer(user, cardDeck); + continue; + } + + System.out.println(user + "는 한장의 카드를 더 받겠습니까?"); + String moreCard = input.next(); + List userCard = user.getGivenCardList(); + + if (moreCard.equalsIgnoreCase("y")) { + userCard.add(cardDeck.pop()); + } + } + getUserCardList(users); + } + + public void getUserCardList(List users) { + for (User user : users) { + List cards = user.getGivenCardList(); + int result = user.cardNumberTotal(); + + System.out.println(user + ": " + cards + " 결과 - " + result); + } + + } + + public boolean endGame() { + System.out.println("게임을 종료하시겠습니까? (y,n)"); + String endGame = input.next(); + return endGame.equalsIgnoreCase("y"); + } + + public void givenCardToDealer(User user, Stack cardDeck) { + int total = user.cardNumberTotal(); + List userCards = user.getGivenCardList(); + + if (total <= Dealer.AUTO_GIVEN_CARD) { + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + userCards.add(cardDeck.pop()); + } + } + + public void finalPayment(List users) { + System.out.println("## 최종수익"); + } + + public int compareCarNumber(List cardNumberTotals) { + return cardNumberTotals.stream() + .mapToInt(Integer::intValue) + .min() + .orElseThrow(NoSuchElementException::new); + } + +} diff --git a/src/main/java/nextstep/fp/Car.java b/src/main/java/nextstep/fp/Car.java deleted file mode 100644 index 2146c112..00000000 --- a/src/main/java/nextstep/fp/Car.java +++ /dev/null @@ -1,35 +0,0 @@ -package nextstep.fp; - -import java.util.Objects; - -public class Car { - private final String name; - private final int position; - - public Car(String name, int position) { - this.name = name; - this.position = position; - } - - public Car move(MoveStrategy moveStrategy) { - if (moveStrategy.isMovable()) { - return new Car(name, position + 1); - } - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Car car = (Car) o; - return position == car.position && - Objects.equals(name, car.name); - } - - @Override - public int hashCode() { - - return Objects.hash(name, position); - } -} diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java deleted file mode 100644 index bd68fe1c..00000000 --- a/src/main/java/nextstep/fp/Lambda.java +++ /dev/null @@ -1,56 +0,0 @@ -package nextstep.fp; - -import java.util.List; - -public class Lambda { - public static void printAllOld(List numbers) { - System.out.println("printAllOld"); - - for (int number : numbers) { - System.out.println(number); - } - } - - public static void printAllLambda(List numbers) { - System.out.println("printAllLambda"); - - numbers.forEach(System.out::println); - } - - public static void runThread() { - new Thread(new Runnable() { - @Override - public void run() { - System.out.println("Hello from thread"); - } - }).start(); - } - - public static int sumAll(List numbers) { - int total = 0; - for (int number : numbers) { - total += number; - } - return total; - } - - public static int sumAllEven(List numbers) { - int total = 0; - for (int number : numbers) { - if (number % 2 == 0) { - total += number; - } - } - return total; - } - - public static int sumAllOverThree(List numbers) { - int total = 0; - for (int number : numbers) { - if (number > 3) { - total += number; - } - } - return total; - } -} diff --git a/src/main/java/nextstep/fp/MoveStrategy.java b/src/main/java/nextstep/fp/MoveStrategy.java deleted file mode 100644 index 1bd8c23c..00000000 --- a/src/main/java/nextstep/fp/MoveStrategy.java +++ /dev/null @@ -1,5 +0,0 @@ -package nextstep.fp; - -public interface MoveStrategy { - boolean isMovable(); -} diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java deleted file mode 100644 index b446983a..00000000 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ /dev/null @@ -1,44 +0,0 @@ -package nextstep.fp; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class StreamStudy { - - public static long countWords() throws IOException { - String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); - - long count = 0; - for (String w : words) { - if (w.length() > 12) count++; - } - return count; - } - - public static void printLongestWordTop100() throws IOException { - String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); - - // TODO 이 부분에 구현한다. - } - - public static List doubleNumbers(List numbers) { - return numbers.stream().map(x -> 2 * x).collect(Collectors.toList()); - } - - public static long sumAll(List numbers) { - return numbers.stream().reduce(0, (x, y) -> x + y); - } - - public static long sumOverThreeAndDouble(List numbers) { - return 0; - } -} \ No newline at end of file diff --git a/src/main/java/nextstep/optional/Computer.java b/src/main/java/nextstep/optional/Computer.java deleted file mode 100644 index cc0af4d7..00000000 --- a/src/main/java/nextstep/optional/Computer.java +++ /dev/null @@ -1,39 +0,0 @@ -package nextstep.optional; - -public class Computer { - private Soundcard soundcard; - - public Computer(Soundcard soundcard) { - this.soundcard = soundcard; - } - - public Soundcard getSoundcard() { - return soundcard; - } - - public static class Soundcard { - private USB usb; - - public Soundcard(USB usb) { - super(); - this.usb = usb; - } - - public USB getUsb() { - return usb; - } - } - - public static class USB { - private String version; - - public USB(String version) { - super(); - this.version = version; - } - - public String getVersion() { - return this.version; - } - } -} diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java deleted file mode 100644 index 2695c967..00000000 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ /dev/null @@ -1,26 +0,0 @@ -package nextstep.optional; - -import nextstep.optional.Computer.Soundcard; -import nextstep.optional.Computer.USB; - -public class ComputerStore { - public static final String UNKNOWN_VERSION = "UNKNOWN"; - - public static String getVersion(Computer computer) { - String version = UNKNOWN_VERSION; - if (computer != null) { - Soundcard soundcard = computer.getSoundcard(); - if (soundcard != null) { - USB usb = soundcard.getUsb(); - if (usb != null) { - version = usb.getVersion(); - } - } - } - return version; - } - - public static String getVersionOptional(Computer computer) { - return null; - } -} diff --git a/src/main/java/nextstep/optional/Expression.java b/src/main/java/nextstep/optional/Expression.java deleted file mode 100644 index 1c98cd6a..00000000 --- a/src/main/java/nextstep/optional/Expression.java +++ /dev/null @@ -1,25 +0,0 @@ -package nextstep.optional; - -enum Expression { - PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/"); - - private String expression; - - Expression(String expression) { - this.expression = expression; - } - - private static boolean matchExpression(Expression e, String expression) { - return expression.equals(e.expression); - } - - static Expression of(String expression) { - for (Expression v : values()) { - if (matchExpression(v, expression)) { - return v; - } - } - - throw new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)); - } -} diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java deleted file mode 100644 index 9614c2f4..00000000 --- a/src/main/java/nextstep/optional/User.java +++ /dev/null @@ -1,69 +0,0 @@ -package nextstep.optional; - -public class User { - private String name; - private Integer age; - - public User(String name, Integer age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public Integer getAge() { - return age; - } - - public boolean matchName(String name) { - return this.name.equals(name); - } - - public static boolean ageIsInRange1(User user) { - boolean isInRange = false; - - if (user != null && user.getAge() != null - && (user.getAge() >= 30 - && user.getAge() <= 45)) { - isInRange = true; - } - return isInRange; - } - - public static boolean ageIsInRange2(User user) { - return false; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((age == null) ? 0 : age.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - User other = (User) obj; - if (age == null) { - if (other.age != null) - return false; - } else if (!age.equals(other.age)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } -} diff --git a/src/main/java/nextstep/optional/Users.java b/src/main/java/nextstep/optional/Users.java deleted file mode 100644 index 6293040d..00000000 --- a/src/main/java/nextstep/optional/Users.java +++ /dev/null @@ -1,23 +0,0 @@ -package nextstep.optional; - -import java.util.Arrays; -import java.util.List; - -public class Users { - static final User DEFAULT_USER = new User("codesquad", 100); - - List users = Arrays.asList( - new User("crong", 35), - new User("pobi", 30), - new User("jk", 40), - new User("honux", 45)); - - User getUser(String name) { - for (User user : users) { - if (user.matchName(name)) { - return user; - } - } - return DEFAULT_USER; - } -} diff --git a/src/main/resources/VIPLIST b/src/main/resources/VIPLIST new file mode 100644 index 00000000..af85d9b0 --- /dev/null +++ b/src/main/resources/VIPLIST @@ -0,0 +1,3 @@ +KIM +YOUNG +KANG \ No newline at end of file diff --git a/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java new file mode 100644 index 00000000..f7850092 --- /dev/null +++ b/src/test/java/nextstep/blackjacTest/deckTest/CardTest.java @@ -0,0 +1,112 @@ +package nextstep.blackjacTest.deckTest; + +import nextstep.blackjac.card.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class CardTest { + private Deck deck; + private List cardList = new ArrayList<>(); + + @DisplayName("스페이드 카드 초기화 기능 테스트") + @Test + void spadeCardInit() { + final String cardShape = "spade"; + deck = new SpadeCard(cardShape); + initCardList(cardShape); + cardList.add(new Card("Joker", cardShape, 10)); + + assertThat(deck.getCardList()).isEqualTo(cardList); + } + + @DisplayName("클로버 카드 초기화 기능 테스트") + @Test + void cloverCardInit() { + final String cardShape = "clover"; + deck = new CloverCard(cardShape); + initCardList(cardShape); + + assertThat(deck.getCardList()).isEqualTo(cardList); + + assertThatThrownBy(() -> { + deck = new CloverCard(null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("카드 모양이 잘 못 되었습니다."); + } + + @DisplayName("하트 카드 초기화 기능 테스트") + @Test + void heartCardInit() { + final String cardShape = "heart"; + deck = new HeartCard(cardShape); + initCardList(cardShape); + cardList.add(new Card("Joker", cardShape, 10)); + + assertThat(deck.getCardList()).isEqualTo(cardList); + + assertThatThrownBy(() -> { + deck = new HeartCard(null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("카드 모양이 잘 못 되었습니다."); + } + + @DisplayName("다이아몬드 카드 초기화 기능 테스트") + @Test + void diamondCardInit() { + final String cardShape = "diamond"; + deck = new DiamondCard(cardShape); + initCardList(cardShape); + + assertThat(deck.getCardList()).isEqualTo(cardList); + + assertThatThrownBy(() -> { + deck = new DiamondCard(null); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("카드 모양이 잘 못 되었습니다."); + } + + @DisplayName("카드 셔플 기능 테스트") + @Test + void shuffle() { + CardDeck cardDeck = new CardDeck(); + cardDeck.shuffle(); + Stack cards = cardDeck.getCardDeck(); + assertThat(cards.size()).isEqualTo(54); + System.out.println(cards); + } + + @DisplayName("카드 2장 받는 기능 테스트") + @Test + void getCard() { + CardDeck cardDeck = new CardDeck(); + cardDeck.shuffle(); + Stack cards = cardDeck.getCardDeck(); + Card firstCard = cards.pop(); + Card secondCard = cards.pop(); + System.out.println(firstCard); + System.out.println(secondCard); + } + + private void initCardList(String cardShape) { + cardList.add(new Card("A", cardShape, 1)); + cardList.add(new Card("2", cardShape, 2)); + cardList.add(new Card("3", cardShape, 3)); + cardList.add(new Card("4", cardShape, 4)); + cardList.add(new Card("5", cardShape, 5)); + cardList.add(new Card("6", cardShape, 6)); + cardList.add(new Card("7", cardShape, 7)); + cardList.add(new Card("8", cardShape, 8)); + cardList.add(new Card("9", cardShape, 9)); + cardList.add(new Card("10", cardShape, 10)); + cardList.add(new Card("Jack", cardShape, 10)); + cardList.add(new Card("Queen", cardShape, 10)); + cardList.add(new Card("King", cardShape, 10)); + } + +} diff --git a/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java new file mode 100644 index 00000000..56a6f66d --- /dev/null +++ b/src/test/java/nextstep/blackjacTest/deckTest/UserTest.java @@ -0,0 +1,84 @@ +package nextstep.blackjacTest.deckTest; + +import nextstep.blackjac.user.Dealer; +import nextstep.blackjac.user.User; +import nextstep.blackjac.user.UserRole; +import nextstep.blackjac.user.Users; +import nextstep.blackjac.utils.Utils; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class UserTest { + + private final String names = "pobi,jason"; + private List money; + + @DisplayName("유저 돈이 없거나 음수일때 기능 테스트") + @Test + void noHasMoney() { + final int pobiMoney = 0; + final int pobiJason = 10000; + List userName = Utils.splitName(names); + + assertThatThrownBy(() -> { + money = Arrays.asList(pobiMoney, pobiJason); + new Users(userName, money); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("배팅 금액이 잘 못 되었습니다."); + } + + + @DisplayName("유저 이름이 null일 경우 기능 테스트") + @Test + void userNameIsNull() { + final int pobiMoney = 10000; + final int pobiJason = 10000; + money = Arrays.asList(pobiMoney, pobiJason); + + assertThatThrownBy(() -> { + new Users(null, money); + }).isInstanceOf(NullPointerException.class) + .hasMessageContaining("이름이 정의되지않았습니다."); + } + + @DisplayName("유저 이름이 공백일 경우 기능 테스트") + @Test + void userNameIsEmpty() { + final int pobiMoney = 10000; + final int pobiJason = 10000; + money = Arrays.asList(pobiMoney, pobiJason); + List names = Arrays.asList("", ""); + + assertThatThrownBy(() -> { + new Users(names, money); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("인원 수가 너무 적거나 많습니다."); + } + + @DisplayName("유저 생성 테스트") + @Test + void createUserTest() { + final int pobiMoney = 10000; + final int pobiJason = 10000; + money = Arrays.asList(pobiMoney, pobiJason); + List userName = Utils.splitName(names); + + Users users = new Users(userName, money); + List userList = users.getUsers(); + assertThat(userList).isEqualTo(Arrays.asList(new User("pobi", 10000), new User("jason", 10000), new Dealer())); + } + + @DisplayName("딜러 생성 테스트") + @Test + void createDealer() { + Dealer dealer = new Dealer(); + assertThat(dealer).isEqualTo(new Dealer()); + } + + +} diff --git a/src/test/java/nextstep/fp/CarTest.java b/src/test/java/nextstep/fp/CarTest.java deleted file mode 100644 index 1ab1106f..00000000 --- a/src/test/java/nextstep/fp/CarTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package nextstep.fp; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CarTest { - @Test - public void 이동() { - Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return true; - } - }); - assertThat(actual).isEqualTo(new Car("pobi", 1)); - } - - @Test - public void 정지() { - Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return false; - } - }); - assertThat(actual).isEqualTo(new Car("pobi", 0)); - } -} diff --git a/src/test/java/nextstep/fp/LambdaTest.java b/src/test/java/nextstep/fp/LambdaTest.java deleted file mode 100644 index f240ac65..00000000 --- a/src/test/java/nextstep/fp/LambdaTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package nextstep.fp; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LambdaTest { - private List numbers; - - @BeforeEach - public void setup() { - numbers = Arrays.asList(1, 2, 3, 4, 5, 6); - } - - @Test - public void printAllOld() throws Exception { - Lambda.printAllOld(numbers); - } - - @Test - public void printAllLambda() throws Exception { - Lambda.printAllLambda(numbers); - } - - @Test - public void runThread() throws Exception { - Lambda.runThread(); - } - - @Test - public void sumAll() throws Exception { - int sum = Lambda.sumAll(numbers); - assertThat(sum).isEqualTo(21); - } - - @Test - public void sumAllEven() throws Exception { - int sum = Lambda.sumAllEven(numbers); - assertThat(sum).isEqualTo(12); - } - - @Test - public void sumAllOverThree() throws Exception { - int sum = Lambda.sumAllOverThree(numbers); - assertThat(sum).isEqualTo(15); - } -} diff --git a/src/test/java/nextstep/fp/StreamStudyTest.java b/src/test/java/nextstep/fp/StreamStudyTest.java deleted file mode 100644 index 2962521a..00000000 --- a/src/test/java/nextstep/fp/StreamStudyTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package nextstep.fp; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StreamStudyTest { - private List numbers; - - @BeforeEach - public void setup() { - numbers = Arrays.asList(1, 2, 3, 4, 5, 6); - } - - @Test - public void countWords() throws Exception { - long result = StreamStudy.countWords(); - System.out.println("result : " + result); - } - - @Test - public void printLongestWordTop100() throws Exception { - StreamStudy.printLongestWordTop100(); - } - - @Test - public void map() throws Exception { - List doubleNumbers = StreamStudy.doubleNumbers(numbers); - doubleNumbers.forEach(System.out::println); - } - - @Test - public void sumAll() throws Exception { - long sum = StreamStudy.sumAll(numbers); - assertThat(sum).isEqualTo(21); - } - - @Test - public void sumOverThreeAndDouble() throws Exception { - numbers = Arrays.asList(3, 1, 6, 2, 4, 8); - long sum = StreamStudy.sumOverThreeAndDouble(numbers); - assertThat(sum).isEqualTo(36); - } -} diff --git a/src/test/java/nextstep/optional/ComputerStoreTest.java b/src/test/java/nextstep/optional/ComputerStoreTest.java deleted file mode 100644 index b576253a..00000000 --- a/src/test/java/nextstep/optional/ComputerStoreTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package nextstep.optional; - -import nextstep.optional.Computer.Soundcard; -import nextstep.optional.Computer.USB; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class ComputerStoreTest { - @Test - public void getVersion() { - String version = "pobi's usb"; - Soundcard soundcard = new Soundcard(new USB(version)); - Computer computer = new Computer(soundcard); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(version); - } - - @Test - public void getVersionWhenComputerIsNull() throws Exception { - assertThat(ComputerStore.getVersion(null)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionWhenSoundcardIsNull() throws Exception { - Computer computer = new Computer(null); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionWhenUSBIsNull() throws Exception { - Computer computer = new Computer(new Soundcard(null)); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionOptional() { - String version = "pobi's usb"; - Soundcard soundcard = new Soundcard(new USB(version)); - Computer computer = new Computer(soundcard); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(version); - } - - @Test - public void getVersionOptionalWhenComputerIsNull() throws Exception { - assertThat(ComputerStore.getVersionOptional(null)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionOptionalWhenSoundcardIsNull() throws Exception { - Computer computer = new Computer(null); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } - - @Test - public void getVersionOptionalWhenUSBIsNull() throws Exception { - Computer computer = new Computer(new Soundcard(null)); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); - } -} diff --git a/src/test/java/nextstep/optional/ExpressionTest.java b/src/test/java/nextstep/optional/ExpressionTest.java deleted file mode 100644 index 32356261..00000000 --- a/src/test/java/nextstep/optional/ExpressionTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package nextstep.optional; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; - - -public class ExpressionTest { - @Test - public void of() { - assertThat(Expression.PLUS == Expression.of("+")).isTrue(); - } - - @Test - public void notValidExpression() { - assertThatIllegalArgumentException() - .isThrownBy(() -> { - Expression.of("&"); - }); - } -} diff --git a/src/test/java/nextstep/optional/UserTest.java b/src/test/java/nextstep/optional/UserTest.java deleted file mode 100644 index bfc6af49..00000000 --- a/src/test/java/nextstep/optional/UserTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package nextstep.optional; - -import org.junit.jupiter.api.Test; - -import static nextstep.optional.User.ageIsInRange1; -import static nextstep.optional.User.ageIsInRange2; -import static org.assertj.core.api.Assertions.assertThat; - -public class UserTest { - @Test - public void whenFiltersWithoutOptional_thenCorrect() { - assertThat(ageIsInRange1(new User("crong", 35))).isTrue(); - assertThat(ageIsInRange1(new User("crong", 48))).isFalse(); - assertThat(ageIsInRange1(new User("crong", null))).isFalse(); - assertThat(ageIsInRange1(new User("crong", 29))).isFalse(); - assertThat(ageIsInRange1(null)).isFalse(); - } - - @Test - public void whenFiltersWithOptional_thenCorrect() { - assertThat(ageIsInRange2(new User("crong", 35))).isTrue(); - assertThat(ageIsInRange2(new User("crong", 48))).isFalse(); - assertThat(ageIsInRange2(new User("crong", null))).isFalse(); - assertThat(ageIsInRange2(new User("crong", 29))).isFalse(); - assertThat(ageIsInRange2(null)).isFalse(); - } -} diff --git a/src/test/java/nextstep/optional/UsersTest.java b/src/test/java/nextstep/optional/UsersTest.java deleted file mode 100644 index ec0f7329..00000000 --- a/src/test/java/nextstep/optional/UsersTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package nextstep.optional; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class UsersTest { - - @Test - public void getUser() { - Users users = new Users(); - assertThat(users.getUser("crong")).isEqualTo(new User("crong", 35)); - } - - - @Test - public void getDefaultUser() { - Users users = new Users(); - assertThat(users.getUser("codesquard")).isEqualTo(Users.DEFAULT_USER); - } -}