본문 바로가기
Program/Java

[JAVA] 2차원 배열을 이용한 Tic Tac Toe (틱택토) 게임

by C_Meaning 2021. 6. 28.
728x90
자바 코드를 이용한 틱택토 게임을 만들어 보았다.

 

알고리즘으로도 유명한 틱택토다.

 

틱택토 게임은 가로 3칸, 세로 3칸, 대각선 3칸이 있으며, 2명의 플레이어 중 한 명이 한 라인을 자신의 영역으로 점령할 경우 승리하는 게임이다.

 

코드 구조는 2차원 배열로 이루어진 배열에 해당 플레이어가 원하는 값을 입력하고 프로그램은 입력한 상황에 따라 판정을 내리는 구조로 만들었다.

9턴이 모두 흘러가면 종료, 3칸 점령시 승리하여 종료..

 

아래는 코드이다.

 

main 코드
import java.util.*;

/**
 * 자바 틱택토 게임~~
 * 
 * 2021 - 06 - 28
 * 
 * 상급 제작
 * 
 */

public class Tic_Tac_Toe extends Tic_Tac_Toe_GameCore {

	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		String[][] T3 = new String[3][3]; // 틱택토 판 초기화
		int Choose = 0; // 선택한 칸
		String OX = ""; // O, X
		int Player = 1; // 플레이어 번호. 1번 플레이어 선공
		int turn = 0; // 턴. 9턴을 기점으로 종료
		String Retry = ""; // 재시작 여부 묻기

		t3_init(T3); // 초기화

		System.out.println("Tic Tac Toe 게임에 온 것을 환영합니다!!!");

		while (true) {
			Pan_View(T3);
			if (turn > 4) { // 4턴부터 승리 체크
				if (victory_check(T3) == 1) {
					System.out.println("1번 플레이어 승리!!");
					System.out.print("다시 하시겠습니까? (Y / N) : ");
					scan = new Scanner(System.in);

					try {
						Retry = scan.nextLine();
					} catch (InputMismatchException e) {
						System.out.println("잘못된 입력!! 다시 입력하세요");
						scan = new Scanner(System.in);
						continue;
					}

					if (Retry.equals("y") || Retry.equals("Y")) {
						System.out.println("게임을 다시 시작합니다.");
						t3_init(T3);
						turn = 0;
						Player = 1;
					} else if (Retry.equals("n") || Retry.equals("N")) {
						System.out.println("게임을 종료합니다. 안녕히 가세요!");
						break;
					} else {
						System.out.println("잘못된 선택입니다!");
						continue;
					}
				} else if (victory_check(T3) == 2) {
					System.out.println("2번 플레이어 승리!!");
					System.out.print("다시 하시겠습니까? (Y / N) : ");
					scan = new Scanner(System.in);

					try {
						Retry = scan.nextLine();
					} catch (InputMismatchException e) {
						System.out.println("잘못된 입력!! 다시 입력하세요");
						scan = new Scanner(System.in);
						continue;
					}

					if (Retry.equals("y") || Retry.equals("Y")) {
						System.out.println("게임을 다시 시작합니다.");
						t3_init(T3);
						turn = 0;
						Player = 1;
					} else if (Retry.equals("n") || Retry.equals("N")) {
						System.out.println("게임을 종료합니다. 안녕히 가세요!");
						break;
					} else {
						System.out.println("잘못된 선택입니다!");
						continue;
					}
				}
			}

			if (turn == 9) { // 턴 모두 소비함!
				System.out.print("무승부!! 다시 하시겠습니까? (Y / N) : ");
				scan = new Scanner(System.in);

				try {
					Retry = scan.nextLine();
				} catch (InputMismatchException e) {
					System.out.println("잘못된 입력!! 다시 입력하세요");
					scan = new Scanner(System.in);
					continue;
				}

				if (Retry.equals("y") || Retry.equals("Y")) {
					System.out.println("게임을 다시 시작합니다.");
					t3_init(T3);
					turn = 0;
					Player = 1;
				} else if (Retry.equals("n") || Retry.equals("N")) {
					System.out.println("게임을 종료합니다. 안녕히 가세요!");
					break;
				} else {
					System.out.println("잘못된 선택입니다!");
					continue;
				}
			}

			System.out.println(Player + " 번 플레이어 차례입니다!");
			System.out.print("몇번째 칸을 선택하시겠습니까? (0 ~ 9) : ");

			try {
				Choose = scan.nextInt();
			} catch (InputMismatchException e) {
				System.out.println("잘못된 입력!! 다시 입력하세요");
				scan = new Scanner(System.in);
				continue;
			}

			if (Player == 1) {
				OX = "O";
				T3 = Game_Core(T3, Choose, OX);
				Player = 2;
			} else {
				OX = "X";
				T3 = Game_Core(T3, Choose, OX);
				Player = 1;
			}
			turn++;
		}

	}

}

 

game_core 코드
import java.util.*;

public class Tic_Tac_Toe_GameCore {

	public static String[][] Game_Core(String[][] T3, int Choose, String OX) {

		String[][] t3 = T3;

		switch (Choose) {
		case 1:
			choose_check(t3, 0, 0, OX);
			break;
		case 2:
			choose_check(t3, 0, 1, OX);
			break;
		case 3:
			choose_check(t3, 0, 2, OX);
			break;
		case 4:
			choose_check(t3, 1, 0, OX);
			break;
		case 5:
			choose_check(t3, 1, 1, OX);
			break;
		case 6:
			choose_check(t3, 1, 2, OX);
			break;
		case 7:
			choose_check(t3, 2, 0, OX);
			break;
		case 8:
			choose_check(t3, 2, 1, OX);
			break;
		case 9:
			choose_check(t3, 2, 2, OX);
			break;
		}

		return t3;
	}

	/* 틱택토 판 현황 확인 */
	public static void Pan_View(String[][] t3) {
		System.out.println();
		for (int i = 0; i < 3; i++) {
			System.out.println(" " + t3[i][0] + " " + "|" + " " + t3[i][1] + " " + "|" + " " + t3[i][2] + " ");
			if (i == 0 || i == 1)
				System.out.println("---|---|---");
		}
		System.out.println();
	}

	/* 빈칸인지 이미 누가 선택했는지 체크 */
	public static void choose_check(String[][] t3, int i, int j, String OX) {
		int Choose = 0;
		Scanner scan = new Scanner(System.in);

		if (t3[i][j] == "O" || t3[i][j] == "X") {
			System.out.print("그곳을 선택할 수 없습니다. 다시 입력 하세요 : ");
			try {
				Choose = scan.nextInt();
			} catch (InputMismatchException e) {
				System.out.println("잘못된 입력!! 다시 입력하세요");
				choose_check(t3, i, j, OX);
			}

			System.out.println();
			Game_Core(t3, Choose, OX);
		} else {
			t3[i][j] = OX; // 이상없으면 체크~
		}
	}

	/* 승리 조건을 달성한 플레이어를 체크함 */
	public static int victory_check(String[][] t3) {

		int player = 0; // 리턴할 승리한 플레이어 넘버

		// 가로줄 체크
		for (int i = 0; i < 3; i++) {
			if (t3[i][0].equals("O") && t3[i][1].equals("O") && t3[i][2].equals("O")) {
				player = 1;
			} else if (t3[i][0].equals("X") && t3[i][1].equals("X") && t3[i][2].equals("X")) {
				player = 2;
			}
		}
		// 세로줄 체크
		for (int i = 0; i < 3; i++) {
			if (t3[0][i].equals("O") && t3[1][i].equals("O") && t3[2][i].equals("O")) {
				player = 1;
			} else if (t3[0][i].equals("X") && t3[1][i].equals("X") && t3[2][i].equals("X")) {
				player = 2;
			}
		}
		// 대각줄 체크
		if (t3[0][0].equals("O") && t3[1][1].equals("O") && t3[2][2].equals("O")) {
			player = 1;
		} else if (t3[0][0].equals("X") && t3[1][1].equals("X") && t3[2][2].equals("X")) {
			player = 2;
		}
		
		if (t3[0][2].equals("O") && t3[1][1].equals("O") && t3[2][0].equals("O")) {
			player = 1;
		} else if (t3[0][2].equals("X") && t3[1][1].equals("X") && t3[2][0].equals("X")) {
			player = 2;
		}
		
		return player;
	}

	/* 판 초기화 */
	public static String[][] t3_init(String[][] t3) {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				t3[i][j] = " "; // 1바이트 문자로 초기화
			}
		}
		return t3;
	}
}

2명이서하면 재밌을 것 같다

 

728x90

댓글