1. 문제
n명이 하는 한글 끝말잇기 게임을 작성해보자. 아래의 결과와 같이 선수의 수를 입력받고, 선수 각 사람의 이름을 입력받아 게임을 시작한다.
2. 결과
3. 코드
#include <iostream>
#include <string>
using namespace std;
class Player {
int number;
int temp;
string *name;
public :
Player(int n) ;
~Player() { delete [] name; }
string getName();
};
Player::Player(int n) {
number = n; temp = -1;
name = new string[number];
fflush(stdin);
for(int i=0; i<number; i++ ) {
cout << "참가자의 이름을 입력하세요. 빈칸 없이>>";
getline( cin, name[i] );
}
}
string Player::getName() {
temp++;
if( temp >= number ) temp = 0;
string named = name[temp];
return named;
}
class WordGame {
int num;
string before, after;
public :
WordGame();
void game();
};
WordGame::WordGame() {
before = "아버지";
}
void WordGame::game() {
cout << "끝말 잇기 게임을 시작합니다." << endl;
cout << "게임에 참가하는 인원은 몇명입니까?";
cin >> num;
Player p(num);
string named;
cout << "시작 단어는 아버지 입니다." << endl;
while( 1) {
named = p.getName();
cout << named << ">>";
getline( cin, after);
int size = before.size();
if( before.at( size-2 ) == after.at(0) && before.at( size-1 ) == after.at(1) )
{
before = after;
continue;
}
else
{
cout << named << "이 졌습니다.";
break;
}
}
}
int main() {
WordGame g;
g.game();
}
4. 설명
Player 클래스는 게임의 참가하는 인원 수를 입력 받은만큼 string배열을 동적으로 생성합니다.
그 후 참가자들 각각의 이름을 입력 받는 것으로 생성자가 끝납니다.
number변수에는 게임의 참가하는 인원수가 저장 되어있고 temp는 현재 차례가 누군지를 저장합니다.
이 2변수를 사용하여서 getName()함수를 호출할 때마다 차례대로 이름을 return하도록 합니다.
-----
WordGame 클래스의 생성자는 시작 단어인 "아버지"를 before변수에 저장합니다.
멤버 함수 game()에서는 게임의 시작과 진행, 종료를 구현합니다.
문자를 비교하는 방법은, 한글은 한 자에 2바이트로이므로 한글을 비교하기 위해서는 2개를 비교하여야 합니다.
before.at( size-2 ) == after.at(0) && before.at( size-1 ) == after.at(1) 처럼 맨 before 단어 끝 2개와 맨 after 단어(현재 입력되는 단어) 처음 2개를 비교해 주어야 합니다.
-----
※ Player() 생성자 함수 구현부를 보면 참가자들의 이름을 입력 받기 전 fflush(stdin); 을 한 이유는 우선 game()함수에서
cin을 사용하여서 참가자들의 수를 입력 받았습니다. 그 후 Player 변수를 선언하고 생성자로 들어가 이름을 입력 받을 시
getline을 사용합니다. 하지만 여기서 fflush(stdin)이 없다면 오류가 발생합니다.
그 이유는 cin은 "\n"(엔터)를 입력버퍼에서 남기기 때문입니다. \n이 남아 있는 상태에서 getline()이 실행되게 되고 오류가
발생하게 되는 것 입니다. 그러니 fflush(stdin)으로 입력 버퍼를 비워주셔야 하는 것 입니다. 또한 fflush(stdin);을 Player
생성자에서 삽입하지 않고 game()함수에서 인원 수를 입력 받은 후 fflush(stdin);으로 입력 버퍼를 비운 후 Player 변수를
생성하여도 오류가 발생하지 않습니다.
'명품 C++ programming' 카테고리의 다른 글
명품 C++ programming 실습문제 5장 2번 (0) | 2019.04.07 |
---|---|
명품 C++ programming 실습문제 5장 1번 (1) | 2019.04.07 |
명품 C++ programming 실습문제 4장 11번 (0) | 2019.04.07 |
명품 C++ programming 실습문제 4장 10번 (0) | 2019.04.07 |
명품 C++ programming 실습문제 4장 9번 (0) | 2019.04.07 |