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 |
---|