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

C++ 77제] 어서와 C++는 처음이지! p110 도전문제 응용.

by 건티 2022. 9. 16.
728x90

출처 : 반크_세계유산 창덕궁

 

문제]

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

조건)

▶ 가로줄, 세로줄, 각 대각선이 같은 문자이면 끝내도록 하시오.

▶ 승부가 나지 않으면 "게이머와 컴퓨터는 비겼습니다."를 출력하시오.

그외 참고풀이 결과를 참조하여 프로그램을 완성하시오.

참고풀이]

#include <iostream>
#include <cstdlib> //srand(), rand()
#include <ctime> //time()
using namespace std;

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 (true)
   {
      k++;
      if (k > 9) break;
      //사용자로부터 위치를 받아서 보드에 'O'표시한다.
      cout << "사용자 (x, y)좌표 : ";
      cin >> c >> r;
      board[r][c] = 'O';

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

      //게이머가 이겼는지 체크한다.
      //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)
      {
         cout << "\n게이머가 이겼습니다.\n";
         break;
      }

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

      //가로줄 체크
      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)
      {
         cout << "\n컴퓨터가 이겼습니다.\n";
         break;
      }
   }
   if(pn!=3 && cn!=3) 
      cout << "\n게이머와 컴퓨터는 비겼습니다.\n";

   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

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

 

반응형

댓글