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 변수를 
 
생성하여도 오류가 발생하지 않습니다.

 

+ Recent posts