C++

[c++/STL] 상속과 vector를 활용한 랜덤 퀴즈

진서박 2023. 7. 8. 13:07
반응형

c++를 공부하기 시작했다. 객체지향 설계를 중점으로 공부하며 진행했다.

Media클래스에서 파생된 미디어들의 제목과 내용을 바탕으로 한 간단한 랜덤 퀴즈 프로그램을 만들었다.

 

Base가 되는 MediaInfo 클래스

더보기

MediaInfo

#ifndef MEDIAINFO_H
#define MEDIAINFO_H

#include<iostream>
#include<string>
using namespace std;

enum EMediaType
{
	AUDIO = 1,
	MOVIE
};

class MediaInfo {
protected:
	string title;
public:
	EMediaType mediaType;
	MediaInfo();
	MediaInfo(string title);
	virtual string GetTitle();
};
#endif
    
///////////////////////////////////////////////////////////////////////////////////////////////

#include "Quiz.h"
#include "MovieInfo.h"
#include "AudioInfo.h"

Quiz::Quiz() {
	mediaVector.clear();
	MediaInfo* mediaInfo[6] = {
		new MovieInfo("신세계", "죽기 딱 좋은 날씨네"),
		new MovieInfo("타짜", "묻고 더블로 가"),
		new MovieInfo("명량", "전하, 신에게는 아직 12척의 배가 남아있사옵니다"),
		new AudioInfo("리무진", "비오"),
		new AudioInfo("사건의 지평선", "윤하"),
		new AudioInfo("흔들리는 꽃들 속 에서 네 샴푸 향이 느껴진 거야", "장범준")
	};

	for (int i = 0; i < 6; i++) {
		InitVector(mediaInfo[i]);
	}
}

void Quiz::InitVector(MediaInfo*& mediaInfo) {
	mediaVector.push_back(mediaInfo);
}

void Quiz::Play() {
	srand((unsigned int)time(NULL));

	string userInput;

	int randomIndex = rand() % mediaVector.size();

	if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO)
		cout << "제목 : " << mediaVector[randomIndex]->GetTitle() << " / 노래를 부른 가수는?" << endl;

	else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE)
		cout << "명대사 : " << static_cast<MovieInfo*>(mediaVector[randomIndex])->GetQuotes() << " / 영화의 제목은?" << endl;
	else
		cout << "에러!";

	getline(cin, userInput);

	if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO &&
		static_cast<AudioInfo*>(mediaVector[randomIndex])->GetSinger() == userInput)
		cout << "정답!" << endl;

	else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE &&
		mediaVector[randomIndex]->GetTitle() == userInput)
		cout << "정답!" << endl;

	else
		cout << "오답!" << endl;
}

 

파생 클래스들

더보기

MovieInfo

#ifndef MOVIEINFO_H
#define MOVIEINFO_H

#include<iostream>
#include<string>

#include "MediaInfo.h"
#include "AudioInfo.h"


using namespace std;

class MovieInfo : public MediaInfo{
	string quotes;
public:
	MovieInfo();
	MovieInfo(string title, string quotes);
	virtual string GetTitle();
	string GetQuotes();
};
#endif


////////////////////////////////////////////////////////////////////////////////////////////////

#include "MovieInfo.h"

MovieInfo::MovieInfo() {
	quotes = "";
	mediaType = EMediaType::MOVIE;
}

MovieInfo::MovieInfo(string title, string quotes) {
	this->quotes = quotes;
	this->title = title;
	mediaType = EMediaType::MOVIE;
}

string MovieInfo::GetTitle() {
	return title;
}

string MovieInfo::GetQuotes() {
	return quotes;
}

 

AudioInfo

#ifndef AUDIOINFO_H
#define AUDIOINFO_H

#include<iostream>
#include<string>

#include "MediaInfo.h"

using namespace std;

class AudioInfo : public MediaInfo {
	string singer;
public:
	AudioInfo();
	AudioInfo(string title, string singer);
	virtual string GetTitle();
	string GetSinger();
};
#endif
    
////////////////////////////////////////////////////////////////////////////////////////////////////
    
#include "AudioInfo.h"

AudioInfo::AudioInfo() {
	singer = "";
	mediaType = EMediaType::AUDIO;
}

AudioInfo::AudioInfo(string title, string singer) {
	this->singer = singer;
	this->title = title;
	mediaType = EMediaType::AUDIO;
}

string AudioInfo::GetTitle() {
	return title;
}

string AudioInfo::GetSinger() {
	return singer;
}

 

최종적으로 퀴즈 진행을 담당하는 Quiz 클래스를 만들었다.

#ifndef QUIZ_H
#define QUIZ_H

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include "MediaInfo.h"


using namespace std;

class Quiz {
	vector<MediaInfo*> mediaVector;
public:
	Quiz();
	void InitVector(MediaInfo*& mediaInfo);
	void Play();
};

#endif



-----------------------------------------------------------------------------------------------------

#include "Quiz.h"
#include "MovieInfo.h"
#include "AudioInfo.h"

Quiz::Quiz() {
	mediaVector.clear();
	MediaInfo* mediaInfo[6] = {
		new MovieInfo("신세계", "죽기 딱 좋은 날씨네"),
		new MovieInfo("타짜", "묻고 더블로 가"),
		new MovieInfo("명량", "전하, 신에게는 아직 12척의 배가 남아있사옵니다"),
		new AudioInfo("리무진", "비오"),
		new AudioInfo("사건의 지평선", "윤하"),
		new AudioInfo("흔들리는 꽃들 속 에서 네 샴푸 향이 느껴진 거야", "장범준")
	};

	for (int i = 0; i < 6; i++) {
		InitVector(mediaInfo[i]);
	}
}

void Quiz::InitVector(MediaInfo*& mediaInfo) {
	mediaVector.push_back(mediaInfo);
}

void Quiz::Play() {
	srand((unsigned int)time(NULL));

	string userInput;

	int randomIndex = rand() % mediaVector.size();

	if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO)
		cout << "제목 : " << mediaVector[randomIndex]->GetTitle() << " / 노래를 부른 가수는?" << endl;

	else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE)
		cout << "명대사 : " << static_cast<MovieInfo*>(mediaVector[randomIndex])->GetQuotes() << " / 영화의 제목은?" << endl;
	else
		cout << "에러!";

	getline(cin, userInput);

	if (mediaVector[randomIndex]->mediaType == EMediaType::AUDIO &&
		static_cast<AudioInfo*>(mediaVector[randomIndex])->GetSinger() == userInput)
		cout << "정답!" << endl;

	else if (mediaVector[randomIndex]->mediaType == EMediaType::MOVIE &&
		mediaVector[randomIndex]->GetTitle() == userInput)
		cout << "정답!" << endl;

	else
		cout << "오답!" << endl;
}

 

5년전에 기초만 배우고, 게임개발을 위해 c#으로 넘어와 유니티만 만졌는데 최근 부족함을 느끼고 객체지향의 기본으로 돌아가기로 했다.

 

객체지향 프로그래머에게 가장 중요한 것은 클래스 설계를 얼마나 잘하는가에 달려있는 것 같다.

반응형