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")); + } +}