diff --git a/.gitignore b/.gitignore
index 6c018781387..2269c491128 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@ out/
### VS Code ###
.vscode/
+/target/
diff --git a/bin/.gitignore b/bin/.gitignore
new file mode 100644
index 00000000000..7eed456bec8
--- /dev/null
+++ b/bin/.gitignore
@@ -0,0 +1,2 @@
+/main/
+/test/
diff --git a/build.gradle b/build.gradle
index 3697236c6fb..4dff066b11e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,11 +10,13 @@ repositories {
dependencies {
testImplementation platform('org.junit:junit-bom:5.9.1')
- testImplementation platform('org.assertj:assertj-bom:3.25.1')
- testImplementation('org.junit.jupiter:junit-jupiter')
- testImplementation('org.assertj:assertj-core')
+ testImplementation 'org.junit.jupiter:junit-jupiter-api'
+ testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
+ testImplementation 'org.junit.platform:junit-platform-launcher:1.9.3'
+ testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}
+
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
@@ -24,3 +26,4 @@ java {
test {
useJUnitPlatform()
}
+
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 80187ac3043..e650f0277d0 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000000..218a47be1d5
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,43 @@
+
+ 4.0.0
+
+ com.example
+ blackjack
+ 1.0-SNAPSHOT
+ jar
+
+
+ 1.8
+ 1.8
+ 5.8.2
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.jupiter.version}
+ test
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.jupiter.version}
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.22.2
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/BlackJack/BlackjackGame.java b/src/main/java/BlackJack/BlackjackGame.java
new file mode 100644
index 00000000000..1be1f1fadfc
--- /dev/null
+++ b/src/main/java/BlackJack/BlackjackGame.java
@@ -0,0 +1,109 @@
+package BlackJack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BlackjackGame {
+
+ public static int findBlackJack(Dealer dealer, Money m) {
+ Calculate c;
+ c = new Calculate(dealer.getCards());
+ int dealerSum = c.sum();
+
+ c = new Calculate(m.getPlayer().getCards());
+ int playerSum = c.sum();
+
+ if(dealerSum == 21 && playerSum == 21) {
+ m.setResult(m.getMoney());
+ return 0;
+ }
+ if(dealerSum != 21 && playerSum == 21) {
+ m.setResult((int)(m.getMoney()*1.5));
+ return 1;
+ }
+ return 0;
+
+ }
+
+ public static void lessTwentyone(String answer,Calculate calculate,Deal deal, Player player, ResultView result) {
+ if(calculate.sum()<21&&answer.equals("y")) {
+ deal.dealOutCard(player);
+ }
+ }
+
+ public static void addCards(Calculate calculate,Deal deal, Player player, InputView input, ResultView result) {
+ String answer;
+ do {
+ answer= input.getPlayerChoice(player.getName());
+ lessTwentyone(answer,calculate, deal, player, result);
+ result.printOwnCard(player);
+ System.out.println();
+ }while(answer.equals("y")&&calculate.sum()<21);
+
+ }
+
+ public static void main(String[] args) {
+
+ InputView input = new InputView();
+ String playerNamesInput = input.getPlayerNames();
+ String[] playerNames = playerNamesInput.split(",");
+
+ List players = new ArrayList<>();
+ for(String name : playerNames) {
+ players.add(new Player(name));
+ }
+
+ List dividends = new ArrayList<>();
+ for(Player player : players) {
+ int n=input.getMoney(player);
+ dividends.add(new Money(player,n));
+ }
+
+ Dealer dealer = new Dealer();
+ Deal deal = new Deal(players, dealer);
+
+ ResultView result = new ResultView();
+
+ result.printFirst(playerNamesInput);
+ deal.dealOutCard(dealer);
+ deal.dealOutCard(dealer);
+ for(Player player : players) {
+ deal.dealOutCard(player);
+ deal.dealOutCard(player);
+ }
+
+
+ result.printPlayerCard(dealer, players);
+ System.out.println();
+
+ int bj = 0;
+ for(Money m : dividends) {
+ bj += findBlackJack(dealer, m);
+ }
+ if(bj!=0) {
+ result.printResult(dealer, players);
+ result.finalMoney(dividends, dealer);
+ return;
+ }
+
+ for(Player player : players) {
+ Calculate calculate = new Calculate(player.getCards());
+ System.out.println();
+ addCards(calculate, deal, player, input, result);
+
+ }
+
+ System.out.println();
+ result.addDealer(dealer, deal);
+ System.out.println();
+
+ result.printResult(dealer, players);
+
+ /* 1단계
+ result.finalWinOrLoss(dealer, players);
+ */
+
+ result.finalMoney(dividends, dealer);
+ }
+
+}
diff --git a/src/main/java/BlackJack/Calculate.java b/src/main/java/BlackJack/Calculate.java
new file mode 100644
index 00000000000..d3dd0c965e0
--- /dev/null
+++ b/src/main/java/BlackJack/Calculate.java
@@ -0,0 +1,39 @@
+package BlackJack;
+
+public class Calculate {
+
+ private String[] shape= {"하트", "다이아몬드", "클로버", "스페이드"};
+ private String[] rank = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
+ private Card cards;
+
+ Calculate(Card cards){
+ this.cards = cards;
+ }
+
+ public int change(String c) {
+ char[] StringNum = c.toCharArray();
+ char num = StringNum[StringNum.length-1];
+
+ if(num>=50&&num<=57) {
+ return num-48;
+ }
+
+ if(num == 'A') {
+ return 1;
+ }
+
+ return 10;
+ }
+
+ public int sum() {
+ int sum = 0;
+ for(String c : cards.getCard()) {
+ sum+=change(c);
+ }
+
+ return sum;
+
+ }
+
+
+}
diff --git a/src/main/java/BlackJack/Card.java b/src/main/java/BlackJack/Card.java
new file mode 100644
index 00000000000..ffac03d0b4f
--- /dev/null
+++ b/src/main/java/BlackJack/Card.java
@@ -0,0 +1,23 @@
+package BlackJack;
+
+import java.util.ArrayList;
+
+public class Card {
+
+
+ private ArrayList cards;
+
+ public Card() {
+ this.cards = new ArrayList<>();
+ }
+
+ public ArrayList getCard() {
+ return cards;
+ }
+
+ public void addCard(String c) {
+ cards.add(c);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/BlackJack/Deal.java b/src/main/java/BlackJack/Deal.java
new file mode 100644
index 00000000000..1121aca58b4
--- /dev/null
+++ b/src/main/java/BlackJack/Deal.java
@@ -0,0 +1,60 @@
+package BlackJack;
+
+import java.util.List;
+import java.util.Random;
+
+public class Deal {
+
+ private List players;
+ private Dealer dealer;
+ private String[] shape= {"하트", "다이아몬드", "클로버", "스페이드"};
+ private String[] rank = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
+ private Card Allcards;
+ private Card main = new Card();
+
+ public Deal(List players, Dealer dealer) {
+ this.players = players;
+ this.dealer = dealer;
+ }
+
+ public String PickCards(Player player) {
+ Random random = new Random();
+ int PickShape;
+ PickShape = random.nextInt(shape.length);
+
+ int PickRank;
+ PickRank = random.nextInt(rank.length);
+
+ //테스트를 위한 코드
+ //PickShape = 0;
+ //PickRank = 0;
+
+ StringBuilder c = new StringBuilder();
+ c.append(shape[PickShape]);
+ c.append(rank[PickRank]);
+
+ String card = c.toString();
+
+
+
+ return card;
+ }
+
+ public boolean checkSameCard(String card, Card cards) {
+ return cards.getCard().contains(card);
+ }
+
+ public String dealOutCard(Player player) {
+ String card = PickCards(player);
+ while(checkSameCard(card, player.getCards())||checkSameCard(card, main)) {
+ card = PickCards(player);
+ }
+ player.setCards(card);
+ main.addCard(card);
+
+ return card;
+ }
+
+}
+
+
diff --git a/src/main/java/BlackJack/Dealer.java b/src/main/java/BlackJack/Dealer.java
new file mode 100644
index 00000000000..054ce9c6cb9
--- /dev/null
+++ b/src/main/java/BlackJack/Dealer.java
@@ -0,0 +1,17 @@
+package BlackJack;
+
+
+public class Dealer extends Player{
+
+ public Dealer(){
+ super("딜러");
+ }
+
+ public boolean over(Calculate calculate, Deal deal) {
+ if(calculate.sum()<17) {
+ deal.dealOutCard(this);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/BlackJack/InputView.java b/src/main/java/BlackJack/InputView.java
new file mode 100644
index 00000000000..bf15984c9af
--- /dev/null
+++ b/src/main/java/BlackJack/InputView.java
@@ -0,0 +1,49 @@
+package BlackJack;
+
+import java.util.InputMismatchException;
+import java.util.List;
+import java.util.Scanner;
+
+public class InputView {
+
+ static Scanner sc = new Scanner(System.in);
+
+ public static String getPlayerNames() {
+ System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)");
+ return sc.next();
+ }
+
+ public String getPlayerChoice(String playerName) {
+ String choice;
+ while (true) {
+ System.out.println(playerName + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)");
+ choice = sc.next();
+ if (choice.equalsIgnoreCase("y") || choice.equalsIgnoreCase("n")) {
+ break;
+ }
+ if (!choice.equalsIgnoreCase("y") && !choice.equalsIgnoreCase("n")) {
+ System.out.println("잘못된 입력입니다. 예는 y, 아니오는 n 중 하나를 입력하세요.");
+ }
+ }
+ return choice;
+ }
+
+ public int getMoney(Player player) {
+ int money = 0;
+ while (true) {
+ System.out.println(player.getName() + "의 배팅 금액은?");
+ try {
+ money = sc.nextInt();
+ if (money > 0) {
+ break;
+ } else {
+ System.out.println("배팅 금액은 0보다 커야 합니다. 다시 입력하세요.");
+ }
+ } catch (InputMismatchException e) {
+ System.out.println("잘못된 입력입니다. 숫자를 입력하세요.");
+ sc.next();
+ }
+ }
+ return money;
+ }
+}
diff --git a/src/main/java/BlackJack/Money.java b/src/main/java/BlackJack/Money.java
new file mode 100644
index 00000000000..328ed84c3b6
--- /dev/null
+++ b/src/main/java/BlackJack/Money.java
@@ -0,0 +1,57 @@
+package BlackJack;
+
+public class Money {
+
+ private Player player;
+ private int money;
+ private int result;
+
+ Money(Player player, int money){
+ this.player = player;
+ this.money = money;
+ this.result = 0;
+ }
+
+ public int getMoney() {
+ return money;
+ }
+ public String getName() {
+ return player.getName();
+ }
+ public Player getPlayer() {
+ return player;
+ }
+ public int getResult() {
+ return result;
+ }
+
+ public void setResult(int n) {
+ this.result = n;
+ }
+
+
+ public int result(Dealer dealer,ResultView result) {
+ Calculate calculate;
+ calculate = new Calculate(dealer.getCards());
+ int dealerSum = calculate.sum();
+ calculate = new Calculate(player.getCards());
+ int playerSum = calculate.sum();
+
+ if(dealerSum > 21) {
+ setResult(getMoney());
+ return getResult();
+ }
+ if(playerSum > 21) {
+ setResult(-getMoney());
+ return getResult();
+ }
+ if(result.findWin(dealer, this) == 0) {
+ setResult(getMoney());
+ return getResult();
+ }
+
+ setResult(-getMoney());
+ return getResult();
+
+ }
+}
diff --git a/src/main/java/BlackJack/Player.java b/src/main/java/BlackJack/Player.java
new file mode 100644
index 00000000000..6749028ac01
--- /dev/null
+++ b/src/main/java/BlackJack/Player.java
@@ -0,0 +1,27 @@
+package BlackJack;
+
+public class Player {
+
+ private String name;
+ private Card cards;
+
+ public Player(String name) {
+ this.name = name;
+ this.cards = new Card();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Card getCards() {
+ return cards;
+ }
+
+ public void setCards(String c) {
+ this.cards.addCard(c);
+ }
+
+
+
+}
diff --git a/src/main/java/BlackJack/ResultView.java b/src/main/java/BlackJack/ResultView.java
new file mode 100644
index 00000000000..59baff37d3e
--- /dev/null
+++ b/src/main/java/BlackJack/ResultView.java
@@ -0,0 +1,97 @@
+package BlackJack;
+
+import java.util.List;
+
+public class ResultView {
+
+ public void printCard(Card card) {
+ for (int i = 0; i < card.getCard().size()-1; i++) {
+ System.out.print(card.getCard().get(i)+", ");
+ }
+ int n =card.getCard().size()-1;
+ System.out.print(card.getCard().get(n));
+ }
+
+ public void printFirst(String names) {
+ System.out.println("\n딜러와 " + names +"에게 2장을 나누었습니다.");
+ }
+
+ public void printOwnCard(Player own) {
+ System.out.print(own.getName() + ":");
+ printCard(own.getCards());
+ }
+
+ public void printPlayerCard(Dealer dealer, List players) {
+ printOwnCard(dealer);
+ System.out.println();
+ for(Player player : players) {
+ printOwnCard(player);
+ System.out.println();
+ }
+
+ }
+
+ public void addDealer(Dealer dealer, Deal deal) {
+ Calculate calculate = new Calculate(dealer.getCards());
+ if(dealer.over(calculate, deal)) {
+ System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다.");
+ }
+ }
+ public void findResult(Player player) {
+ Calculate calculate;
+ System.out.print(player.getName() + "카드 : ");
+ printCard(player.getCards());
+ calculate = new Calculate(player.getCards());
+ System.out.println(" - 결과 : " + calculate.sum());
+ }
+
+
+ public void printResult(Dealer dealer, List players) {
+ findResult(dealer);
+ for(Player player : players) {
+ findResult(player);
+ }
+ }
+
+
+
+ public int findWin(Dealer dealer, Money money) {
+ Calculate calculate;
+ calculate = new Calculate(dealer.getCards());
+ int dealerSum = calculate.sum();
+ calculate = new Calculate(money.getPlayer().getCards());
+ int playerSum = calculate.sum();
+
+ if(dealerSum > 21) {
+ return 0;
+ }
+
+ if(Math.abs(dealerSum - 21)< Math.abs(playerSum-21)) {
+
+ return money.getMoney();
+ }
+
+ return 0;
+ }
+
+
+ public int dealerWinLoss(Dealer dealer, List dividends) {
+ int total = 0;
+ for(Money money : dividends) {
+ total += findWin(dealer, money);
+ }
+
+ return total;
+ }
+
+
+
+ public void finalMoney(List dividends, Dealer dealer) {
+ System.out.println("## 최종 수익");
+ System.out.println(dealer.getName() + " : " + dealerWinLoss(dealer,dividends));
+ for(Money m : dividends) {
+ System.out.println(m.getName() + " : " + m.result(dealer, this));
+ }
+ }
+
+}
diff --git a/src/test/java/BlackJack/CaculateTest.java b/src/test/java/BlackJack/CaculateTest.java
new file mode 100644
index 00000000000..f52aca2372d
--- /dev/null
+++ b/src/test/java/BlackJack/CaculateTest.java
@@ -0,0 +1,34 @@
+package BlackJack;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+class CaculateTest {
+
+ @Test
+ void changeTest() {
+
+ Card card = new Card();
+ Calculate calculate = new Calculate(card);
+ String c = "스페이스K";
+ int result = calculate.change(c);
+ assertThat(result).isEqualTo(10);
+
+ }
+
+ @Test
+ void sumTest() {
+ Card cards = new Card();
+ cards.addCard("스페이스K");
+ cards.addCard("하트A");
+ cards.addCard("클로버8");
+
+ Calculate calculate = new Calculate(cards);
+ int sum = calculate.sum();
+
+ assertThat(sum).isEqualTo(19);
+ }
+
+}
diff --git a/src/test/java/BlackJack/DealTest.java b/src/test/java/BlackJack/DealTest.java
new file mode 100644
index 00000000000..593b0e54f7f
--- /dev/null
+++ b/src/test/java/BlackJack/DealTest.java
@@ -0,0 +1,27 @@
+package BlackJack;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.api.Test;
+
+public class DealTest {
+
+ @Test
+ void testPickCards() {
+
+ Player player = new Player("pobi");
+ List players = new ArrayList<>();
+ players.add(player);
+ Dealer dealer = new Dealer();
+ Deal deal = new Deal(players, dealer);
+
+ Random fixedRandom = new Random(0);
+ String result = deal.PickCards(player);
+
+ assertTrue(result.equals("하트A"));
+ }
+}