본문 바로가기
study/Java

[Java] 33. SutdaCard 클래스 구현하기

by 금이패런츠 2022. 3. 31.
728x90
반응형
package chap13;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
 * SutdaCard 클래스 구현하기
 *   멤버 변수 : int num, boolean isKwang;
 *   생성자 : 멤버값들을 입력받아 객체 생성.
 *          매개변수가 없는 경우 num=1, isKwang=true인 객체 생성
 *   멤버 메서드 : toString() 오버라이딩
 *              1K,1,2 ,,,,       
 */
class SutdaCard {
	int num;
	boolean isKwang;
	SutdaCard() {
		this(1,true);
	}
	SutdaCard(int num, boolean isKwang) {
		this.num = num;
		this.isKwang = isKwang;
	}
	@Override
	public String toString() {
		return num + ((isKwang)?"K":"");
	}
}
/*
 * SutdaDeck 클래스
 *   멤버 변수 : List<SutdaCard> cards;
 *            static Map<String,Integer> jokbo;
 *   생성자 : 매개변수 없음. //클래스와 이름이 같음
 *          SutdaCard 20장을 cards List 객체에 저장
 *          1~10의 숫자를 가진 카드가 각각 2장씩.
 *          숫자값이 1,3,8인 카드 중 한장은 isKwang이 true임.
 *   메서드 : SutdaCard pick() 
 *          첫번째 카드를 제거하여 리턴.
 *          void shuffle() 
 *          cards 섞어 주는 기능.  Collections.shuffle 메서드 이용                
 */
class SutdaDeck {
	List<SutdaCard> cards;
	static Map<String,Integer> jokbo; //클래스변수
	//static 초기화 블럭 : 클래스정보 도르 될 때 한번 실행.
	//                  클래스변수의 초기화 담당 영역
	static { 
	    System.out.println("static 초기화블럭");
		jokbo = new HashMap<>();
		jokbo.put("KK", 4000);
		for(int i=1; i<=10; i++) {
			jokbo.put("" + i + i, 3000 + (i * 10));
		}
		jokbo.put("12", 2060);		jokbo.put("21", 2060);
		jokbo.put("14", 2050);		jokbo.put("41", 2050);
		jokbo.put("19", 2040);		jokbo.put("91", 2040);
		jokbo.put("110", 2030);		jokbo.put("101", 2030);
		jokbo.put("410", 2020);		jokbo.put("104", 2020);
		jokbo.put("64", 2010);		jokbo.put("46", 2010);
	}
	SutdaDeck() { //생성자 : 인스턴스변수의 초기화
		cards = new ArrayList<>();
		for(int i=0; i<20; i++) {
			cards.add(new SutdaCard(i%10+1,((i==0 || i==2 || i==7)?true:false)));
		}
		System.out.println(cards);
	}
	SutdaCard pick() {
		//List 객체에서 0번인덱스의 객체를 제거, 반환
		return cards.remove(0);
	}
	void shuffle() {
		Collections.shuffle(cards);
		System.out.println(cards);
	}
}

/*
 * Gamer 클래스
 *   멤버 변수 :  String name
 *             SutdaCard c1,c2
 *   생성자 : 멤버변수값을 입력받아 객체 생성. 
 *   멤버변수 : 
 *   int getScore() : c1,c2 카드의 점수 리턴
 *              c1,c2 카드가 jokbo에 있는 경우 jokbo 점수 리턴
 *              jokbo에 없는 경우 (c1.num + c2.num)%10 리턴         
 *   String toString 오버라이딩
 *              이름과 카드2장을 문자열로 리턴        
 */
class Gamer {
	String name;
	SutdaCard c1,c2;
	public Gamer(String name, SutdaCard c1, SutdaCard c2) {
		this.name = name;
		this.c1 = c1;
		this.c2 = c2;
	}
	int getScore() {
		Integer score = 0;
		if(c1.isKwang && c2.isKwang) {
			score = SutdaDeck.jokbo.get("KK");
		}else {
			score = SutdaDeck.jokbo.get("" + c1.num + c2.num);
			if(score == null) {
				score = (c1.num + c2.num) % 10;
			}
		}
		return score;
	}
	public String toString() {
		return name +"(" + c1 + "," + c2 + ")" + getScore();
	}
}
public class SutdaEx1 {
	public static void main(String[] args) {
		System.out.println("main 메서드 시작");
		SutdaDeck deck = new SutdaDeck();
		deck.shuffle();
		
		List<Gamer> list = new ArrayList<>();
		list.add(new Gamer("임완준",deck.pick(),deck.pick()));
		list.add(new Gamer("김호기",deck.pick(),deck.pick()));
		list.add(new Gamer("장동해",deck.pick(),deck.pick()));
		list.add(new Gamer("김상암",deck.pick(),deck.pick()));
		list.add(new Gamer("정현수",deck.pick(),deck.pick()));
		list.add(new Gamer("정승환",deck.pick(),deck.pick()));
		list.add(new Gamer("조상우",deck.pick(),deck.pick()));
		list.add(new Gamer("최효창",deck.pick(),deck.pick()));
		list.add(new Gamer("홍석범",deck.pick(),deck.pick()));
		list.add(new Gamer("조성규",deck.pick(),deck.pick()));
		for(Gamer g : list)
			System.out.println(g);
		
		System.out.println("deck에 남은 카드의 갯수:" + deck.cards.size());
		System.out.println(deck.cards);
		//Gamer 중 가장 높은 점수를 가진 Gamer의 이름을 출력하기
		//name 승리
		//2명의 점수가 같은 경우 비김 출력
		Collections.sort(list,(g1,g2)->g2.getScore() - g1.getScore());
		if(list.get(0).getScore() == list.get(1).getScore())
			System.out.println("비김.");
		else
			System.out.println(list.get(0).name + " 승리");
	}
}
728x90
반응형