본문 바로가기
프로그램/C언어 1000제

C언어 197제] C언어 콘서트(개정 3판) CHAPTER 7 mini Project Tic-Tac-Toe 게임 p285

by 건티 2024. 12. 7.
728x90

출처 : 반크_백제역사 유적지구와 이스탐블역사 유적지구

 

문제]

컴퓨터와 게이머가 대결하는 프로그램으로 수정하시오.

조건)
▶ 가로줄, 세로줄, 각 대각선이 같은 문자이면 끝내도록 하시오.
▶ 승부가 나지 않으면 "게이머와 컴퓨터는 비겼습니다."를 출력하시오.
▶ 그외 참고풀이 결과를 참조하여 프로그램을 완성하시오.


참고풀이]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> //srand(), rand()
#include <time.h> //time()

int main()
{
    char board[3][3]={ '\0' };
    int r, c, y, x;//행열변수
    int k, i;
    int pn, cn;//게이머 또는 컴퓨터의 같은 문자 개수 체크 변수
    int chk;//게임 끝남여부를 체크한다.

    //보드를 빈칸으로 초기화한다.
    for (r = 0; r < 3; r++)
        for (c = 0; c < 3; c++)
            board[r][c] = ' ';
    //무작위로 발생하도록 초기화한다.
    srand(time(NULL));

    k = 0;
    while (1)
    {
        k++;
        if (k > 9) break;
        //사용자로부터 위치를 받아서 보드에 'O'표시한다.
        printf("사용자 (x, y)좌표 : ");
        scanf("%d%d",&c,&r);
        board[r][c] = 'O';

        //게이머 선택 위치를 화면에 그린다.
        for (i = 0; i < 3; i++)
        {
            printf("---|---|---\n");
            printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        }
        printf("---|---|---\n");

        //게이머가 이겼는지 체크한다.
        //Tic-Tac-Toe은 가로줄, 세로줄, 댁각선 중 같은 문자가 3개면 이기는 게임이다.
        //가로줄 체크
        for (y = 0; y < 3; y++)
        {
            pn = 0;
            for (x = 0; x < 3; x++)
                if (board[y][x] == 'O') pn++;
            if (pn == 3) break;
        }
        //세로줄 체크
        if (pn != 3)
            for (x = 0; x < 3; x++)
            {
                pn = 0;
                for (y = 0; y < 3; y++)
                    if (board[y][x] == 'O') pn++;
                if (pn == 3) break;
            }
        //대각선 체크
        if (pn != 3)
        {
            pn = 0;
            if (board[0][0] == board[1][1] && board[0][0] == board[2][2])
                pn = 3;
            if (board[0][2] == board[1][1] && board[0][2] == board[2][0])
                pn = 3;
        }

        //승자체크부분
        if (pn == 3)
        {
            printf("\n게이머가 이겼습니다.\n");
            break;
        }

        k++;
        if (k > 9) break;
        //컴퓨터의 위치를 발생하여 
        //사용자와 겹치지 않는 곳이라면 보드에 'X'표시한다.
        while (1)
        {
            c = rand() % 3;
            r = rand() % 3;
            if (board[r][c] == ' ')
            {
                printf("컴퓨터 (x, y)좌표 : %d %d\n",c,r);
                board[r][c] = 'X';
                break;
            }
        }
        //컴퓨터 선택 위치를 화면에 그린다.
        for (i = 0; i < 3; i++)
        {
            printf("---|---|---\n");
            printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        }
        printf("---|---|---\n");

        //가로줄 체크
        for (y = 0; y < 3; y++)
        {
            cn = 0;
            for (x = 0; x < 3; x++)
                if (board[y][x] == 'X') pn++;
            if (cn == 3) break;
        }
        //세로줄 체크
        if (cn != 3)
            for (x = 0; x < 3; x++)
            {
                cn = 0;
                for (y = 0; y < 3; y++)
                    if (board[y][x] == 'X') pn++;
                if (cn == 3) break;
            }
        //대각선 체크
        if (cn != 3)
        {
            cn = 0;
            if (board[0][0] == board[1][1] && board[0][0] == board[2][2])
                cn = 3;
            if (board[0][2] == board[1][1] && board[0][2] == board[2][0])
                cn = 3;
        }

        //승자체크부분
        if (cn == 3)
        {
            printf("\n컴퓨터가 이겼습니다.\n");
            break;
        }
    }
    if (pn != 3 && cn != 3)
        printf("\n게이머와 컴퓨터는 비겼습니다.\n");

    return 0;
}

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도

 

반응형

댓글