|
| 1 | +package week01.advanced; |
| 2 | + |
| 3 | +import java.util.Random; |
| 4 | + |
| 5 | +public class GameOfLife { |
| 6 | + |
| 7 | + public static void main(String[] args) { |
| 8 | + System.out.println("<라이프 게임(Game of Life) 1세대 구현>"); |
| 9 | + System.out.println(); |
| 10 | +// 26단계 (심화): 라이프 게임(Game of Life) 1세대 구현 |
| 11 | +// 문제: 10x10 크기의 2차원 배열에 생명체(1)와 공간(0)을 임의로 배치합니다. |
| 12 | +// 다음 세대의 상태를 계산하여 새로운 2차원 배열에 저장하고 출력하세요. |
| 13 | +// - 규칙: |
| 14 | +// 1. 살아있는 칸 주변(8방향)에 살아있는 칸이 2개 미만이면, 외로워서 죽는다. (0) |
| 15 | +// 2. 살아있는 칸 주변에 살아있는 칸이 2개 또는 3개이면, 다음 세대에도 산다. (1) |
| 16 | +// 3. 살아있는 칸 주변에 살아있는 칸이 3개 초과이면, 과밀하여 죽는다. (0) |
| 17 | +// 4. 죽어있는 칸 주변에 살아있는 칸이 정확히 3개이면, 새로운 생명이 탄생한다. (1) |
| 18 | +// 핵심 사고: 2차원 배열의 특정 위치를 기준으로 주변 8칸을 탐색하고 |
| 19 | +// 경계 조건을 처리하는 능력 |
| 20 | +// 힌트: `다중 배열`, `이중 for문` (전체 배열 탐색), |
| 21 | +// `이중 for문` (주변 8칸 탐색) |
| 22 | + |
| 23 | +// {1,0,1,0,1,0,1,0,0,1}, |
| 24 | +// {0,1,0,1,0,0,1,0,0,0}, |
| 25 | +// {0,1,0,0,1,1,1,1,1,0}, |
| 26 | +// {1,1,1,0,0,0,0,0,1,1}, |
| 27 | +// {0,1,1,0,1,1,0,0,1,0}, |
| 28 | +// {0,0,0,0,1,1,1,1,1,1}, |
| 29 | +// {0,1,1,0,0,1,1,0,0,1}, |
| 30 | +// {1,1,1,0,0,0,1,0,1,0}, |
| 31 | +// {1,1,0,0,0,1,1,0,1,0}}; |
| 32 | +// |
| 33 | +// for (int i = 0; i < 10; i++) { // 배운 거 활용 |
| 34 | +// for (int j = 0; j < 10; j++) { |
| 35 | +// arr[i][j] = (int)(Math.random()*2); |
| 36 | +// } |
| 37 | +// } |
| 38 | + /* nextInt() (인자 없음): int의 전체 범위에서 균등하게 하나 (음수 포함). |
| 39 | + * nextInt(n): 0 이상 n 미만의 정수 하나 (항상 음수 아님). |
| 40 | + * 0 또는 1: rand.nextInt(2) |
| 41 | + * 1~6(주사위): rand.nextInt(6) + 1 |
| 42 | + * a~b (포함, a ≤ b): rand.nextInt(b - a + 1) + a */ |
| 43 | + Random rand = new Random(); // 새로 배운 랜덤수 생성 |
| 44 | + int[][] arr = new int[10][10]; |
| 45 | + for (int i = 0; i < 10; i++) { |
| 46 | + for (int j = 0; j < 10; j++) { |
| 47 | + arr[i][j] = rand.nextInt(2); // 0 또는 1 |
| 48 | + } |
| 49 | + } |
| 50 | + System.out.println("-------초기 배열-------"); |
| 51 | + for(int i=0; i<arr.length;i++) { |
| 52 | + for(int j=0; j<arr[i].length;j++) { |
| 53 | + System.out.print(arr[i][j]+" "); |
| 54 | + } |
| 55 | + System.out.println(); |
| 56 | + } |
| 57 | + /* 북(-1) |
| 58 | + * 서(-1) 동(+1) |
| 59 | + * 남(+1) |
| 60 | + * 8방향 {서,북서,북,북동,동,동남,남,남서} |
| 61 | + * 서,동: 행 변화X, 열 변화O |
| 62 | + * 북,남: 행 변화O, 열 변화X |
| 63 | + * 북서,북동,동남,남서: 행 변화O, 열 변화O |
| 64 | + */ |
| 65 | + int[]dr={0, -1, -1, -1, 0, 1, 1, 1}; // 행 변화 |
| 66 | + int[]dc={-1, -1, 0, 1, 1, 1, 0, -1}; // 열 변화 |
| 67 | + |
| 68 | + int[][] next = new int[arr.length][arr[0].length]; |
| 69 | + for(int i=0; i<arr.length;i++) { |
| 70 | + for(int j=0; j<arr[i].length;j++) { |
| 71 | + int cnt = 0; // 매번 살아있는 칸 초기화 |
| 72 | + for(int k=0;k<dr.length;k++) { // i,j->행,열 탐색 k->주변 8방향 확인 |
| 73 | + int nx = i+dr[k]; // 행 탐색 |
| 74 | + int ny = j+dc[k]; // 열 탐색 |
| 75 | + boolean outOfRange = (nx<0||nx>=arr.length||ny<0||ny>=arr[0].length); |
| 76 | + if(!outOfRange&&arr[nx][ny]==1) { // 살아있는 칸 개수 확인 |
| 77 | + cnt++; |
| 78 | + } |
| 79 | + } |
| 80 | + if(arr[i][j]==1) { // 살아있는 칸 주변에 |
| 81 | + if(cnt<2) { |
| 82 | + next[i][j]=0;//죽음 |
| 83 | + } |
| 84 | + else if(cnt==2||cnt==3) { |
| 85 | + next[i][j]=1;//생존 |
| 86 | + } |
| 87 | + else if(cnt>3) { |
| 88 | + next[i][j]=0;//죽음 |
| 89 | + } |
| 90 | + |
| 91 | + } |
| 92 | + else if(arr[i][j]==0&&cnt==3) { // 죽어있는 칸 주변에 |
| 93 | + next[i][j]=1;//탄생 |
| 94 | + } |
| 95 | + } |
| 96 | + } |
| 97 | + System.out.println(); |
| 98 | + System.out.println("----게임 진행 후 배열----"); |
| 99 | + for(int i=0; i<next.length;i++) { |
| 100 | + for(int j=0; j<next[i].length;j++) { |
| 101 | + System.out.print(next[i][j]+" "); |
| 102 | + } |
| 103 | + System.out.println(); |
| 104 | + } |
| 105 | + } |
| 106 | +} |
0 commit comments