본문 바로가기

1.프로그래밍/알고리즘

[알고리즘] Java 틱택토 게임 (Tic Tac Toe)

728x90
반응형

어느 한 교육을 듣고있다.
그 교육에서 Java를 이용하여 3x3의 틱택토(Tic Tac Toe)라는 게임을 구현해 보는것이 과제였다.

사용자의 입력을 O 컴퓨터 입력을 X로 구현하였고,
메인 메소드에서 배열을 초기화 시킨 후, 메서드 들을 이용하여 while문을 사용하여 구현하였다.

Code

import java.util.Random;
import java.util.Scanner;

public class TicTacToe {


    public static void printGame(String[][] arr){
        System.out.println();
        System.out.println("----------------");
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr.length; j++){
                System.out.print(arr[i][j]);
                System.out.print("  |  ");
            }
            System.out.println();
            System.out.println("----------------");
        }
    }

    public static void userPick(String[][] arr, int x, int y){
        arr[x][y] = "O";
    }

    public static void computerPick(String[][] arr){
        Random random = new Random();

        while(true){
            int x = random.nextInt(3);
            int y = random.nextInt(3);
            if(arr[x][y] == " "){
                arr[x][y] = "X";
                break;
            }
            if(gameIsFull(arr) == true){
                break;
            }
        }
    }

    public static String gameWinner(String[][] arr){

        for(int i = 0; i < arr.length; i++){
            if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != " " ){
                return arr[i][0];
            }
            if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != " " ){
                return arr[0][i];
            }
        }

        if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != " "){
            return arr[0][0];
        }

        if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != " "){
            return arr[0][2];
        }

        return "";
    }


    public static boolean gameIsFull(String[][] arr){

        for(int i =0; i<arr.length; i++){
            for(int j=0; j<arr.length; j++){
                if(arr[i][j] == " "){
                    return false;
                }
            }            
        }
        return true;
    } 

    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);


        String[][] arr = new String[3][3];

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

        printGame(arr);
        System.out.println();

        boolean gameEnd = true;
        while(gameEnd){
            System.out.println("선택할 좌표(x, y)를 입력해 주세요.");
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            if(arr[x][y] != " "){
                System.out.println("중복된 자리입니다.");
                continue;
            }
            userPick(arr, x, y);
            computerPick(arr);
            printGame(arr);

            String winner = gameWinner(arr);

            if(winner.equals("O")){
                System.out.println("축하합니다. 게임에서 승리하였습니다!");
                gameEnd = false;
            } else if(winner.equals("X")){
                System.out.println("아쉽게 게임에서 패배하였습니다.");
                gameEnd = false;
            }

            if(gameIsFull(arr) == true){
                System.out.println("비겼습니다");
                gameEnd = false;
            }

        }
    }
}

메서드 설명

먼져 printGeme라는 메서드는 메서드 이름 그대로 게임판을 계속 출력해주는 메서드이다. 게임판 이쁘게 꾸미고 그런건 못하겠다..


그 밑으로 userPick 메서드와 computerPick 메서드는 배열에 O 와 X를 추가해주는 메서드로 computerPick 메서드는 사용자가 입력하지 않은 곳에 입력해야 함으로 random과 while문을 통해 구현하였다.


그 다음 가장 고민 많이 했던 승리조건이다. 3x3 틱택톡 게임에서의 승리 조건은 가로 3줄 세로 3줄 대각선 2줄 총 8줄이다.
최대한 이 로직을 간단하게 짜보려고 생각을 많이 했다.하지만 내 머리로는 저것보다 간단하게 구현이 되질 않았다...
더 간단하게 승리조건 구현이 가능하다면 댓글로 알려주시기 바란다...

그 밑에 마지막 메서드인 gemeIsFull이라는 메서드는 게임판이 가득차게 되면 true를 반환하여 게임을 중지시키는 역할을 한다.
또한 3x3 틱택토 게임에서 총 9개의 말을 놓을 수 있는 판이 있고, 첫번째 유저가 5개의 말을 놓고 두번째 유저는 4개의 말을 놓게 된다.

그렇게 되면 첫번째 유저가 5개의 말을 놓은 뒤 computerPick에서 놓을 수 있는 자리가 없기에 무한루프에 빠지게 된다.
그것을 gameIsFull이라는 메서드를 사용하여 break문을 걸어주었고, 또한 게임 판이 가득 찼을 때 승패가 갈리지 않게된다면 비기게 되는 것으로 구현을 마무리 하였다.


찾아보니 백준에 골드5등급에 틱택토 게임이 있었다.
그 게임은 9x9의 게임인거 같은데 나중에 실력이 더 올라간다면 풀어보고싶다는 생각이 들었다.

728x90
반응형