# 12. Java 11일차(230829) [국비교육]

brand_mins·2023년 8월 29일

Java

목록 보기
12/47
- 2개의 실습 프로그램 저녁 때 한번 더 한 줄 작성 후 이해하면서 공부.
- 배열 관련 은행 프로그램은 내일 실습하면서 코드한줄씩 읽기

1. 블랙잭 게임 구현

(1) 블랙잭 게임구현

  • 꾸준히 반복해서 구현해보기.
// 현실세계의 카드를 컴퓨터에 넣기
		int deck[] = new int[52];
		// deck에 카드 넣기
		for(int i=0; i<deck.length; i++) {
			deck[i] = i;
		}
		// deck 모든 카드 출력
		for(int i=0; i<deck.length; i++) {
			System.out.println(deck[i] + " ");
		}
		String cardShape[] = {"크로바", "다이아몬드", "하트", "스페이드"};
		// 카드모양 찍기
		for(int i=0; i<deck.length; i++) {
			System.out.println(cardShape[deck[i]/13]);
		}
		// 카드번호 찍기
		String cardNumber[] = {"A", "2","3","4","5","6","7","8","9","10","J","Q","K"};
		// 카드 모양과 번호찍기
		for(int i=0; i<deck.length; i++) {
    		System.out.println(cardShape[deck[i] / 13] + cardNumber[deck[i]%13]);
		}
		// deck배열에 있는 모두 다른 카드 식별숫자를 가짐.
		// 카드모양 개수 4개, 하나의 모양당 13장: 52%13: 모양.
		// 식별번호: 0 : 스페이드 A, 1 : 스페이드2, 13: 클로버A...		
		// 카드 섞는방법: 0번 인덱스의 카드 번호와 랜덤하게 하나의 수를 얻어온 인덱스 교환작업
		for(int i=0; i<900000; i++) {
			int randomCard = (int)(Math.random()*52);
			int cardTemp = deck[0];
			deck[0] = deck[randomCard];
			deck[randomCard] = cardTemp;
		}		
		// 섞은 카드 출력
		for(int i=0; i<deck.length; i++) {
			System.out.println(deck[i] + " : " + cardShape[deck[i]/13] + cardNumber[deck[i] % 13]);
		}		
		int deckIndex = 0; // deck카드묶음에서 카드 사용 유무 인덱스
		int[] p1Deck = new int[11]; // 플레이어1 카드 묶음
		int[] p2Deck = new int[11]; // 플레이어2 카드 묶음
		int p1DeckIndex = 0; // 플레이어1 카드 갯수 
		int p2DeckIndex = 0; // 플레이어2 카드 갯수		
		// 덱에서 카드를 꺼내서 각각의 플레이어 덱에 넣기
		// 덱에서 카드1장꺼내서 플레이어1 넣기
		p1Deck[p1DeckIndex] = deck[deckIndex];
		p1DeckIndex++;
		deckIndex++;		
		// 덱에서 카드 1장 꺼내서 플레이어2 넣기
		p2Deck[p2DeckIndex] = deck[deckIndex];
		p2DeckIndex++;
		deckIndex++;		
		// 덱에서 카드를 꺼내서 각각의 플레이어 덱에 넣어보자 2번 진행.
		// 덱에서 카드 1장꺼내서 플레이어 1넣기
		p1Deck[p1DeckIndex] = deck[deckIndex];
		p1DeckIndex++;
		deckIndex++;		
		// 덱에서 카드 1장 꺼내서 플레이어 2 넣기
		p2Deck[p2DeckIndex] = deck[deckIndex];
		p2DeckIndex++;
		deckIndex++;
		p2Deck[p2DeckIndex++] = deck[deckIndex++];		
		// 이미 사용한 카드 목록 출력
		System.out.println("이미 사용한 카드 목록은 ");
		for(int i=0; i<deckIndex; i++) { 
			System.out.println(cardShape[deck[i] / 13] + cardNumber[deck[i] % 13]);
		}
		// 다음 사용할 카드
		System.out.println("다음 사용할 카드는 " + cardShape[deck[4]/13] + cardNumber[deck[4] % 13]);		
		// 다음 사용할 카드 목록
		System.out.println("다음 사용할 카드 목록은 ");
		for(int i=0; i<deckIndex; i++) {
			System.out.println(cardShape[deck[4 + i] / 13] + cardNumber[deck[4 + i] % 13]);
		}
		System.out.println("p1의 카드 목록은 ");
		for(int i=0; i<p1DeckIndex; i++) {
			System.out.println(cardShape[p1Deck[i] / 13] + cardNumber[p1Deck[i] % 13]);
		}
		System.out.println("p2의 카드 목록은 ");
		for(int i=0; i<p2DeckIndex; i++) {
			System.out.println(cardShape[p2Deck[i] / 13] + cardNumber[p2Deck[i] % 13]);
		}		
		int p1Sum = 0;
		int p2Sum = 0;
		boolean isP1PlayFlag = true; // p1의 게임진행상태
		boolean isP2PlayFlag = true;
		while(isP1PlayFlag || isP2PlayFlag) {
			if(isP1PlayFlag) {
				System.out.print("p1님 카드를 더 받으시겠습니까? 1. yes 2. no");
				String input = new Scanner(System.in).nextLine();
				if(input.equals("1")) {
					p1Deck[p1DeckIndex++] = deck[deckIndex++];
				} else {
					isP1PlayFlag = false;
				}
			}
			// 각 플레이어가 가진 카드 총 점수를 구하시오.
			// A 1 또는 11 2~10카드는 카드 번호대로 j,q,k는 10점
			System.out.print("p1Card: ");
			p1Sum=0;
			for(int i=0; i<p1DeckIndex; i++) {
				// p1Sum = p1Sum + p1Deck[i] % 13;
				if(p1Deck[i]%13<1) { // A일때
					p1Sum = p1Sum + 11;					
				} else if(p1Deck[i]%13 < 10) { //2~10일때
					p1Sum = p1Sum + p1Deck[i] % 13 + 1;
				} else {
					p1Sum = p1Sum + 10;
				}
			}			
			// 카드 목록에 A가 들어있고 p1Sum가 21넘으면 A를 1로 더해주는 작업
			for(int i=0; i<p1DeckIndex; i++) {
				if(p1Sum<=21) {
					break;
				} 
				if(p1Deck[i]%13 == 0) {
					p1Sum = p1Sum - 10;
				}
			}
			System.out.println("총합: " + p1Sum);
			for(int i=0; i<p1DeckIndex; i++) {
				System.out.print(cardShape[p1Deck[i] / 13] + cardNumber[p1Deck[i] % 13] + " ");
			}
			System.out.println();
			if(p1Sum>21) {
				System.out.println("21를 초과하였습니다");
				break;
			} 
			System.out.print("p2Card: ");
			p2Sum=0;
			for(int i=0; i<p2DeckIndex; i++) {
				// p1Sum=p1Sum + p1Deck[i]%13;
				if(p2Deck[i]%13 < 1) { // a일때
					p2Sum = p2Sum + 11;
				} else if(p2Deck[i]%13<10) {
					p2Sum = p2Sum + p2Deck[i] % 13 + 1;
				} else {
					p2Sum = p2Sum + 10;
				}
			}
			for(int i=0; i<p2DeckIndex; i++) {
				if(p2Sum<=21) {
					break;
				}
				if(p2Deck[i]%13 == 0) {
					p2Sum = p2Sum - 10;
				}
			}
			System.out.println("총합: " + p2Sum);
			for(int i=0; i<p2DeckIndex; i++) {
				System.out.print(cardShape[p2Deck[i]/13] + cardNumber[p2Deck[i] % 13] + " ");
			}
			System.out.println();
			if(p2Sum>21) {
				System.out.println("21를 초과하였습니다.");
				break;
			}
			// 받은 카드의 총합을 구하시오
			// 플레이어 중 한명이 받은 카드 합이 21를 초과하면 플레이를 종료.			
		}
		// 승패 계산하기
		String winner = "";
		if(p1Sum>21) {
			winner = "p2승리";
		} else if(p2Sum>21) {
			winner = "p1승리";
		} else if(p1Sum>p2Sum) {
			winner = "p1승리";
		} else if(p1Sum == p2Sum) {
			winner = "무승부";
		} else {
			winner = "p2승리";
		}
		System.out.println("최종 결과: " + winner);
		System.out.println("게임종료");
profile
IT 개발자가 되기 위한 기록

0개의 댓글