본문 바로가기
Language/JAVA

과제 빙고 프로젝트

by jun.s.gi 2022. 11. 19.
728x90

1. 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 랜덤하게 5 X 5 배열에 생성

import java.util.*;
public class Bingo {

	public static void main(String[] args) throws InterruptedException {
		Random rnd = new Random();
		Object[][] bingo = new Object[5][5];
		int[] freq = new int[26]; // 중복 방지를 위한 빈도배열
		//빙고판 세팅
		for(int set = 0 ; set < 5 ; set++) {
			for(int ting = 0 ; ting < 5 ; ting++) {
				int num = rnd.nextInt(25)+1;
				if (freq[num] == 1) {
					ting--;
					continue;
				}
				else {
					freq[num] ++;
					bingo[set][ting] = num;
				}
			}
		}

 

 

2. 다음으로 1~25까지의 자연수 중에서 한 번씩만 선택되어야 선택된 수를 하나씩 아래에 출력되도록 한다. 1초에 한 수씩 선택되도록 하며 아래와 같이 3개의 선(가로, 세로, 대각선 포함)이 이루어질 때 프로그램을 종료한다.

		int count = 0, game; // 게임 횟수, 게임 점수
		int[] col = new int[5]; // 빙고판 가로 계산용 배열
		int[][] dia = new int[2][5]; // 빙고판 대각선 계산용 배열
		int[] row = new int[5]; // 빙고판 세로 계산용 배열
		int[] cho = new int[25]; // 선택된 수 출력용 배열
		freq = new int[26]; // 초기화
		do {
			game = 0; // 3점을 못 넘기면 초기화
			int num = rnd.nextInt(25)+1;
			
			if(freq[num] == 1) { // 중복 방지
				continue;
			}else {
				freq[num]++;
				cho[count] = num;
				count++;
				
				for(int i = 0 ; i < 5 ; i++) {
					for(int j = 0 ; j < 5 ; j++) {
						if(bingo[i][j].equals(num)) { // 랜덤 번호의 인덱스 
							col[i]++;
							row[j]++;
							bingo[i][j] = "★";
							
							if(i == j) { // 왼쪽 위에서 오른쪽 아래 방향 대각선
								dia[0][j]++;
							}else if (j + i == 4 && j != 2 && i != 2) { // 오른쪽 위에서 왼쪽 아래로 향하는 대각선 방향과 [2][2] 중복 플러스 방지
								dia[1][j]++;
							}
							
						}
					}
				}
				
			}

 

1 19 6 2  
14 7 16 2  
8 12 4 2  
23 5 15 2  
9 18 3 10 1  
1 1 3 1 3 row[] \ col[]  
            방향
dia[0][] 0 1 0 0 1 왼쪽 위에서 오른쪽 아래
dia[1][0] 1 0 0 0 0 오른쪽 위에서 왼쪽 아래

row, col, dia 배열은 빙고판을 제어하기위한 배열이다. 위 표와 같이 row 배열에는 세로를 기준으로 별을 세고, col배열은 가로를 기준으로 별을 센다. dia배열은 빈도배열처럼 별이 있으면 1 없으면 0으로 별의 개수를 제어한다.

 

 

 

 

	
			for(int data : row) {
				if(data == 5) game++;
			}
			for(int data : col) {
				if(data == 5) game++;
			}
			for(int i = 0 ; i < dia.length ; i++) {
				int checksum = 0; // 두 배열이 0 또는 1이라 한 행의 합이 5면 빙고
				for(int j = 0 ; j < dia[i].length ; j++) {
					checksum += dia[i][j];
				}
				if(checksum == 5) game++;
			}
			
			
			//출력
			for(int i = 0 ; i < 5 ; i++) {
				for(int j = 0 ; j < 5 ; j++) {
					System.out.printf("%5s",bingo[i][j]);
				}System.out.println();
			}
			
			System.out.print("선택된 수 : ");
			for(int choice : cho) { // cho는 컴퓨터가 랜덤으로 선택한 수를 담는 배열
				if(choice != 0)System.out.print(choice+" ");
			}System.out.println("\n");
			Thread.sleep(1000); // 1초마다 출력을 위해 처음 지연 출력
		}while(game < 3);
		System.out.println(count+"번 만에 빙고!");
		
	}
	
}

행과 열에 대한 별의 개수를 담은 row, col은 한 요소가 5라면 특정 행 또는 열이 별이 5개로 채워졌다는 뜻이므로 빙고(게임 점수 +1), dia 배열은 frequency배열과 비슷하게 별이 있으면 1 없으면 0으로 되어었으므로 한 행의 합이 5라면 대각선 빙고(점수 +1)

 

 

실제 출력

 

 

만들고나보니 row배열과 col배열을 따로 두지 않고 2차원 배열로 만들어 dia 배열과 비슷하게 [0][]은 row담당, [1][]은 col담당으로해서 만들면 한 줄이라도 줄일 수 있겠다는 생각을 했고, 아직 경험이 부족해 이 작은 프로그램을 짜는데 생각보다 시간이 오래걸렸다. 작은 것이라도 또는 클론 코딩을 하더라도 이해를 한 상태에서 무언갈 계속 만들어 봐야겠다는 생각이 든다,,

 

 

전체 코드

package quiz;
import java.util.*;
public class Bingo {

	public static void main(String[] args) throws InterruptedException {
		Random rnd = new Random();
		Object[][] bingo = new Object[5][5];
		int[] freq = new int[26]; // 중복 방지를 위한 빈도배열
		//빙고판 세팅
		for(int set = 0 ; set < 5 ; set++) {
			for(int ting = 0 ; ting < 5 ; ting++) {
				int num = rnd.nextInt(25)+1;
				if (freq[num] == 1) {
					ting--;
					continue;
				}
				else {
					freq[num] ++;
					bingo[set][ting] = num;
				}
			}
		}
		
		
		int count = 0, game; // 게임 횟수, 게임 점수
		int[] col = new int[5]; // 빙고판 가로 계산용 배열
		int[][] dia = new int[2][5]; // 빙고판 대각선 계산용 배열
		int[] row = new int[5]; // 빙고판 세로 계산용 배열
		int[] cho = new int[25]; // 선택된 수 출력용 배열
		freq = new int[26]; // 초기화
		do {
			game = 0; // 3점을 못 넘기면 초기화
			int num = rnd.nextInt(25)+1;
			
			if(freq[num] == 1) { // 중복 방지
				continue;
			}else {
				freq[num]++;
				cho[count] = num;
				count++;
				
				for(int i = 0 ; i < 5 ; i++) {
					for(int j = 0 ; j < 5 ; j++) {
						if(bingo[i][j].equals(num)) { // 랜덤 번호의 인덱스 
							col[i]++;
							row[j]++;
							bingo[i][j] = "★";
							
							if(i == j) { // 왼쪽 위에서 아래쪽 아래 방향 대각선
								dia[0][j]++;
							}else if (j + i == 4 && j != 2 && i != 2) { // 오른쪽 위에서 왼쪽 아래로 향하는 대각선 방향과 [2][2] 중복 플러스 방지
								dia[1][j]++;
							}
							
						}
					}
				}
				
			}
			
			
			
			for(int data : row) {
				if(data == 5) game++;
			}
			for(int data : col) {
				if(data == 5) game++;
			}
			for(int i = 0 ; i < dia.length ; i++) {
				int checksum = 0;
				for(int j = 0 ; j < dia[i].length ; j++) {
					checksum += dia[i][j];
				}
				if(checksum == 5) game++;
			}
			
			
			//출력
			for(int i = 0 ; i < 5 ; i++) {
				for(int j = 0 ; j < 5 ; j++) {
					System.out.printf("%5s",bingo[i][j]);
				}System.out.println();
			}
			
			System.out.print("선택된 수 : ");
			for(int choice : cho) {
				if(choice != 0)System.out.print(choice+" ");
			}System.out.println("\n");
			Thread.sleep(1000);
		}while(game < 3);
		
		System.out.println(count+"번 만에 빙고!");
		
	}
	
}
728x90

'Language > JAVA' 카테고리의 다른 글

JAVA 08-1 상속  (0) 2022.11.21