본문 바로가기
JAVA

블랙잭 게임 구현 #2 (+코드 공유)

by mingutistory 2020. 3. 18.
728x90

(+) 조회수가 높아져서 상단에 노출 시킨다. 

하단에 있는 코드는 좋은 코드가 아니다 !

다른 분들의 코드를 참고해서 수정했다. 아직 완성형은 아니지만 이 코드보다는 낫다. 

계속 변경되는 코드는 이 쪽에서 참고

https://github.com/minchoi9509/blackjack

 

minchoi9509/blackjack

블랙잭 게임 수정 중. Contribute to minchoi9509/blackjack development by creating an account on GitHub.

github.com

스스로 피드백한 글은

https://minchoi0912.tistory.com/50

 

블랙잭 게임 코드 피드백 #1

OKKY fender님의 칼럼 지적대로 지금의 나는 객체지향적 사고를 전혀 하지 못하고 있다는 인상을 계속 받고 있다. 아무래도 책을 다시 한번 읽는 것이 필요해보인다. 코드 공유하면서도 생각했지만 누구나 코드를..

minchoi0912.tistory.com

 


 

 

집에 있으니까 너무 늘어진다.

클래스는 Card, Gamer, Dealer, Rule, 그리고 실행시킬 BlackJack 클래스 이렇게 5개 만들었다.

정답은 없다지만 일단 정답에 가까운지 확신조차 서지 않음. 그래도 최대한 코드 중복 없게 하려고 처음에 없던 Rule 클래스도 만들고 그랬다.

근데 잘 모르겠다. 

 

일단 완료 된 것 체크

 

1. 참여자는 딜러, 게이머 2명만 존재

2. 카드는 총 52장

 - 무늬(다이아, 클로버, 하트, 스페이스)별로 13장

 - 2~10까지는 그대로 점수 반영

 - J, Q, K는 10점. A는 1점

3. 게임 시작시 참여자는 모두 2장을 받고 시작함

 - 게이머는 추가로 카드를 항상 뽑을 수 있음

 - 딜러는 16점 이하인 경우 반드시 1장 뽑고, 17점 이하인 경우 뽑지 않음

4. 딜러, 게이머의 점수와 비교해서 승부

    - 딜러의 카드 1장은 공개하지 않음

 - 카드 오픈 시 카드의 합이 21에 가까운 쪽이 승리

 

3-2번 규칙을 내가 잘 이해를 못해서 구현을 못 하고 있는 것이 실화?

온라인 블랙잭 몇 번 더 하고 와야겠다 ..

 

(+) 200318 pm15:21 일단 저거 까진 했다. 

 

Card.java

public class Card {

	private String pattern;
	//hearts, spades, diamonds, clubs
	private String number;
	
	public String getPattern() {
		return pattern;
	}
	public void setPattern(String pattern) {
		this.pattern = pattern;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}

}

 

Gamer.java

import java.util.ArrayList;

public class Gamer {

	// hit
	public Card hit(Dealer dealer, ArrayList<Card> deck) {
		Card card = dealer.getCard(deck);
		return card;
	}

}

 

Dealer.java

import java.util.ArrayList;

public class Dealer {

	// 카드 deck 생성하기 
	public ArrayList<Card> setCardDeck() {
		
		ArrayList<Card> deck = new ArrayList<Card>();
		
		for(int i = 0; i < 52; i ++) {
			Card card = new Card(); 
			switch(i%4) {
			case 0 :
				card.setPattern("hearts");
				break;
			case 1 :
				card.setPattern("spades");
				break;
			case 2 :
				card.setPattern("diamonds");
				break;
			case 3 :
				card.setPattern("clubs");
				break;
			}
			
			switch(i%13) {
			case 1 :
				card.setNumber("A");
				break;
			case 2 :
				card.setNumber("2");
				break;
			case 3 :
				card.setNumber("3");
				break;
			case 4 :
				card.setNumber("4");
				break;
			case 5 :
				card.setNumber("5");
				break;
			case 6 :
				card.setNumber("6");
				break;
			case 7 :
				card.setNumber("7");
				break;
			case 8 :
				card.setNumber("8");
				break;
			case 9 :
				card.setNumber("9");
				break;
			case 10 :
				card.setNumber("10");
				break;
			case 11 :
				card.setNumber("J");
				break;
			case 12 :
				card.setNumber("Q");
				break;
			case 0 :
				card.setNumber("K");
				break;				
			}
			
			deck.add(card);
		}
		
		return deck; 
	}
	
	// 카드 나눠 주기 
	public Card getCard(ArrayList<Card> deck) {
		
		int size = deck.size();
		int num = (int)(Math.random() * size);
		Card card = deck.get(num);
		deck.remove(num);
		
		return card;
	}
	
	// 합 17 미만인 경우 이상으로 만들기
	public ArrayList<Card> dealerGetCard(int dealerSum, ArrayList<Card> deck, ArrayList<Card> dealerCard) {
		Dealer dealer = new Dealer(); 
		Rule rule = new Rule(); 
		int sum = dealerSum; 
		
		while(sum < 17) {
			Card card = dealer.getCard(deck);
			dealerCard.add(card);
			sum = rule.getSum(dealerCard);
		}
		
		return dealerCard; 
	}
	
}

 

Rule.java

import java.util.ArrayList;

public class Rule {

	// 카드 출력
	public int printCard(String who, ArrayList<Card> deck) {
		
		Rule rule = new Rule(); 
		int sum = 0; 
		for(int i = 0; i < deck.size(); i++) {
			
			if(i == 0){
				if(who.equals("dealer")) {
					System.out.print("딜러 카드 : ? ");	
				}else {
					System.out.print("게이머 카드 : (" + deck.get(0).getPattern() + ", " + deck.get(0).getNumber() + ") ");
				}
			}else {
				System.out.print("(" + deck.get(i).getPattern() + ", " + deck.get(i).getNumber() + ") ");
				if(who.equals("dealer")) {
					System.out.println();
				}
			}
			
			if(i == deck.size() - 1 && who.equals("gamer")) {
				sum = rule.getSum(deck);
				System.out.println("총합 : " + sum);
			}
			
		}
		
		return sum; 
		
	}
	
	// 카드 합 구하기
	public int getSum(ArrayList<Card> deck) {

		int sum = 0;
		
		for(int i = 0; i < deck.size(); i++) {
			String number = deck.get(i).getNumber();
			if(number.equals("A")) {
				sum += 1;
			}else if(number.equals("J") || number.equals("Q") || number.equals("K")) {
				sum += 10;
			}else {
				sum += Integer.parseInt(number);
			}

		}
		
		return sum; 
	}
	
	// 버스트
	public boolean isBust(String who, int sum) {
		if(sum > 21) {
			System.out.println(who + " Bust (총합 : " + sum + ")");
			return true;
		}else {
			return false; 
		}
	}
	
	// 버스트
	public boolean isBust(int sum) {
		if(sum > 21) {
			return true;
		}else {
			return false; 
		}
	}
	
	// 누가 21이랑 가까운지 비교
	public void whoWin(int dealerSum, int gamerSum) {
		int dealer = 21 - dealerSum;
		int gamer = 21 - gamerSum; 
		String str = "Winner is "; 
		if(dealer > gamer) {
			str += "GAMER";
		}else if(dealer == gamer) {
			str = "DRAW "; 
		}else {
			str += "DEALER";
		}
		
		System.out.println(str + "(딜러 총합 : " + dealerSum + ", 게이머 총합 : " + gamerSum + ")");

	}
}

 

BlackJack.java

import java.util.ArrayList;
import java.util.Scanner;

public class BlackJack {

	public static void main(String[] args) {

		Dealer dealer = new Dealer();
		Gamer gamer = new Gamer();
		Rule rule = new Rule();

		ArrayList<Card> deck = dealer.setCardDeck();

		ArrayList<Card> dealerCard = new ArrayList<Card>();
		ArrayList<Card> gamerCard = new ArrayList<Card>();

		System.out.println("------------BLACKJACK------------");
		System.out.println("카드를 나누겠습니다.");

		dealerCard.add(dealer.getCard(deck));
		dealerCard.add(dealer.getCard(deck));
		gamerCard.add(dealer.getCard(deck));
		gamerCard.add(dealer.getCard(deck));

		int dealerSum = rule.printCard("dealer", dealerCard);
		int gamerSum = rule.printCard("gamer", gamerCard);

		System.out.println("\n---------------------------------");

		while (!(rule.isBust(gamerSum))) {

			System.out.println("1.HIT 2.STAND");

			Scanner sc = new Scanner(System.in);

			// hit 선택한 경우
			if (sc.nextInt() == 1) {
				Card card = gamer.hit(dealer, deck);
				gamerCard.add(card);
				gamerSum = rule.printCard("gamer", gamerCard);
				rule.isBust("Gamer", gamerSum);
			} else {
				// stand 선택한 경우
				dealerCard = dealer.dealerGetCard(dealerSum, deck, dealerCard);
				dealerSum = rule.getSum(dealerCard); 
				if(rule.isBust("Dealer", dealerSum)) {
					break; 
				}
				rule.whoWin(dealerSum, gamerSum);
				break;
			}

		}

	}

}

 

다른 분들이랑도 비교 해봐야지

그리고 코드 관련 글도 올릴 것. 내가 짜고 내가 설명 할 수 있어야지

후기 : 일단 코드는 누구나 짤 수 있다. 근데 효율적으로 잘 짜는게 어려운 것.

 

300x250

'JAVA' 카테고리의 다른 글

이것이 자바다 6장 클래스 정리 #1  (0) 2020.03.26
블랙잭 게임 코드 피드백 #1  (0) 2020.03.25
블랙잭 게임 구현 #1  (0) 2020.03.17
사원 연봉 계산기 #2 (+코드 공유)  (0) 2020.03.16
사원 연봉 계산기 #1  (0) 2019.08.30

댓글