C++/문제 풀이
[객체지향언어1] 명품 C++ 프로그래밍 4장 Open Challenge
uzichoi
2025. 4. 13. 15:25
[C++] 명품 C++ 프로그래밍 4장 오픈 챌린지 - 한글 끝말잇기 게임
Q. n명이 하는 한글 끝말잇기 게임을 작성해 보자. 아래의 결과와 같이 선수의 수를 입력받고, 선수 각 사람의 이름을 입력받아 게임을 시작한다.
- 3개의 모듈로 나누어라.
- WordGame 클래스: 끝말잇기 게임 전체를 운영하는 클래스
- Player 클래스: 선수를 표현하는 클래스
- main() 함수: WordGame 객체를 생성하고 게임을 시작하는 함수
- 한글 문제
- 한글 문자열을 저장하기 위해 string 클래스를 이용하라. 한글은 2바이트 코드로 저장되므로, 문자 비교를 위해서는 두 바이트를 함께 비교하여야 한다. at() 함수와 && 조건을 사용하자.
<실행화면>
<소스코드>
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
class Player {
string name;
public:
void setName(string tmp) { name = tmp; }
string getName() { return name; }
};
class WordGame {
Player* player;
int num;
public:
WordGame();
~WordGame() { delete[] player; }
void gameStart(); // 게임 시작 위한 초기 작업
void gameProgess(); // 끝말잇기 게임 진행
};
WordGame::WordGame() {
cout << "끝말 잇기 게임을 시작합니다" << endl;
while(true) {
cout << "게임에 참가하는 인원은 몇명입니까?";
cin >> num;
if (isdigit(num) || num <= 0) { // 오류 방지 코드
cout << "올바른 값을 입력하세요" << endl;
continue;
}
else {
player = new Player[num];
break;
}
}
}
void WordGame::gameStart() {
for (int i = 0; i < this->num; i++) {
cout << "참가자의 이름을 입력하세요. 빈칸 없이>>";
string tmp;
cin >> tmp;
player[i].setName(tmp);
}
}
void WordGame::gameProgess() {
cout << "시작하는 단어는 아버지입니다" << endl;
string a = "아버지";
string b;
int i = 0;
while (true) {
int lenA = a.size(); //a 스트링의 길이
cout << player[i].getName() << ">>";
cin >> b;
if (a.at(lenA - 2) == b.at(0) && a.at(lenA - 1) == b.at(1)) { // 끝말잇기 성공
a = b;
i = (i + 1) % num;
}
else {
cout << player[i].getName() << "님이 패배하였습니다. 게임 종료" << endl;
return;
}
}
}
int main() {
WordGame w;
w.gameStart();
w.gameProgess();
return 0;
}