JAVA 프로그래밍

문제

16장의 카드에서 같은 색을 가진 카드 짝을 찾는 문제입니다 이를 해결하는 다음 프로그램을 해석하세요 
11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 11 두번째 카드를 선택하세요: 24
12 13 14 21 22 23 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 13 두번째 카드를 선택하세요: 12
14 21 22 23 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 54 두번째 카드를 선택하세요: 36

11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 13 두번째 카드를 선택하세요: 31
11 12 14 21 22 23 24 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 11 두번째 카드를 선택하세요: 24
12 14 21 22 23 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 41 두번째 카드를 선택하세요: 34
12 14 21 22 23 32 33 42 43 44
첫번째 카드를 선택하세요: 64 두번째 카드를 선택하세요: 17

11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 11 두번째 카드를 선택하세요: 12
13 14 21 22 23 24 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 11 두번째 카드를 선택하세요: 13
12 14 21 22 23 24 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 21 두번째 카드를 선택하세요: 11
12 13 14 22 23 24 31 32 33 34 41 42 43 44
첫번째 카드를 선택하세요: 10 두번째 카드를 선택하세요: 03

알고리즘

프로그램 시작 
   먼저 같은 색 카드 두 장을 선택하면 카드번호 대신 카드색 설정
   카드 게임 현황 출력
      사용자가 선택한 카드이거나 이미 짝을 맞춘 카드는 색깔 출력
      아니면 11 - 44의 카드번호를 출력
   카드 두 장을 새로 선택
      새로 선택한 카드가 11 - 44 사이면 게임 계속 진행
프로그램 종료

프로그램 코드

	// 파일명 : ./Chapter09/CardMatching.java
	import java.util.Scanner;
		 
	public class CardMatching
	{
		// 프로그램 시작 
1		public static void main( String[] args ) {
			Scanner scan = new Scanner( System.in );
			int[][]  output = { { 11, 12, 13, 14 },
			                   { 21, 22, 23, 24 },
			                   { 31, 32, 33, 34 },
			                   { 41, 42, 43, 44 } };
			int[][]  color = { { 0, 1, 2, 7 },
			                  { 3, 5, 6, 0 },
			                  { 2, 4, 6, 3 },
			                  { 4, 5, 1, 7 } };
2			int card1 = -1, card2 = -1, card1Row = -1, card1Column = -1, card2Row = -1, card2Column = -1;
						 
3			do {
				// 먼저 같은 색 카드 두 장을 선택하면 카드번호 대신 카드색 설정 
4				if( ( card1 != card2 ) && ( color[card1Row][card1Column] == color[card2Row][card2Column] ) ) {
					output[card1Row][card1Column] = color[card1Row][card1Column];
5					output[card2Row][card2Column] = color[card2Row][card2Column];
				}
				 
				// 카드 게임 현황 출력 
6				for( int row = 0; row < output.length; row++ ) {
7					for( int column = 0; column < output[0].length; column ++ ) {
						// 사용자가 선택한 카드이거나 이미 짝을 맞춘 카드는 색깔 출력  
8						if( ( output[row][column] <= 7 ) || ( output[row][column] == card1 ) || ( output[row][column] == card2 ) ) {
							System.out.print( " \033[4" + color[row][column] + "m" );
							System.out.print( " \033[" + (row*3+1) + ";" + (column*4+1) + "f    " );
9							System.out.print( " \033[" + (row*3+2) + ";" + (column*4+1) + "f    " );
							System.out.print( " \033[" + (row*3+3) + ";" + (column*4+1) + "f    " );
							System.out.print( " \033[0m" );
						}
						// 아니면 11 - 44의 카드번호를 출력 
10						else {
							System.out.print( " \033[" + (row*3+1) + ";" + (column*4+1) + "f    " );
11							System.out.print( " \033[" + (row*3+2) + ";" + (column*4+1) + "f " + (row+1) + (column+1) + " " );
							System.out.print( " \033[" + (row*3+3) + ";" + (column*4+1) + "f    " );
						}
					}
				}
					 
				// 카드 두 장을 새로 선택 
				System.out.print( " \033[15;1f \033[2K첫번째 카드를 선택하세요: " );
				card1 = scan.nextInt();
				card1Row = card1 / 10 - 1;
12				card1Column = card1 % 10 - 1;
		 
				System.out.print( " \033[16;1f \033[2K두번째 카드를 선택하세요: " );
				card2 = scan.nextInt();
				card2Row = card2 / 10 - 1;
13				card2Column = card2 % 10 - 1;
		 
			// 새로 선택한 카드가 11 - 44 사이면 게임 계속 진행 
14			} while( ( 0 <= card1Row ) && ( card1Row < 4 ) && ( 0 <= card1Column ) && ( card1Column < 4 )
			      && ( 0 <= card2Row ) && ( card2Row < 4 ) && ( 0 <= card2Column ) && ( card2Column < 4 ) );
			scan.close();
		// 프로그램 종료 
15		}
	}

실행 순서

 
 					※ 실행순서 및 메모리상태는 A키(이전) 및 D키(다음)를 눌러도 확인할 수 있습니다