출처 : 반크_세계유산 창덕궁
문제]
컴퓨터와 게이머가 대결하는 프로그램으로 수정하시오.
조건)
▶ 가로줄, 세로줄, 각 대각선이 같은 문자이면 끝내도록 하시오.
▶ 승부가 나지 않으면 "게이머와 컴퓨터는 비겼습니다."를 출력하시오.
▶ 그외 참고풀이 결과를 참조하여 프로그램을 완성하시오.
참고풀이]
#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;
}
참고풀이 결과]
대한민국의 아름다운 영토, 독도의 봄
'프로그램 > C++ 1000제' 카테고리의 다른 글
C++ 79제] 어서와 C++는 처음이지! CHAPTER 02 PROGRAMMING EXERCISE 1. (0) | 2022.09.30 |
---|---|
C++ 78제] 어서와 C++는 처음이지! p112 도전문제. (0) | 2022.09.30 |
C++ 76제] 어서와 C++는 처음이지! p104 도전문제 2. (0) | 2022.09.11 |
C++ 75제] 어서와 C++는 처음이지! p104 도전문제1 (0) | 2022.09.11 |
C++ 74제] vector 사용, 사칙연산 문제를 출제하시오. (0) | 2022.09.10 |
댓글