공부/JAVA

[JAVA 2차원 배열] TIC-TAC-TOE 게임, 지뢰찾기 게임, 랜덤 워크

순제로 2022. 8. 21. 01:32
728x90

TIC-TAC-TOE 게임

Tic_Tac_Toe.java

import java.util.*;
public class Tic_Tac_Toe {

	public static void main(String[] args) {
		int x,y;
		int a=0,b=0;
		Scanner scan= new Scanner(System.in);
		
		//게임판을 나타내는 2차원 배열을 초기화한다.
		char[][] array = {
				{' ',' ',' '},
				{' ',' ',' '},
				{' ',' ',' '}
		};
		
		//게임판을 그린다.
		do {
		for(int i =0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(j==2)
					System.out.print("  "+array[j][i]);
				else
					System.out.print("  "+array[j][i]+"|");
			}
			System.out.println();
			if(i !=2)
					System.out.println("---|---|---");
		}
		
		//좌표를 입력받는다.
		System.out.println("다음 수의 좌표를 입력하세요 : ");
		x = scan.nextInt();
		y = scan.nextInt();
		
		//사용자가 놓은 위치를 검사한다.
		if(array[x][y] != ' ') {
			System.out.println("이미 입력된 위치입니다.");
			continue;//중복으로 입력될 경우 컴퓨터가 한번 더 놓는거 방지
			}
		else
			array[x][y] = 'X';
		
		//컴퓨터가 놓을 위치를 결정한다.
		
		for(a=0;a<3;a++) {
			for(b=0;b<3;b++) {
				if(array[a][b]==' ')
					break;
			}
			if(array[a][b]==' ')
				break;
		}
		
		if(a<3&&b<3)
			array[a][b] = 'O';
		 
		
		}while(true);
		
	}

}

실행결과 : 0, 0 입력

 

 

지뢰찾기 게임

MineSweeper.java

public class MineSweeper {

	public static void main(String[] args) {
		//게임판을 나타내는 부울형의 2차원 배열을 생성한다.
		boolean[][] game = new boolean[10][10];
		
		//난수를 발생하여서 30%확률로 지뢰를 저장한다.
		
		for(int i =0; i<10; i++) {
			for(int j=0; j<10; j++) {
				if(Math.random()<0.3)
					game[i][j]=true;
			}
		}
		for(int i=0; i<10; i++) {
			for(int j=0; j<10;j++) {
				if(game[i][j]==true)
				System.out.print("*");
				else
					System.out.print("ㅁ");
			}
			System.out.println();
		}
	}
}

실행결과

 

 

랜덤워크 : Switch 사용

RandomWalk.java

import java.util.*;
/**
 * 방 전체를 2차원 배열 tile[10][10]로 모델링을 하고
 * 처음에는 딱정벌레가 배열에 중심에 있다고 가정하라.
 * title[][]의 초기값은 false이다.
 * 딱정벌레가 타일을 지나갈 때마다 2차원 배열의 값을 true로 만들어서 딱정벌레가 지나갔음을 나타낸다.
 * 0부터 3까지의 랜덤한 숫자를 생섯하여 다음과 같이 움직인다.
 * 즉 0이면 북쪽으로 이동하고
 * 2이면 남쪽으로 이동한다.
 * 0부터 3까지 랜덤한 숫자는 다음과 같이 생성할 수 있다.
 * int direction = (int)(Math.random()*4);
 *
 */
public class RandomWalk {

	public static void main(String[] args) {
		boolean[][] tile = new boolean[10][10];
		int x=5,y=5;
		int w;
		
		tile[x][y]=true;
for(w=0;w<10;w++) {
		int direction = (int)(Math.random()*4);
		switch(direction) {
		case 0:
			x++;
			break;
		case 1:
			x--;
			break;
		case 2:
			y++;
			break;
		case 3:
			y--;
			break;
		}
		tile[x][y]=true;
	
		System.out.println("-------------------------------------");
		for(int a=0; a<10;a++) {
			for(int b =0; b<10;b++) {
				if(tile[a][b]==true)
					System.out.print("# ");
				else
					System.out.print(". ");
			}
			System.out.println();
		}
		System.out.println("-------------------------------------");
	}
	System.out.println("전체 이동 수는 = "+w);
	}
}

 

실행결과

 

 

랜덤워크 : if - else if 사용

RandomWalkBook.java

import java.util.*;
public class RandomWalk_Book {

	public static void main(String[] args) {
		
		//게임판을 나타내는 부울형의 2차원 배열 생성
		boolean tile[][] = new boolean[10][10];
		int steps;
		int x=5, y=5;
		
		//시작점
		tile[5][5] = true;
	
		//난수를 생성하여서 다음의 갈 곳을 결정한다. 게임판의 범위를 넘어가지 않도록 검사한다.
		for(steps = 0; steps<10; steps++) {
			//0부터 3 까지 랜덤숫자생성
			int direction = (int)(Math.random() * 4);
			if(direction == 0&&x>0)
			x--;
			else if (direction == 1&&x<9)
				x++;
			else if (direction == 2&&y>0)
				y--;
			else if (y<9)
				y++;
			tile[y][x] = true;
			
			//게임판을 화면에 그린다.
			System.out.println("-----------------------------");
			for(int i=0;i<10;i++) {
				for( int j=0; j<10; j++) {
					if(tile[i][j] == true)
						System.out.print("# ");
					else
						System.out.print(". ");
				}
				System.out.println();
			}
			System.out.println("-----------------------------");
		}
		System.out.println("전체 이동 수는 = " + steps);
	}

}

 

 

실행결과

 

 


 

**2차원 배열(two dimensional array)

2차원 배열이란 배열의 요소로 1차원 배열을 가지는 배열입니다.

자바에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않습니다.

대신에 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있습니다.

 

따라서 자바에서 2차원 배열은 다음과 같은 문법으로 선언할 수 있습니다.

1. 타입[][] 배열이름;

2. 타입 배열이름[][];

3. 타입[] 배열이름[];

 

예제

int[][] arr = new int[2][3];

 

int k = 10;

for (int i = 0; i < arr.length; i++) {

    for (int j = 0; j < arr[i].length; j++) {

        arr[i][j] = k; // 인덱스를 이용한 초기화

        k += 10;

    }

}

 

for (int i = 0; i < arr.length; i++) {

    for (int j = 0; j < arr[i].length; j++) {

        System.out.print(arr[i][j] + " ");

    }

    System.out.println();

}

 

실행결과

10 20 30 

40 50 60

http://www.tcpschool.com/java/java_array_twoDimensional

 

배열의 선언과 동시에 초기화하는 방법

타입 배열이름[열의길이][행의길이] = {

    {배열요소[0][0], 배열요소[0][1], ...},

    {배열요소[1][0], 배열요소[1][1], ...},

    {배열요소[2][0], 배열요소[2][1], ...},

    ...

};

 

예제

int[][] arr = {

    {10, 20, 30},

    {40, 50, 60}

};

 

실행결과

10 20 30 

40 50 60

 

**가변배열

자바에서는 2차원 배열을 생성할 때 열의 길이를 명시하지 않음으로써, 행마다 다른 길이의 배열을 요소로 저장할 수 있습니다.

이렇게 행마다 다른 길이의 배열을 저장할 수 있는 배열을 가변 배열(dynamic array)이라고 합니다.

int[][] arr = new int[3][];

arr[0] = new int[2];

arr[1] = new int[4];

arr[2] = new int[1];

 

 

선언과 동시에 초기화

int[][] arr = {

    {10, 20},

    {10, 20, 30, 40},

    {10}

};

 

 

실행결과

10 20 

10 20 30 40 

10

 

출처 : http://www.tcpschool.com/java/java_array_twoDimensional

728x90