Skip to content
Open

init #48

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,18 @@
# java-blackjack

## 기능 목록
1. 카드를 1 장 지급한다.
2. 참가자에게 지급한 카드는 중복되면 안된다.
3. 최초에 카드를 셋팅한다. (딜러를 포함한 모든 플레이어에게 2장씩 지급한다)
4. 카드 합이 N 이상인지 판단한다.
1. 카드 합이 N 이상일 경우 카드를 지급받을 수 없다.
5. 무승부일 경우, 카드의 장 수가 많은 쪽이 승리한다.
6. Ace를 가진 패의 결과 값 계산 시 유리한 숫자로 선택된다.

## 클래스 설계
1. CardNumber: 1~11 사이의 숫자
2. CardSuit(Enum): 다이아, 클로버, 하트, 스페이드
3. Card: 숫자와 그림
4. Cards: 카드의 일급 컬렉션
5. Dealer: 카드지급, 합계 판단
6. Player: Cards를 가지고 있음
7. Table: 결과 계산
42 changes: 42 additions & 0 deletions src/main/java/blackjack/BlackJackController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package blackjack;

import blackjack.view.InputView;
import blackjack.view.OutputView;

import java.util.List;
import java.util.stream.Stream;

public class BlackJackController {
public static void main(String[] args) {
InputView inputView = new InputView();
OutputView outputView = new OutputView();

final List<String> names = inputView.insertPlayer();
List<Player> players = names.stream()
.map(name -> new Player(name))
.toList();

Dealer dealer = new Dealer();

//init
dealer.deal(dealer);
dealer.deal(dealer);
for(Player player : players) {
dealer.deal(player);
dealer.deal(player);
}
inputView.init(dealer, players);
for(Player player : players) {
while (inputView.isProvide(player.getName())) {
dealer.deal(player);
inputView.printCards(player);
}
}
while (outputView.isProvide(dealer)) {
dealer.deal(dealer);
}
outputView.printTotalScore(dealer, players);
final Table table = new Table(players, dealer);
outputView.printResult(table);
}
}
32 changes: 32 additions & 0 deletions src/main/java/blackjack/Card.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package blackjack;

public class Card {

private CardNumber number;
private final CardSuit suit;

public Card(CardNumber number, CardSuit suit) {
this.number = number;
this.suit = suit;
}

public Card(Card card) {
this.number = card.number;
this.suit = card.suit;
}

public CardNumber getNumber() {
return number;
}
public Integer toInt() {
return number.getNumber();
}

public String toString() {
return getNumber().toString() + suit.getSuitName();
}

public CardSuit getSuit() {
return suit;
}
}
27 changes: 27 additions & 0 deletions src/main/java/blackjack/CardNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package blackjack;

public enum CardNumber {
ACE(1),
N2(2),
N3(3),
N4(4),
N5(5),
N6(6),
N7(7),
N8(8),
N9(9),
N10(10),
JACK(10),
QUEEN(10),
KING(10);

private Integer number;

CardNumber(Integer number){
this.number = number;
}

public Integer getNumber() {
return this.number;
}
}
18 changes: 18 additions & 0 deletions src/main/java/blackjack/CardSuit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package blackjack;

public enum CardSuit {
DIAMOND("다이아몬드"),
CLOVER("클로버"),
HEART("하트"),
SPADE("스페이드");

private String suitName;

CardSuit(String suitName) {
this.suitName = suitName;
}

public String getSuitName() {
return this.suitName;
}
}
28 changes: 28 additions & 0 deletions src/main/java/blackjack/Cards.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package blackjack;

import java.util.ArrayList;
import java.util.List;

public class Cards {
private List<Card> cards;

public Cards() {
this.cards = new ArrayList<>();
}

public Cards (List<Card> cards) {
this.cards = cards;
}

public List<Card> getCards() {
return cards;
}

public Integer getSize() {
return cards.size();
}

public void push(Card card) {
this.cards.add(card);
}
}
27 changes: 27 additions & 0 deletions src/main/java/blackjack/Dealer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package blackjack;

public class Dealer extends Player {
private final Deck deck;
private Integer cardCount;


public Dealer(){
super("dealer");
deck = new Deck();
cardCount = 0;
}

public void deal(Player player) {
Card card = deck.getOneCard(cardCount++);
player.add(card);
}

public boolean isWin(Player player) {
int dealerSum = getSum();
int playerSum = player.getSum();
if(dealerSum == playerSum) {
return this.getCount() < player.getCount();
}
return dealerSum < playerSum;
}
}
29 changes: 29 additions & 0 deletions src/main/java/blackjack/Deck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package blackjack;

import java.util.Arrays;
import java.util.Collections;

public class Deck {
private static Cards pool = new Cards();

private static final int MINIMUM_NUMBER = 1;
private static final int MAXIMUM_NUMBER = 10;

static {
Arrays.stream(CardNumber.values()).forEach(number -> {
pool.push(new Card(number, CardSuit.DIAMOND));
pool.push(new Card(number, CardSuit.CLOVER));
pool.push(new Card(number, CardSuit.HEART));
pool.push(new Card(number, CardSuit.SPADE));
});
// Collections.shuffle(pool.getCards());
}

public Card getOneCard(Integer index) {
return new Card(pool.getCards().get(index));
}

public Integer getSize() {
return pool.getSize();
}
}
57 changes: 57 additions & 0 deletions src/main/java/blackjack/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package blackjack;

import java.util.Comparator;
import java.util.List;

public class Player {
private String name;
private Cards cards;

public boolean result;

public Player(String name){
this.name = name;
this.cards = new Cards();
}

public String getName() {
return this.name;
}

public Integer getSum() {
Integer result = 0;
cards.getCards()
.sort((c1, c2) -> c2.toInt().compareTo(c1.toInt()));
for(Card card : cards.getCards()) {
if (CardNumber.ACE.equals(card.getNumber())) {
if(result + 11 <= 21) {
result += 10;
}
}
result += card.toInt();
}
return result;
}


public Integer getCount() {
return this.cards.getSize();
}

public void add(Card card) {
cards.push(new Card(card));
}

public boolean isGreaterThan(int number) {
return getSum() >= number;
}

public String toStringList(int idx) {
List<String> collect = cards.getCards().stream().map(Card::toString).toList();
return String.join(", ", collect.subList(idx, collect.size()));
}

public String toStringList() {
return toStringList(0);
}
}
24 changes: 24 additions & 0 deletions src/main/java/blackjack/Table.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package blackjack;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Table {
private List<Player> players;
private Dealer dealer;

public Table(List<Player> players, Dealer dealer) {
this.players = players;
this.dealer = dealer;
}

public Map<String, Boolean> result() {
return players.stream()
.collect(Collectors.toMap(
Player::getName,
player -> dealer.isWin(player)
));
}
}
43 changes: 43 additions & 0 deletions src/main/java/blackjack/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package blackjack.view;

import blackjack.Dealer;
import blackjack.Player;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;

public class InputView {
Scanner sc = new Scanner(System.in);

public List<String> insertPlayer() {
System.out.println("게임의 참여할 사람의 입력하세요.(쉼표 기준으로 분리)");
return Arrays.stream(sc.nextLine()
.replace(" ", "")
.split(",")).toList();
}

public void init(Dealer dealer, List<Player> players) {
List<String> names = players.stream().map(Player::getName).toList();
String text = String.join(", ", names);
System.out.println("딜러와 " + text + "에게 2장의 카드를 나누었습니다.");
System.out.println("딜러:" + dealer.toStringList(1));
players.forEach(player -> {
printCards(player);
});
}

public void printCards(Player player) {
System.out.println(player.getName() + "카드: " + player.toStringList());
}

public boolean isProvide(String name) {
System.out.println(name + "은(는) 한장의 카드를 더 받으시겠습니까? (예는 y, 아니오는 n)");
String yn = sc.nextLine();
if("y".equals(yn.toLowerCase())) {
return true;
}
return false;
}
}
Loading