#include "stdafx.h" #include <iostream> #include <time.h> #include <list> using namespace std; template <typename T> void SAFE_DELETE(T& pointer) { if(pointer) { delete pointer; pointer = NULL; } } enum STAGE_TYPE { STAGE_TYPE_SKY, STAGE_TYPE_SEA, STAGE_TYPE_LAND }; enum STAGE_COUNT { STAGE_COUNT_MAXMONSTER = 10, STAGE_COUNT_MAXMONSTERTYPE = 20, STAGE_COUNT_MAXTERRAIN = 10, STAGE_COUNT_MAXTERRAINTYPE = 10 }; typedef struct tagStageFile { STAGE_TYPE eStageType; int iBackGround; int listMonster[STAGE_COUNT_MAXMONSTER]; int listTerrain[STAGE_COUNT_MAXTERRAIN]; public: tagStageFile(void) { eStageType = (STAGE_TYPE)(rand() % 3); iBackGround = rand() % 10; memset(listMonster, -1, sizeof(int)*STAGE_COUNT_MAXMONSTER); memset(listTerrain, -1, sizeof(int)*STAGE_COUNT_MAXMONSTER); for (int i = 0; i < (rand() % 10) ; ++i) { listMonster[i] = rand() % STAGE_COUNT_MAXMONSTERTYPE; listTerrain[i] = rand() % STAGE_COUNT_MAXTERRAINTYPE; } } }STAGEFILE; class CStage { private: STAGE_TYPE eStageType; int iBackGround; list<int> listMonster; list<int> listTerrain; public: void SetStageType(STAGE_TYPE& _eStageType) { eStageType = _eStageType; } void SetBackGround(int& _iBackGround) { iBackGround = _iBackGround; } void SetMonster(int& _MonsterType) { listMonster.push_back(_MonsterType); } void SetTerrain(int& _TerrainType) { listTerrain.push_back(_TerrainType); } public: CStage(void) {} ~CStage(void) {} }; class CStageBuilder { protected: CStage m_Stage; public: CStage GetStage(void) { return m_Stage; } virtual void CreBackGround(int _BackGroundIndex) = 0; virtual void CreMonster(int _MonsterType) = 0; virtual void CreTerrain(int _TerrrainType) = 0; public: CStageBuilder(void) {} virtual ~CStageBuilder(void) {} }; class CSkyBuilder : public CStageBuilder { virtual void CreBackGround(int _BackGroundIndex) { cout << _BackGroundIndex << " 번 하늘이미지 배경으로 선택" << endl; m_Stage.SetBackGround(_BackGroundIndex); } virtual void CreMonster(int _MonsterType) { if(_MonsterType != -1) cout << _MonsterType << " 타입 공중몬스터 생성" << endl; m_Stage.SetMonster(_MonsterType); } virtual void CreTerrain(int _TerrrainType) { if(_TerrrainType != -1) cout << _TerrrainType << " 타입 공중지형지물생성" << endl; m_Stage.SetMonster(_TerrrainType); } public: CSkyBuilder(void) {} virtual ~CSkyBuilder(void) {} }; class CSeaBuilder : public CStageBuilder { virtual void CreBackGround(int _BackGroundIndex) { cout << _BackGroundIndex << " 번 바다이미지 배경으로 선택" << endl; m_Stage.SetBackGround(_BackGroundIndex); } virtual void CreMonster(int _MonsterType) { if(_MonsterType != -1) cout << _MonsterType << " 타입 바다몬스터 생성" << endl; m_Stage.SetMonster(_MonsterType); } virtual void CreTerrain(int _TerrrainType) { if(_TerrrainType != -1) cout << _TerrrainType << " 타입 바다지형지물 생성" << endl; m_Stage.SetMonster(_TerrrainType); } public: CSeaBuilder(void) {} virtual ~CSeaBuilder(void) {} }; class CLandBuilder : public CStageBuilder { virtual void CreBackGround(int _BackGroundIndex) { cout << _BackGroundIndex << " 번 하늘이미지 배경으로 선택" << endl; m_Stage.SetBackGround(_BackGroundIndex); } virtual void CreMonster(int _MonsterType) { if(_MonsterType != -1) cout << _MonsterType << " 타입 땅몬스터 생성" << endl; m_Stage.SetMonster(_MonsterType); } virtual void CreTerrain(int _TerrrainType) { if(_TerrrainType != -1) cout << _TerrrainType << " 타입 땅지형지물생성" << endl; m_Stage.SetMonster(_TerrrainType); } public: CLandBuilder(void) {} virtual ~CLandBuilder(void) {} }; class CStageDirector { private: STAGEFILE m_tStageFile; CStageBuilder* m_cStageBuilder; public: void CreStage (STAGEFILE _tStageFile) { cout << "---스테이지 타입 확인---" << endl; switch(_tStageFile.eStageType) { case STAGE_TYPE_SKY: cout << "하늘 스테이지생성시작" << endl; m_cStageBuilder = new CSkyBuilder; break; case STAGE_TYPE_SEA: cout << "해저 스테이지생성시작" << endl; m_cStageBuilder = new CSeaBuilder; break; case STAGE_TYPE_LAND: cout << "지상 스테이지생성시작" << endl; m_cStageBuilder = new CLandBuilder; break; } cout << "---스테이지 배경 생성---" << endl; m_cStageBuilder->CreBackGround(m_tStageFile.iBackGround); cout << "---스테이지 몬스터 생성---" << endl; for(int i = 0 ; i < STAGE_COUNT_MAXMONSTER ; ++i) { m_cStageBuilder->CreMonster(m_tStageFile.listMonster[i]); } cout << "---스테이지 지형지물 생성---" << endl; for(int i = 0 ; i < STAGE_COUNT_MAXTERRAIN ; ++i) { m_cStageBuilder->CreTerrain(m_tStageFile.listTerrain[i]); } } public: CStage GetResultStage(void) { m_cStageBuilder->GetStage(); } public: CStageDirector(void) {} ~CStageDirector(void) { SAFE_DELETE(m_cStageBuilder); } }; int _tmain(int argc, _TCHAR* argv[]) { srand((unsigned)time(NULL)); STAGEFILE StageFile; CStageDirector StageDirector; StageDirector.CreStage(StageFile); return 0; } |