상세 컨텐츠

본문 제목

[객체지향언어1] 명품 C++ 프로그래밍 4장 Open Challenge

C++/문제 풀이

by uzichoi 2025. 4. 13. 15:25

본문

[C++] 명품 C++ 프로그래밍 4장 오픈 챌린지 - 한글 끝말잇기 게임

 

Q. n명이 하는 한글 끝말잇기 게임을 작성해 보자. 아래의 결과와 같이 선수의 수를 입력받고, 선수 각 사람의 이름을 입력받아 게임을 시작한다. 

  1. 3개의 모듈로 나누어라.
    • WordGame 클래스: 끝말잇기 게임 전체를 운영하는 클래스
    • Player 클래스: 선수를 표현하는 클래스
    • main() 함수: WordGame  객체를 생성하고 게임을 시작하는 함수
  2. 한글 문제
    • 한글 문자열을 저장하기 위해 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;
}

관련글 더보기