본문 바로가기
Study/Java Study

자바스터디 3주차 (3) [빙고 게임 구현 - 2차원 배열 이용]

by hongchii 2021. 5. 30.
728x90
반응형

2021.05.26 - [Study/Java Study] - 자바스터디 3주차 (2)

 

자바스터디 3주차 (2)

 1. 객체지향언어의 특징 코드의 재사용성이 높다. 코드의 관리가 용이하다. 신뢰성이 높은 프로그래밍을 가능하게 한다. 2. 클래스와 객체의 정의와 용도 클래스의 정의 - 객체를 정의해 놓은

hong-chii.tistory.com

 

자바 스터디를 진행하면서 처음으로 코딩하는 과제가 생겼다.


처음 조건은 위와 같았지만 최종적으로 바뀐 조건은 아래와 같았다.


조건

1. 5 * 5 빙고판 출력
2. 1~25까지의 숫자 랜덤 초기화 (콘솔에 출력금지)
3. 콘솔에 숫자 값 대신 값의 좌표 출력
[0,0][0,1][0,2][0,3][0,4]
[1,0][1,1][1,2][1,3][1,4]
[2,0][2,1][2,2][2,3][2,4]
[3,0][3,1][3,2][3,3][3,4]
[4,0][4,1][4,2][4,3][4,4]
4. 스캐너로 숫자를 입력 받은 뒤 입력 된 숫자 좌표 -> 숫자로 변경하여 출력
5. 1빙고~5빙고 까지 체크
6. 5빙고 후 빙고 게임 종료


1.

우선 빙고판의 갯수가 되어줄 SIZE, 

빙고 숫자를 섞어줄 때 사용할 x, y, tmp

스캐너로 입력받을 숫자 num,

배열에 숫자가 있는지 체크 할 bcnt,

빙고가 몇개인지 체크 할 totCnt 를 초기화했다.

final int SIZE = 5;
int x = 0, y = 0, num = 0;
int bcnt = 0; //
int tmp = 0;
int totCnt = 0; // 빙고 갯수 카운트 

 

 

2.

그리고 처음부터 가장 애를 먹었던건 숫자 대신 좌표를 출력하는 것이었다.

숫자를 입력하기 전에는 좌표를 입력 후엔 숫자를 표시하는게 너무 어렵게 느껴졌다.

계속 시도한 끝에 2차원 배열 2개를 만들었다.
bingo는 좌표 출력용,

bingo2는 입력 된 숫자 저장용,

bingoChk는 빙고가 몇 줄인지 체크해줄 배열이다.

int[][] bingo = new int[SIZE][SIZE]; 
int[][] bingo2 = new int[SIZE][SIZE];
int[][] bingoChk = new int[SIZE][SIZE];

 

 

3.

다음 코드는 빙고판에 들어갈 1~25 숫자를 저장하고 섞는 코드이다.

이 코드는 자바의 정석 예제 코드를 참고했다.

(shuffle코드는 코딩테스트에서 카드 섞기 등 문제를 풀 때 용이하다고 하니 알아주면 좋을 것 같다.)

for (int i = 0; i < SIZE; i++) {
	for (int j = 0; j < SIZE; j++) {
			bingo[i][j] = i * SIZE + j + 1; // 배열에 1~25 저장
	}
}

// 값 뒤섞기 shuffle
for (int i = 0; i < SIZE; i++) {
	for (int j = 0; j < SIZE; j++) {
		x = (int) (Math.random() * SIZE);
		y = (int) (Math.random() * SIZE);

		tmp = bingo[i][j];
		bingo[i][j] = bingo[x][y];
		bingo[x][y] = tmp;
	}
}

 

 

 

4.

shuffle코드를 이용해 빙고판 숫자를 섞어준 후 콘솔에 조건대로 좌표를 출력했다.

0부터 SIZE 까지 의 for문을 돌려서 [0,0]부터 [4,4]까지 출력되게 했다. 

for (int i = 0; i < SIZE; i++) {
	for (int j = 0; j < SIZE; j++) {

		System.out.printf("[%d,%d]", i, j);
		//System.out.printf("%2d ", bingo[i][j]);
	}
	System.out.println();
}

5.

그 다음은 do-while문을 이용해 입력한 숫자(num)가 0이 아닐때 계속 반복문을 돌리게 했다.

do-while문 안에 숫자를 입력받고, 입력받은 숫자를 좌표대신 출력하는 코드이다.

 

스캐너를 통해 num을 입력받는다. 

그리고 for문을 통해 [0,0]~[4,4]까지 반복문을 돌리고 if를 사용해 bingo[i][j]에 입력한 num이 있는지 확인한다.

만약 bingo[i][j]에 num이 있으면, bingo2[i][j]에 bingo[i][j](입력된 num값)을 저장했다.

그리고 bingoChk[i][j]는 0으로 값을 바꿔줬다. (빙고 줄 체크시 0으로 체크하기위해 0을 저장했다.)

 

이렇게 저장을 한 후 입력된 값을 좌표대신 출력하기 위해 for문을 사용하여 bingo2[x][y]값이 0이 아니면 ( 위에서 num을 저장했기 때문에 0이 아니면 num이 저장되어있다.) bingo2[x][y]를 출력했고, 그렇지 않으면 다시 x,y 좌표만 출력했다.

 

여기까지 do-while문 속 [숫자입력 -> 배열에서 숫자 체크 -> 빙고줄 체크를 위한 값 저장] 하는 코드이다.

System.out.print("숫자입력(종료:0)->");
num = scan.nextInt();
			
	for (int i = 0; i < SIZE; i++) {
		for (int j = 0; j < SIZE; j++) {
	
		if (bingo[i][j] == num) { // 입력 숫자와 빙고판 숫자 비교

		bingo2[i][j] = bingo[i][j]; // 같으면 bingo2에 값 저장
		bingoChk[i][j] = 0;

		for (x = 0; x < SIZE; x++) { // bingo2 값 체크를 위한 for문
			for (y = 0; y < SIZE; y++) {

			if (bingo2[x][y] != 0) { // bingo2에 저장된 값 모두 출력하기 위한 if문

				System.out.printf("%4d ", bingo2[x][y]);

			} else {
				System.out.printf("[%d,%d]", x, y); // 0인 것들 좌표 출력
			}
		}

		System.out.println();
	 }

	}

 }

}

 

6.

그리고 이 코드는 다시 do-while문의 처음으로 돌아가고, 빙고줄 수를 체크한다.

for문을 통해서 가로줄/ 세로줄에 0이 저장되어있는지 체크한다. 

0이 저장되어있으면 입력된 숫자라는 뜻이므로 bcnt값을 증가시키고 bcnt값이 5가 되었을때 totCnt를 증가시켜준다.

그리고 bcnt는 다시 0으로 초기화한다.

같은 방법으로 세로 줄도 체크를하고, 대각선 빙고는 각 배열 좌표를 0과 비교하여 전부 0일때 totCnt를 증가시켰다.

for (int i = 0; i < SIZE; i++) {
	// 가로 빙고 체크
	for (int j = 0; j < SIZE; j++) {
		if (bingoChk[i][j] == 0) 
			bcnt++;
					
	}
		if (bcnt == 5) 
			++totCnt;
			bcnt = 0;
				
	// 세로 빙고 체크
	for (int j = 0; j < SIZE; j++) {
		 if (bingoChk[j][i] == 0) 
		    bcnt++;
					
	}
		 if (bcnt == 5) 
		     ++totCnt;
		     bcnt = 0;
				
}


	// 대각선 빙고 체크 
	if (bingoChk[0][0] == 0 && bingoChk[1][1] == 0 && 
			bingoChk[2][2] == 0 && bingoChk[3][3] == 0 && bingoChk[4][4] == 0)
		++totCnt;
	if (bingoChk[0][4] == 0 && bingoChk[1][3] == 0 &&
			bingoChk[2][2] == 0 && bingoChk[3][1] == 0 && bingoChk[4][0] == 0)
		++totCnt;

 

7.

그리고 totCnt의 숫자가 1이면 1빙고, 2면 2빙고~ 5빙고까지 출력하고 5빙고가 되면 break를 만나 빙고게임이 종료된다.

// 빙고 출력하기 
if (totCnt == 1) {
	System.out.println(" 1빙고");
	totCnt = 0;
} else if (totCnt == 2) {
	System.out.println(" 2빙고");
	totCnt = 0;
} else if (totCnt == 3) {
	System.out.println(" 3빙고");
	totCnt = 0;
	//break;
} else if (totCnt == 4) {
	System.out.println(" 4빙고");
	totCnt = 0;
} else if (totCnt == 5) {
	System.out.println(" 5빙고! 빙고 끝!");
	break;
}

 

 

 

 

이렇게 빙고 게임을 구현해봤다.

 

 

 

 

 

 

 

 

 

다음은 전체 코드이다.

package Study01;

import java.util.Scanner;

public class Bingo {

	public static void main(String[] args) {
		final int SIZE = 5;
		int x = 0, y = 0, num = 0;
		int bcnt = 0; //
		
		int tmp = 0;
		

		int totCnt = 0; // 빙고 갯수 카운트 

		int[][] bingo = new int[SIZE][SIZE];
		int[][] bingo2 = new int[SIZE][SIZE];
		int[][] bingoChk = new int[SIZE][SIZE];

		Scanner scan = new Scanner(System.in);

		for (int i = 0; i < SIZE; i++) {
			for (int j = 0; j < SIZE; j++) {
				bingo[i][j] = i * SIZE + j + 1; // 배열에 1~25 저장
			}
		}

		for (int i = 0; i < SIZE; i++) {
			for (int j = 0; j < SIZE; j++) {
				bingoChk[i][j] = 1;
			}
		}

		for (int i = 0; i < SIZE; i++) {
			for (int j = 0; j < SIZE; j++) {
				x = (int) (Math.random() * SIZE);
				y = (int) (Math.random() * SIZE);

				tmp = bingo[i][j];
				bingo[i][j] = bingo[x][y];
				bingo[x][y] = tmp;
			}
		}

		
			for (int i = 0; i < SIZE; i++) {
				for (int j = 0; j < SIZE; j++) {

					System.out.printf("[%d,%d]", i, j);
					//System.out.printf("%2d ", bingo[i][j]);
				}
				System.out.println();
			}
		

		do {

			for (int i = 0; i < SIZE; i++) {
				// 가로 빙고 체크
				for (int j = 0; j < SIZE; j++) {
					if (bingoChk[i][j] == 0) 
						bcnt++;
					
				}
				if (bcnt == 5) 
					++totCnt;
					bcnt = 0;
				
				// 세로 빙고 체크
				for (int j = 0; j < SIZE; j++) {
					if (bingoChk[j][i] == 0) 
						bcnt++;
					
				}
				if (bcnt == 5) 
					++totCnt;
					bcnt = 0;
				
			}
				// 대각선 빙고 체크 
			if (bingoChk[0][0] == 0 && bingoChk[1][1] == 0 && 
					bingoChk[2][2] == 0 && bingoChk[3][3] == 0 && bingoChk[4][4] == 0)
				++totCnt;
			if (bingoChk[0][4] == 0 && bingoChk[1][3] == 0 &&
					bingoChk[2][2] == 0 && bingoChk[3][1] == 0 && bingoChk[4][0] == 0)
				++totCnt;

				
			
			// 빙고 출력하기 
			if (totCnt == 1) {
				System.out.println(" 1빙고");
				totCnt = 0;
			} else if (totCnt == 2) {
				System.out.println(" 2빙고");
				totCnt = 0;

			} else if (totCnt == 3) {
				System.out.println(" 3빙고");
				totCnt = 0;
				//break;
			} else if (totCnt == 4) {
				System.out.println(" 4빙고");
				totCnt = 0;

			} else if (totCnt == 5) {
				System.out.println(" 5빙고! 빙고 끝!");
				break;
			}

			System.out.print("숫자입력(종료:0)->");
			num = scan.nextInt();
			
				
			
			for (int i = 0; i < SIZE; i++) {
				for (int j = 0; j < SIZE; j++) {
	
					if (bingo[i][j] == num) { // 입력 숫자와 빙고판 숫자 비교

						bingo2[i][j] = bingo[i][j]; // 같으면 bingo2에 값 저장
						bingoChk[i][j] = 0;

						for (x = 0; x < SIZE; x++) { // bingo2 값 체크를 위한 for문
							for (y = 0; y < SIZE; y++) {

								if (bingo2[x][y] != 0) { // bingo2에 저장된 값 모두 출력하기 위한 if문

									System.out.printf("%4d ", bingo2[x][y]);

								} else {
									System.out.printf("[%d,%d]", x, y); // 0인 것들 좌표 출력
								}
							}

							System.out.println();
						}

					}

				}

			}

		} while (num != 0);
		scan.close();
		System.out.println("빙고 종료");
	}

}

 

728x90
반응형

'Study > Java Study' 카테고리의 다른 글

자바스터디 4주차 (2)  (0) 2021.06.01
자바스터디 4주차 (1)  (0) 2021.05.31
자바스터디 3주차 (2)  (0) 2021.05.26
자바스터디 3주차 (1)  (0) 2021.05.24
자바스터디 2주차 (2)  (0) 2021.05.23

댓글