티스토리 뷰

실습페이지

24_07_25 오늘의 실습내용

regnator 2024. 7. 25. 16:02
728x90
반응형

java코드로 console창에 간이 지뢰찾기를 구현하자

주변지뢰개수 세기 개선전 버전)

https://cafe.naver.com/ksmart1008/32301

 

주변지뢰개수 세기 개선후 버전)


import java.util.Scanner;

public class Mine {

	public static void main(String[] args) {
		minesweeper();
	}

	public static void minesweeper() {
		String[][] field = new String[5][5];
		String[][] mine = new String[5][5];

		for (int i = 0; i <= 4; i++) {
			for (int j = 0; j <= 4; j++) {
				field[i][j] = "□";
			}
		}

		for (int i = 0; i <= 4; i++) {
			for (int j = 0; j <= 4; j++) {
				// 난이도 설정을 위해서 변경할 부분
				if ((Math.random() * 100) <= 80) {
					mine[i][j] = "□";
				} else {
					mine[i][j] = "■";
				}

			}
		}
		System.out.print(" ");
		for (int j = 0; j <= 4; j++) {
			System.out.printf("%3d", j);
		}
		System.out.println();
		for (int i = 0; i <= 4; i++) {
			System.out.print((i));
			for (int j = 0; j <= 4; j++) {
				System.out.printf("%3s", field[i][j]);

			}
			System.out.println();
		}

		// 이부분을 활성화하면 지뢰가 있는 부분을 알수 있음
		/*
		System.out.println("-----------------------------------------");
		for (int i = 0; i <= 4; i++) {
			for (int j = 0; j <= 4; j++) {
				System.out.printf("%3s", mine[i][j]);
			}
			System.out.println();
		}
		System.out.println("-----------------------------------------");
		*/
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.print("가로좌표를 입력해주세요(0~4) : ");
			while (!sc.hasNextInt()) {
				sc.next();
				System.err.print("에러! 숫자가 아닙니다. \n재 선택 해주세요(0~4) : ");
			}
			int first = sc.nextInt();
			if (first > 4 || first < 0) {
				System.out.println("0~4사이의 숫자를 입력해주세요");
				continue;
			}

			System.out.print("세로좌표를 입력해주세요(0~4) : ");
			while (!sc.hasNextInt()) {
				sc.next();
				System.err.print("에러! 숫자가 아닙니다. \n재 선택 해주세요(0~4) : ");
			}
			int second = sc.nextInt();
			if (second > 4 || second < 0) {
				System.out.println("0~4사이의 숫자를 입력해주세요");
				continue;
			}
			
            // 주변지뢰개수 세기 개선 부분
			// 지뢰주변을 바꿔줄 방향 배열
			int[][] dir = { { -1, -1 }, { -1, 0 }, { -1, +1 }, // 좌상, 상, 우상
					{ 0, -1 }, { 0, +1 }, // 좌, 우
					{ +1, -1 }, { +1, 0 }, { +1, +1 } // 좌하, 하, 우하
			};

			// 주변 지뢰 개수 세기
			int aroundMine = 0;
			for (int k = 0; k < 8; k++) {
				int newRow = first + dir[k][0];
				int newCol = second + dir[k][1];

				// 배열의 경계를 벗어나지 않도록 하는 조건
				if (newRow >= 0 && newRow <= 4 && newCol >= 0 && newCol <= 4) {
					if (mine[newRow][newCol].equals("■")) {
						aroundMine += 1;
					}
				}
			}

			field[first][second] = aroundMine + "";
			if (mine[first][second].equals("□")) {
				mine[first][second] = aroundMine + "";
			}

			if (!mine[first][second].equals("■")) {
				System.out.print(" ");
				for (int j = 0; j <= 4; j++) {
					System.out.printf("%3d", j);
				}
				System.out.println();
				for (int i = 0; i <= 4; i++) {
					System.out.print(i);
					for (int j = 0; j <= 4; j++) {
						System.out.printf("%3s", field[i][j]);
					}
					System.out.println();
				}
			}
			if (mine[first][second].equals("■")) {
				field[first][second] = "쾅";

				System.out.println("--------------------------");
				System.out.print(" ");
				for (int j = 0; j <= 4; j++) {
					System.out.printf("%3d", j);
				}
				System.out.println();
				for (int i = 0; i <= 4; i++) {
					System.out.print(i);
					for (int j = 0; j <= 4; j++) {
						System.out.printf("%3s", field[i][j]);
					}
					System.out.println();
				}
				System.out.println("당신은 지뢰를 밟았습니다.\n୧༼ ” ✖ ‸ ✖ ” ༽୨\n   YOU DIED");
				break;
			}
			int plag = 0;
			for (int i = 0; i <= 4; i++) {
				for (int j = 0; j <= 4; j++) {
					if (mine[i][j].equals("■") || !mine[i][j].equals("□")) {
						plag += 1;
					}
				}
			}
			if (plag == 25) {
				System.out.println("당신은 살아남았습니다.\n୧༼ ͡◉ل͜ ͡◉༽୨\nYOU SURVIVED");
				break;
			}
		}
		sc.close();
	}
}

 

728x90
반응형

'실습페이지' 카테고리의 다른 글

24_07_26 오늘의 실습내용  (0) 2024.07.26
24_07_12 오늘의 실습내용  (1) 2024.07.12
24_07_09 오늘의 실습내용  (0) 2024.07.10
24_07_03 오늘의 실습내용  (0) 2024.07.03
24_07_02 오늘의 실습내용  (0) 2024.07.02