Menu



Manage

Study_C > 2-DICE.c Lines 144 | 4.2 KB
다운로드

                        ///////// TIC-TAC_TOE GAME ////////

#define _CRT_SECURE_NO_WARNINGS // C4996 에러 제거를 위한 코드 (scanf 에러방지)
#include <stdio.h>              // 입-출력을 하기 위한 함수 stdio.h를 불러오기 (표준 입출력)
#include <stdlib.h>             // rand() 입력을 위한 라이브러리 불러오기
#include <time.h>               // time() 입력을 위한 time.h 불러오기
//컴퓨터가 빈자리에 랜덤으로 입력하는 방식을 이용할것임

void printDI(char a[][3]);       // 화면에 표시 함수
int winner(char a[][3], char c); // 승자 판독 함수

int main()
{
    char bpan[3][3];   // 3*3 배열 생성 (TIP 보드판을 줄여서 b판이라 하였음)
    int x, y, k = 0;   // 변수 생성 및 초기화 but x와 y값의 경우 배열 초기화를 하며 초기화되니 제외하였음
    srand(time(NULL)); //매번 달라지는 랜덤값 생성

    //게임 문구
    printf("///////////////////////////////////\n///////// TIC-TAC_TOE GAME ////////\n///////////////////////////////////\n\n\n");

        //주의사항
        printf("주의\n'x, y'형식으로 치면 오류가 발생하니 해당 방식으로 이용하지 말아주세요!\n\n\n");

    //보드(배열) 초기화 코드
    for (x = 0; x < 3; x++)
        for (y = 0; y < 3; y++)
        {
            bpan[x][y] = ' ';
        }

    //입력받은 좌표를 보드판에 표시
    for (k = 0; k < 9; k++)
    {
        while (1)
        {
            printf("\nx와 y의 좌표를 입력해주세요 :\n");
            scanf("%d %d", &x, &y);

            if (2 < x || 2 < y) // 보드판 범위를 초과한경우
            {
                printf("좌표값의 크기는 0 ~ 2여야 합니다. 다시 입력하세요.\n");
                k--; // 입력 횟수 복원
            }
            else if (bpan[x][y] != ' ') // 중복된 곳에 입력
            {
                printf("\n중복된 곳에 입력하셨습니다. 다시 입력해주세요.\n\n");
                k--; // 입력 횟수 복원
            }
            else
            {
                bpan[x][y] = (k % 2 == 0) ? 'X' : 'O';
                printDI(bpan);      // 화면 표시 함수 호출
                if (winner(bpan, bpan[x][y]) == 1)  //승자 판독 함수 호출 및 판독
                {
                    printf("플레이어의의 승리입니다.\n");
                    k = 9;  // 반복 중단값
                    break;  // while문 중단
                }
                else
                    k++;        // 컴퓨터의 모양 변경을 위한 값
                break;      // while문 중단
            }
        }
        if (k < 9) //플레이어 승리시 실행되지 않음
        {
            //컴퓨터의 차례
            while (1)
            {
                x = rand() % 3;
                y = rand() % 3;
                if (bpan[x][y] == ' ')
                {
                    break;
                }
            }
            printf("\n컴퓨터의 착수\n\n");
            bpan[x][y] = (k % 2 == 0) ? 'X' : 'O';
            printDI(bpan);      // 화면 표시 함수 호출
            if (winner(bpan, bpan[x][y]) == 1)      //승자 판독 함수 호출 및 판독
            {
                printf("컴퓨터가 이겼습니다. 풉ㅋ풉ㅋ\n");
                k = 9;      // 반복 중단
            }
        }
        else
            printf("컴퓨터를 이기다니 대단해!");
    }
    return 0;
}

void printDI(char a[][3]) // 화면 표시 함수
{
    int i; // for문에서 초기화가 되므로 초기화하지 않음
    for (i = 0; i < 3; i++)
    {
        printf("---|---|---\n");
        printf(" %c | %c | %c\n", a[i][0], a[i][1], a[i][2]);
    }
    printf("---|---|---\n");
}

int winner(char a[][3], char c) //승자 판독 함수
{
    int i, j; // for문에서 초기화가 되므로 초기화지 않음
    //가로
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
        {
            if (a[i][j] != c)
                break;
            if (j == 2)
                return 1;
        }

    //세로
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
        {
            if (a[j][i] != c)
                break;
            if (j == 2)
                return 1;
        }

    //대각선 1
    for (i = 0; i < 3; i++)
    {
        if (a[i][i] != c)
            break;
        if (i == 2)
            return 1;
    }

    //대각선 2
    for (i = 0; i < 3; i++)
    {
        if (a[i][2 - i] != c)
            break;
        if (i == 2)
            return 1;
    }

    return 0;
}