Card.java
- 카드 클래스이다.
public class Card {
// 상수들, 바뀔 필요가 없기에 final로 정의하였고 getter, setter 함수가 없어도 된다. (상수기 떄문에)
public final int suitNumber;
public final int rankNumber;
// 생성자 인수 : 카드 종류, 카드 랭크
public Card(int suitNumber, int rankNumber) {
this.suitNumber = suitNumber;
this.rankNumber = rankNumber;
}
// suitNumber의 getter
// 현재카드의 suitNumber를 문자열출력의 모양으로 바꾼다.
public String getSuit() {
String suit = null;
switch (this.suitNumber) {
case 1: {
suit = "Clubs";
break;
}
case 2: {
suit = "Hearts";
break;
}
case 3: {
suit = "Diamonds";
break;
}
case 4: {
suit = "Spaces";
break;
}
default: {
System.out.println("1,2,3,4 중 하나의 값만 입력하세요.");
break;
}
}
return suit;
}
// suitRank의 getter
// 현재카드의 suitRank를 문자열출력의 모양으로 바꾼다.
public String getRank() {
String rank = null;
switch (this.rankNumber) {
case 1: {
rank = "Ace";
break;
}
case 2: {
rank = "2";
break;
}
case 3: {
rank = "3";
break;
}
case 4: {
rank = "4";
break;
}
case 5: {
rank = "5";
break;
}
case 6: {
rank = "6";
break;
}
case 7: {
rank = "7";
break;
}
case 8: {
rank = "8";
break;
}
case 9: {
rank = "9";
break;
}
case 10: {
rank = "10";
break;
}
case 11: {
rank = "Jack";
break;
}
case 12: {
rank = "Queen";
break;
}
case 13: {
rank = "King";
break;
}
default: {
System.out.println("1 ~ 13 중 하나의 값만 입력하세요.");
break;
}
}
return rank;
}
//String 함수의 toString 함수의 오버라이드
@Override
public String toString(){
return this.getRank() + " of " + this.getSuit();
}
}
Deck.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
// 카드들을 모아둔 Deck 클래스 이므로 카드 ArrayList가 존재한다.
public class Deck {
private ArrayList<Card> cards = new ArrayList<>();
// 카드리스트를 private으로 설정하여 getter 메소드
public ArrayList<Card> getCards() {
return this.cards;
}
// 카드덱에 카드를 넣는 add 메소드
public void addCard(Card card) {
this.cards.add(card);
}
// 덱안의 카드를 보여주는 print 메소드
public void print() {
for (Card card : this.cards) {
//System.out.println(card); <- toString을 오버라이드 하였으므로 같은 역할을 수행한다.
System.out.println(card.toString());
}
}
// 카드덱 안의 카드들을 랜덤으로 섞는다.
public void shuffle() {
Random random = new Random();
int shuffleTimes = random.nextInt(46);
for (int i = 0; i < shuffleTimes; i++) {
int shuffleCard1 = random.nextInt(this.cards.size());
int shuffleCard2 = random.nextInt(this.cards.size());
Collections.swap(this.cards, shuffleCard1, shuffleCard2);
}
//Collections.shuffle(this.cards); 위 전체 코드와 같은 역할을 수행한다.
}
// 덱의 마지막 부분 5장을 가져와서 dealing 한다.
public Deck deal(int count){
Deck hand = new Deck();
for (int i = 0; i < count; i++) {
hand.addCard(this.cards.get(cards.size() - 1));
this.cards.remove(this.cards.size() -1);
}
return hand;
}
}
- 카드를 넣어놓는 덱 클래스이다.
- 셔플을 하고 손안에 dealing한다.
public class Main {
public static void main(String[] args) {
// 52장 스탠다드 카드 덱 생성
Deck standardDeck = new Deck();
for (int suit = 1; suit <= 4; suit++) {
for (int rank = 1; rank <= 13; rank++) {
Card newCard = new Card(suit, rank);
standardDeck.addCard(newCard);
}
}
// 카드 셔플
standardDeck.shuffle();
// 딜링
Deck hand1 = standardDeck.deal(5);
Deck hand2 = standardDeck.deal(5);
// 각 핸드 출력
hand1.print();
System.out.println("----------");
hand2.print();
}
}
King of Spaces
4 of Spaces
Jack of Spaces
10 of Spaces
9 of Spaces
----------
8 of Spaces
7 of Spaces
King of Diamonds
5 of Spaces
Queen of Spaces
BlackjackCard.java
- Card 클래스를 상속받아 만든 클래스이다.
- value 라는 블랙잭 카드가치가 추가되었고 이를 위한 getter, 생성자 변경이있다.
- Ace라는 카드를 구분하는 메소드도 추가된다.
public class BlackjackCard extends Card {
// 블랙잭게임에서의 카드의 가치
public final int value;
// 생성자 : 인수 suitNumber, rankNumber
public BlackjackCard(int suitNumber, int rankNumber) {
// 부모클래스의 생성자 기능을 받고
super(suitNumber, rankNumber);
// value 값의 지정을 해준다.
if (this.getRank().equals("Ace")) {
this.value = 11;
} else if (this.getRank().equals(("Jack")) || this.getRank().equals(("King")) || this.getRank().equals(("Queen"))) {
this.value = 10;
} else if (this.getRank().equals(("2"))) {
this.value = 2;
} else if (this.getRank().equals(("3"))) {
this.value = 3;
} else if (this.getRank().equals(("4"))) {
this.value = 4;
} else if (this.getRank().equals(("5"))) {
this.value = 5;
} else if (this.getRank().equals(("6"))) {
this.value = 6;
} else if (this.getRank().equals(("7"))) {
this.value = 7;
} else if (this.getRank().equals(("8"))) {
this.value = 8;
} else if (this.getRank().equals(("9"))) {
this.value = 9;
} else {
System.out.println("숫자값이 Ace, Jack, King, Queen, 2~9값이 아닙니다.");
this.value = -1;
}
}
// 블랙잭카드의 value getter
public int getValue() {
return this.value;
}
// 블랙카드는 1혹은 11모두 있을 수 있으므로 Ace인지 확인하는 메소드
public boolean isAce() {
if (this.getRank().equals("Ace") || this.getRank().equals("11")) {
return true;
} else {
return false;
}
}
}
public class Main {
public static void main(String[] args) {
BlackjackCard card1 = new BlackjackCard(1, 1);
BlackjackCard card2 = new BlackjackCard(2, 6);
BlackjackCard card3 = new BlackjackCard(4, 12);
System.out.println(card1.getValue());
System.out.println(card1.isAce());
System.out.println(card2.getValue());
System.out.println(card2.isAce());
System.out.println(card3.getValue());
System.out.println(card3.isAce());
}
}
11
true
6
false
10
false
BlackjackHand.java
- Deck을 확장해서 만든 class이다.
- 모든 것을 상속받으며 BlackjackCard 캐스팅을 사용한다.
import java.util.ArrayList;
// Deck 상속
public class BlackjackHand extends Deck {
// 손에 갖고 있는 카드들의 가치를 반환
public int getValue(){
// Ace 카드가 있는가?
boolean isAce = false;
// 핸드의 총가치
int totalValue = 0;
// 핸드의 카드들에서 카드를 하나씩 꺼내어 계산
for (Card card: this.cards) {
// 이카드가 Ace인가?
isAce = ((BlackjackCard)card).isAce();
// 이카드의 가치는?
int value = ((BlackjackCard)card).getValue();
totalValue += value;
}
// 핸드에 에이스카드가 있고 총가치의 합이 21이 넘으면 핸드의 에이스는 1의 값을 가지므로
if (isAce == true && totalValue > 21){
totalValue -= 10;
}
return totalValue;
}
// 파산했는가?
public boolean isBusted(){
boolean busted = false;
// 핸드의 값이 21이 넘으면 파산
if (getValue() > 21){
busted = true;
}
return busted;
}
// 블랙잭인가?
public boolean isBlackjack(){
boolean isBlackjack = false;
// 핸드에 카드가 2개밖에 업고 가치가 21이면 블랙잭
if (this.cards.size() == 2 && getValue() == 21){
isBlackjack = true;
}
return isBlackjack;
}
}
'Programming language > Java' 카테고리의 다른 글
Java - 13 [Generic, 인터페이스] (0) | 2020.10.21 |
---|---|
Java - 12 [캐스팅] (0) | 2020.10.19 |
Java - 11 [Random , Collections] (0) | 2020.10.19 |
Java - 10 [protected 접근제어자, Object 클래스] (0) | 2020.10.19 |
Java - 9 [상속, super] (1) | 2020.10.18 |