코딩 문제

[코딩 문제] TicTacToe 게임

Joo.v7 2024. 8. 23. 15:46

문제

틱-택-토(Tic-Tac-Toe)는 두 명이 번갈아가며 O  X 를 3x3 보드에 써서 같은 글자를 가로, 세로 혹은 대각선 상에 놓이도록 하는 놀이이다.

아래 예시는 먼저 놓은 X가 이기는 경우이다.

게임 방법은 아주 간단하다.

  1. 종이 위에 가로줄과 세로줄을 각각 2개씩 긋는다.
  2. 이렇게 생긴 9칸 위에 1P는 O , 2P는 X 를 번갈아가며 그린다.
  3. 먼저 O  X 를 3개가 직선으로 이어지게 만들면 승리한다.

컴퓨터와 사용자가 번갈아 Turn을 수행하여 승패를 가릴 수 있는 Tic Tac Toe 게임을 작성하라.

 

규칙

  • 3 x 3 배열을 사용하여 판(board)를 그린다.
  • 사용자 - 컴퓨터 - 사용자 순으로 각각의 Turn을 수행한다.
  • Turn에서는 [X 좌표, Y 좌표] 순으로 숫자를 입력하여 수행한다. 예를 들어, 프롬프트에서 1, 1 과 같이 입력하면 board의 가운데 칸에 Turn 수행자의 마크를 표시한다.
   |   |
-----------
   | O |
-----------
   |   |
  • 수행하는 사용자는 X 또는 O 로 표시된 칸에 마크할 수 없다. 마크할 경우 예외 처리 방식으로 오류를 처리한다.
  • 컴퓨터는 컴퓨터의 Turn에 빈 칸 중 하나에 Random 방식으로 마크한다.
  • 각 동작은 적절히 분해하여 메소드로 만들어 수행한다.

 

코드 

/*
 * 1. 사용자 턴 -> userTurn()
 * 2. 컴퓨터 턴 -> computerTurn()
 * 3. 빙고 판별 -> isBingo()
 * 4. 빙고보드 보여주기 -> printBoard()
 */
import java.util.*;

public class TicTacToe {
    static String[][] board = {
        {" ", " ", " "},
        {" ", " ", " "},
        {" ", " ", " "}
    };
    static boolean[][] visited = new boolean[3][3];
    static boolean bingo = false;
    static Scanner scanner = new Scanner(System.in);

    
    public static void userTurn() { // 사용자 턴
        boolean correctInput = false;
        do{
            try {
                System.out.print("Enter user coordinates. ex) 0,1 >> ");
                String input = scanner.nextLine();
                String[] splitInput = input.split(",");
                int x = Integer.parseInt(splitInput[0]);
                int y = Integer.parseInt(splitInput[1]);

                if ( x<0 || x>2 || y<0 || y>2 || board[x][y] != " " || visited[x][y] == true ){
                    throw new Exception("your input is incorrect");
                }
                else{
                    board[x][y] = "O";
                    visited[x][y] = true;
                    correctInput = true;
                }
            }
            catch(Exception e) {
                System.out.println(e.getMessage());
            }
        } while(!correctInput);
    }

    public static void computerTurn() { // 컴퓨터 턴
        Random random = new Random();
        boolean emptySpace = false;

        while(!emptySpace) {
            int x = random.nextInt(3);
            int y = random.nextInt(3);
            if (!visited[x][y]) {
                emptySpace = true;
                visited[x][y] = true;
                board[x][y] = "X";
            }
        }
    }

    public static void isBingo() { // 빙고 판별
        if(!bingo) {
            for (int i=0; i<3; i++) { // 가로 빙고
                int j=0;
                if ((board[i][j] == "O" || board[i][j] == "X") && (board[i][j] == board[i][j+1]) && (board[i][j+1] == board[i][j+2]) && (board[i][j] == board[i][j+2])){
                    bingo = true;
                    if(board[i][j] == "O") {
                        System.out.println("User Win!");
                    }
                    else{
                        System.out.println("Computer Win!");
                    }
                    return;
                }
            }

            for (int j=0; j<3; j++) { // 세로 빙고
                int i=0;
                if ((board[i][j] == "O" || board[i][j] == "X") && (board[i][j] == board[i+1][j]) && (board[i+1][j] == board[i+2][j]) && (board[i][j] == board[i+2][j])) {
                    bingo = true;
                    if(board[i][j] == "O") {
                        System.out.println("User Win!");
                    }
                    else{
                        System.out.println("Computer Win!");
                    }
                    return;
                }
            }

            // 대각선 빙고1
            if ((board[1][1] == "O" || board[1][1] == "X") && (board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[0][2] == board[2][0])) { 
                bingo = true;
                if(board[1][1] == "O") {
                    System.out.println("User Win!");
                }
                else{
                    System.out.println("Computer Win!");
                }
                return;
            }

            // 대각선 빙고2
            if ((board[1][1] == "O" || board[1][1] == "X") && (board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[0][0] == board[2][2])) { 
                bingo = true;
                if(board[1][1] == "O") {
                    System.out.println("User Win!");
                }
                else{
                    System.out.println("Computer Win!");
                }
                return;
            }
        }
    }

    public static void printBoard() { // 빙고보드 프린트
        System.out.println(" " + board[0][0] + " | " + board[0][1] + " | " + board[0][2]);
        System.out.println("-----------");
        System.out.println(" " + board[1][0] + " | " + board[1][1] + " | " + board[1][2]);
        System.out.println("-----------");
        System.out.println(" " + board[2][0] + " | " + board[2][1] + " | " + board[2][2]);
    }

    public static void main(String[] args) {
        while(!bingo) {
            userTurn();
            if(bingo) break;
            computerTurn();
            if(bingo) break;
            printBoard();
            isBingo();
        }
        scanner.close();
    }
}

 

 


 

 

출처: https://github.com/gikpreet/class-programming_with_java/blob/master/Module%2006%20%EB%B0%B0%EC%97%B4/homework/tictactoe.adoc

 

class-programming_with_java/Module 06 배열/homework/tictactoe.adoc at master · gikpreet/class-programming_with_java

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com

 

'코딩 문제' 카테고리의 다른 글

[코딩 문제] 문자열 반전  (0) 2024.08.30
[코딩 문제] Palindrom  (0) 2024.08.23
[코딩 문제] 연도 일자를 월/일로 계산하기  (0) 2024.08.23
[코딩 문제] 미로 탐색  (0) 2024.08.23
[코딩 문제] Anagram  (0) 2024.08.23