본문 바로가기
PROGRAMMING CODE/C

[SOLUTION] TIC-TAC-TOE(가장 간단한 알고리즘)

by daye_ 2021. 10. 18.

가장 간단하게, 컴퓨터가 왼쪽에서 오른쪽, 위에서 아래 순서로 x표기하여 게임을 진행하는 알고리즘

#include <stdio.h>
void print_board(char board[][3]); //board출력
void initialize(char board[][3]); //board초기화
void computer_input(char board[][3]); //Computer입력
int winner_check(char board[][3]); //결과
int main() {
    char board[3][3];
    int x, y;
    initialize(board); //board 초기화

    for (int i = 0; i < 9; i++) {
        if (i % 2 == 0 && i != 1) { //짝수번째에 User입력
            printf("User(x , y) >> ");
            scanf("%d %d", &x, &y);
            if(board[x][y]==' ') board[x][y] = 'O';
            else {
                printf("error!\n");//보드에 입력값이 있을시,잘못입력시 error출력
                i--;
                continue;
            }
        }
        else {
            computer_input(board); //홀수번째에 Computer입력
        }

        print_board(board); //board출력
        if (winner_check(board) == 1) {//검사해서 return 1이면 UserWin
            printf("User Win!\n");
            break;
        }
        else if (winner_check(board) == 2) {
            printf("Computer Win!\n");
            break;
        }
    }
    printf("End!\n");
    return 0;
}

void print_board(char board[][3]) {
    for (int i = 0; i < 3; i++) {
        printf("---|---|---\n");
        printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);
    }
    printf("---|---|---\n\n");
}
void initialize(char board[][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            board[i][j] = ' ';
    }
}
void computer_input(char board[][3]) {
    int check = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j] == ' ') { //비어있는 가장 첫번째에 Computer가 입력
                board[i][j] = 'X';
                check = 1;//입력했는지 체크
                printf("Computer(%d , %d) \n", i, j);
                break;
            }
        }
        if (check == 1) return; //입력했으면 함수 exit
    }
}
int winner_check(char board[][3]) {
    for (int i = 0; i < 3; i++) {
        if (board[0][i] == 'O' && board[1][i] == 'O' && board[2][i] == 'O') return 1;
        if (board[0][i] == 'X' && board[1][i] == 'X' && board[2][i] == 'X') return 2;
    }
    for (int i = 0; i < 3; i++) {
        
        if (board[i][0] == 'O' && board[i][1] == 'O' && board[i][2] == 'O') return 1;
        if (board[i][0] == 'X' && board[i][1] == 'X' && board[i][2] == 'X') return 2;
    }
    if (board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O') return 1;
    if (board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X') return 2;
    return 0; //위의 모든 경우가 없었다면 return 0
}