상세 컨텐츠

본문 제목

알고리즘을 통한 지능적 틱택토 게임 구현 (c++)

컴퓨터

by 잘못된 선택 2020. 9. 21. 14:01

본문

#include <stdio.h>
#include <math.h>

int main(void)
{
    int board[3][3] = { 0, }; // = { 11, 12, 13, 14, 15, 16, 17, 18, 19 }; // 게임 보드, 각 칸의 번호
    int player = 0; // player ID 0,1 두명의 플레이어
    int x, y; // 착수 위치
    int choice = 0; // 진행한 횟수
    int com = 0;

    int Bingo(int ary[3][3], int n); // 승패 결정 함수 선언
    int check(int ary[3][3], int i, int j, int com);
    void draw(int ary[3][3]);

    printf("수행할 player를 고르시오 (0 또는 1): ");
    scanf_s("%d", &com);
    com = (com + 1) % 2;

    while (1) // 별다른 조건없이 무한반복
    {        
        if(player == com) {
            int com_x = -1;
            int com_y = -1;
            int max_score = 0;
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (board[i][j] == 0) {
                        int score = check(board, i, j, com + 1);
                        if (max_score < score) {
                            max_score = score;
                            com_x = i;
                            com_y = j;
                        }
                    }
                }
            }
            x = com_x;
            y = com_y;

        }
        else {
            // 착수 위치 입력
            do
            {
                printf("player [%d]의 착수 위치(x,y)를 입력하시오 : ", player);
                scanf_s("%d %d", &x, &y); // 착수 위치 입력받기

                if (board[x][y] != 0 || x>2 || x < 0 || y>2 || y < 0) {
                    printf("\n잘못된 입력입니다. 다시 입력하세요.\n\n");
                } // 잘못된 입력값을 받기위한 조건문

            } while (board[x][y] != 0 || x>2 || x < 0 || y>2 || y < 0); // 입력값이 정확하면 빠져나옴
        }
        choice++; // 진행한 횟수 1증가

        if (player == 0) {
            board[x][y] = 1; // player 0은 보드판에 1을 입력
            player = 1; //플레이어 전환
        }

        else {
            board[x][y] = 2; // player 1은 보드판에 2를 입력
            player = 0; // 플레이어 전환
        }

        draw(board);

          // 빙고 여부
        int result = Bingo(board, choice); // 승패 결정 함수 호출
        if (result == 0) //승패가 결정되는 경우
        {
            if (player == 0) {
                printf("player [1] 승리!!\n");
            }
            else {
                printf("player [0] 승리!!\n");
            }
            break;
        } // 마지막으로 둔 플레이가 승리하게 됨

        else if (result == 1) // 무승부가 되는 경우
        {
            printf("무승부 입니다.\n");
            break;
        }
        else if (result == 2) // 경기를 계속 진행하는 경우
        {
            printf("\n");
        }
    }
}

void draw(int ary[3][3]) {
    printf("\n");

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (ary[i][j] == 1) {
                printf("%c", 'O'); // 보드판 숫자가 1이면 O
            }
            else if (ary[i][j] == 2) {
                printf("%c", 'X'); // 보드판 숫자가 2이면 X
            }
            else {
                printf("*"); // 나머지 숫자면 *
            }
        }
        printf("\n");
    } // 보드판 출력
}

int check(int ary[3][3], int i, int j, int com) {
    int score = 0;

    if (ary[i][(j + 1) % 3] == ary[i][(j + 2) % 3]) {
        if (ary[i][(j + 1) % 3] == com)
            return 10;
        else if(ary[i][(j + 1) % 3] != 0)
            score = 9;
    }
    if (ary[(i + 1) % 3][j] == ary[(i + 2) % 3][j]) {
        if (ary[(i + 1) % 3][j] == com)
            return 10;
        else if (ary[(i + 1) % 3][j] != 0)
            score = 9;
    }
    if ((i == j) && (ary[(i + 1) % 3][(j + 1) % 3] == ary[(i + 2) % 3][(j + 2) % 3])) {
        if (ary[(i + 1) % 3][(j + 1) % 3] == com)
            return 10;
        else if (ary[(i + 1) % 3][(j + 1) % 3] != 0)
            score = 9;
    }
    if ((i == (j + 2) % 4) && (ary[(i + 1) % 3][(j + 2) % 3] == ary[(i + 2) % 3][(j + 1) % 3])) {
        if (ary[(i + 1) % 3][(j + 2) % 3] == com)
            return 10;
        else if (ary[(i + 1) % 3][(j + 2) % 3] != 0)
            score = 9;
    }

    ary[i][j] = com;
    int count = 8;
    if (ary[1][1] != com) {
        if (ary[0][0] != com && ary[2][2] != com)
            count--;
        if (ary[0][2] != com && ary[2][0] != com)
            count--;
    }
    for (int x = 0; x < 3; x++)
    {
        if (ary[x][0] != com && ary[x][1] != com && ary[x][2] != com) {
            count--;
        }
        if (ary[0][x] != com && ary[1][x] != com && ary[2][x] != com) {
            count--;
        }
    }
    ary[i][j] = 0;

    if (count < score)
        return score;
    else
        return count;
}// 승패 결정 함수 정의


int Bingo(int ary[3][3], int n) {
    if (ary[1][1] != 0) {
        if ((ary[0][0] == ary[1][1] && ary[0][0] == ary[2][2]) || (ary[0][2] == ary[1][1] && ary[0][2] == ary[2][0])) {
            return 0;
        }
    }//대각선으로 빙고가 생기는지 확인

    for (int line = 0; line <= 2; line++) {
        if ((ary[line][0] != 0 && ary[line][0] == ary[line][1] && ary[line][0] == ary[line][2]) || (ary[0][line] != 0 && ary[0][line] == ary[1][line] && ary[0][line] == ary[2][line])) {
            return 0;
        } //가로, 세로줄로 빙고가 생기는지 확인, line은 각 가로, 세로줄의 줄 번호 
    }

    if (n == 9) {
        return 1;
    } //시행횟수가 9번이면 무승부로 결정

}// 승패 결정 함수 정의

관련글 더보기

댓글 영역