/*************



20171025 조건부 컴파일 모드 


20171026 갱신



*****************/




//내가 사용할 클래스의 헤더파일을 인클루드 



/**씨플러스플러스 확장팩 헤더**/

# include <iostream> //씨뿔뿔 입출력 헤더 


/**씨 언어 헤더**/

# include <windows.h> //윈도우즈 핸들 //cls 사용

# include <stdio.h> //전처리기(#) 포함(include) 입출력(stdio.h)

# include <conio.h> //getch 함수에 필요한거 

#include <stdlib.h> //system("cls")를 쓰기 위한 헤더파일


#include <locale.h>


//#include <wchar.h>


#include <string.h>



# include <time.h>



#pragma comment(lib, "winmm.lib")





#include "C조상.h" //조상 클래스 헤더


#include "Define.h" //디파인 상수 헤더 


#include "S읍성.h" //S읍성 구조체 헤더 


#include "전역변수.h" //전역변수 헤더 



#include "전역이넘.h" //전역이넘배열 헤더 



#include "상수배열.h" //상수배열 헤더 




#include "함수선언.h" //함수선언 헤더 


#include "함수정의.h" //함수정의 헤더 



#include "F왕겜성.h" //왕겜성 함수 정의 헤더 






#define 테스트_점검 666





#if 테스트_점검 == 666






class C도시정보

{



private:

char* m_i이름; //도시 이름 

int m_i인구수; //인구수


int m_i읍성제색병수;  //병사수


int m_i읍성잡색군수; //잡색군수 (예비군)


int m_i쌀수; //쌀수 


int m_i나무수; //나무수


int m_i철수;  //철 


int m_i구리수; //구리 


int m_i황금수; //황금 


int m_i은수;  //은 


int m_i백성의홧병; //백성의 홧병 즉 민심


   /////


int m_i면포수; //도시의 면포 수 


int m_i화폐수; //도시의 화폐 수


int m_i기타잡화폐수; //도시의 기타 잡스런 화폐 수




public:

//기본생성자

C도시정보()

:


m_i인구수(0), //인구수


m_i읍성제색병수(0),  //병사수


m_i읍성잡색군수(0), //잡색군수 (예비군)


m_i쌀수(0), //쌀수 


m_i나무수(0), //나무수


m_i철수(0),  //철 


m_i구리수(0), //구리 


m_i황금수(0), //황금 


m_i은수(0), //은 


m_i백성의홧병(0), //백성의 홧병 즉 민심


  /////


m_i면포수(0), //도시의 면포 수 


m_i화폐수(0), //도시의 화폐 수


m_i기타잡화폐수(0) //도시의 기타 잡스런 화폐 수




{




}





//매개변수 멤버초기화 생성자

C도시정보(

int _인구수, //인구수


int _읍성제색병수,  //병사수


int _읍성잡색군수, //잡색군수 (예비군)


int _쌀수, //쌀수 


int _나무수, //나무수


int _철수,  //철 


int _구리수, //구리 


int _황금수, //황금 


int _은수,  //은 


int _백성의홧병, //백성의 홧병 즉 민심


   /////


int _면포수, //도시의 면포 수 


int _화폐수, //도시의 화폐 수


int _기타잡화폐수 //도시의 기타 잡스런 화폐 수


) :

//멤버 변수 초기화 리스트 

m_i인구수(_인구수), //인구수


m_i읍성제색병수(_읍성제색병수),  //병사수


m_i읍성잡색군수(_읍성잡색군수), //잡색군수 (예비군)


m_i쌀수(_쌀수), //쌀수 


m_i나무수(_나무수), //나무수


m_i철수(_철수),  //철 


m_i구리수(_구리수), //구리 


m_i황금수(_황금수), //황금 


m_i은수(_은수),  //은 


m_i백성의홧병(_백성의홧병), //백성의 홧병 즉 민심


/////


m_i면포수(_면포수), //도시의 면포 수 


m_i화폐수(_화폐수), //도시의 화폐 수


m_i기타잡화폐수(_기타잡화폐수) //도시의 기타 잡스런 화폐 수




//멤버 변수가 생성되자마자 괄호안의 값을 바로 넣는다. 


//모든 멤버변수의 초기화는 리스트에서 바로 한다. 

//변수가 만들어지자마자 부모가 호출 


{


std::cout << "C도시정보 오버로딩 연산자 호출..." << std::endl;



//부모의 변수에 접근하는 방법

//범위 지정 연산자

//CHuman::CHuman(_hp, _mp, _exp);


//근데 아직도 디폴트생성자가 없어용이라고 뜨죠.


//우리는 뭔가 서버에서 받을수있는걸로만 만들수있게하고싶죠.


//생성자는 그냥 호출이 불가능합니다. 소멸자도 마찬가지죠.



//m_iShield = _shield; //이미 변수가 만들어진 다음에 대입리스트 




}




//소멸자

~C도시정보()

{


std::cout << "C도시정보 멸망기 호출..." << std::endl;

std::cout << "C도시정보가 불과 유황의 호수에 추락한다..." << std::endl;





}



public:

struct S인구정보 //씨뿔뿔에선 구조체 재정의가 필요없다.

{

char* 이름;

int 인구수;

int 솔종수;

// int 공격력;

//int 방어력;

//int 강화도;



//도끼 생성자 호출

S인구정보() : 인구수(666), 솔종수(666)

{




}



};



private:

S인구정보 좌식자;

S인구정보 호민;

S인구정보 하호;







public:


//기능 함수들 적기 


void 설정이름(char* _넣는이름)

{



m_i이름 = _넣는이름;


}


void 프린트이름()

{



std::cout << "도시 이름 : " << m_i이름 << std::endl;


}










};





//C조상 사탄;






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

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

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



//오스트랄로피테쿠스 


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


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


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


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



//호모사피엔스 

//후손 클래스 


class C별종 : public C조상

{



//public:

//unsigned int 아이템;


private: //개인정보

//int m_i별종의개인정보;

int m_i복근;


public:


//생성자

//멤버 초기화 리스트 (Member Initialize List)

C별종(int _넣는체력, int _넣는마법력, int _넣는경험치, int _넣는레벨 , int _넣는공격력 , 

int _넣는방어력 , int _넣는근육_쉴드, int _넣는돈 , int _넣는복근) :

//멤버 변수 초기화 리스트 

C조상(_넣는체력, _넣는마법력, _넣는경험치, _넣는레벨, _넣는공격력, _넣는방어력, _넣는근육_쉴드,

_넣는돈), m_i복근(_넣는복근)


//멤버 변수가 생성되자마자 괄호안의 값을 바로 넣는다. 


//모든 멤버변수의 초기화는 리스트에서 바로 한다. 

//변수가 만들어지자마자 부모가 호출 


{


std::cout << "별종 오버로딩 연산자 호출..." << std::endl;



//부모의 변수에 접근하는 방법

//범위 지정 연산자

//CHuman::CHuman(_hp, _mp, _exp);


//근데 아직도 디폴트생성자가 없어용이라고 뜨죠.


//우리는 뭔가 서버에서 받을수있는걸로만 만들수있게하고싶죠.


//생성자는 그냥 호출이 불가능합니다. 소멸자도 마찬가지죠.



//m_iShield = _shield; //이미 변수가 만들어진 다음에 대입리스트 




}



//소멸자 //소멸자는 매개변수를 못받고 오버로딩도 안된다.

~C별종()

{


std::cout << "C별종 멸망기 호출..." << std::endl;




}



//후손이 부모의 함수를 재정의하는 함수 오버라이딩


void 공격()

{


//공격(); //이렇게하면 재귀호출이라서 뻗는다.


//부모 함수 호출

C조상::공격();


std::cout << "C별종의 신석기 어택!!" << std::endl;





}




};







 

//종묘 클래스 


class C종묘 : public C조상

{



//public:

//unsigned int 아이템;


private: //개인정보

//int m_i별종의개인정보;

int m_i제삿밥_양갱;


//int m_i타임;



public:


//생성자

//멤버 초기화 리스트 (Member Initialize List)

C종묘(int _넣는체력, int _넣는마법력, int _넣는경험치, int _넣는레벨, int _넣는공격력,

int _넣는방어력, int _넣는근육_쉴드, int _넣는돈, int _넣는양갱) :

//멤버 변수 초기화 리스트 

C조상(_넣는체력, _넣는마법력, _넣는경험치, _넣는레벨, _넣는공격력, _넣는방어력, _넣는근육_쉴드,

_넣는돈), m_i제삿밥_양갱(_넣는양갱)


//멤버 변수가 생성되자마자 괄호안의 값을 바로 넣는다. 


//모든 멤버변수의 초기화는 리스트에서 바로 한다. 

//변수가 만들어지자마자 부모가 호출 


{


std::cout << "종묘 오버로딩 연산자 호출..." << std::endl;




//부모의 변수에 접근하는 방법

//범위 지정 연산자

//CHuman::CHuman(_hp, _mp, _exp);


//근데 아직도 디폴트생성자가 없어용이라고 뜨죠.


//우리는 뭔가 서버에서 받을수있는걸로만 만들수있게하고싶죠.


//생성자는 그냥 호출이 불가능합니다. 소멸자도 마찬가지죠.



//m_iShield = _shield; //이미 변수가 만들어진 다음에 대입리스트 




}



//소멸자 //소멸자는 매개변수를 못받고 오버로딩도 안된다.

~C종묘()

{


std::cout << "C종묘 멸망기 호출..." << std::endl;




}



//후손이 부모의 함수를 재정의하는 함수 오버라이딩


void 공격()

{


//공격(); //이렇게하면 재귀호출이라서 뻗는다.


//부모 함수 호출

C조상::공격();


std::cout << "C종묘의 저주 어택!!" << std::endl;





}




//public:

//struct S타임 //씨뿔뿔에선 구조체 재정의가 필요없다.

//{


// int 플레이타임;

// int 엔딩타임;


//도끼 생성자 호출

// S타임() : 플레이타임(666), 엔딩타임(666)

// {




// }



//};






//void 종묘시간의방()

//{



//C조상::S타임::플레이타임 = 666;


//while (S타임::플레이타임 < S타임::엔딩타임)

//{





//}





//}



};











class C니므롯 : public C별종

{



private: //개인정보

//int m_i별종의개인정보;

//int m_i복근;





public:



enum 왕도

{

칭기스요시츠네 = 666,

노부나가 = 1,

히데요시 = 2,

이에야스 = 3,

선조 = 4,

영조 = 5,

정조 = 6,

대원군 = 7,

명성황후 = 8,

고종 = 9,

천개소문 = 10




};




//public:

//unsigned int 아이템;


//private: //개인정보

//int m_i별종의개인정보;

//int m_i복근;


public:


//생성자

//멤버 초기화 리스트 (Member Initialize List)

C니므롯(int _넣는체력, int _넣는마법력, int _넣는경험치, int _넣는레벨, int _넣는공격력, int _넣는방어력, 

int _넣는근육_쉴드,

int _넣는돈, int _넣는복근) :

//멤버 변수 초기화 리스트 

C별종(_넣는체력, _넣는마법력, _넣는경험치, _넣는레벨, _넣는공격력, _넣는방어력, _넣는근육_쉴드,

_넣는돈 , _넣는복근) //, m_i복근(_넣는복근)


   //멤버 변수가 생성되자마자 괄호안의 값을 바로 넣는다. 


   //모든 멤버변수의 초기화는 리스트에서 바로 한다. 

   //변수가 만들어지자마자 부모가 호출 


{


std::cout << "니므롯 오버로딩 연산자 호출..." << std::endl;



//부모의 변수에 접근하는 방법

//범위 지정 연산자

//CHuman::CHuman(_hp, _mp, _exp);


//근데 아직도 디폴트생성자가 없어용이라고 뜨죠.


//우리는 뭔가 서버에서 받을수있는걸로만 만들수있게하고싶죠.


//생성자는 그냥 호출이 불가능합니다. 소멸자도 마찬가지죠.



//m_iShield = _shield; //이미 변수가 만들어진 다음에 대입리스트 




}



//소멸자 //소멸자는 매개변수를 못받고 오버로딩도 안된다.

~C니므롯()

{


std::cout << "C니므롯 멸망기 호출..." << std::endl;




}



//후손이 부모의 함수를 재정의하는 함수 오버라이딩


void 공격()

{


//공격(); //이렇게하면 재귀호출이라서 뻗는다.


//부모 함수 호출

C조상::공격();


std::cout << "C니므롯의 청동기 어택!!" << std::endl;





}




};






class C사탄적그리스도 : public C니므롯

{



private: //개인정보

//int m_i별종의개인정보;

// int m_i복근;





public:

struct S일본도 //씨뿔뿔에선 구조체 재정의가 필요없다.

{


int 체력;

int 마력;

int 공격력;

int 방어력;

int 강화도;



//도끼 생성자 호출

S일본도() : 체력(666), 마력(666), 공격력(666), 방어력(666), 강화도(666)

{




}



};



private:

S일본도 m_cur도끼;



public:

C사탄적그리스도(int _넣는체력, int _넣는마법력, int _넣는경험치, int _넣는레벨, int _넣는공격력, int _넣는방어력,

int _넣는근육_쉴드,

int _넣는돈, int _넣는복근) :

/****멤버리스트 초기화*****/ C니므롯(_넣는체력, _넣는마법력, _넣는경험치, _넣는레벨, _넣는공격력, _넣는방어력, _넣는근육_쉴드,

_넣는돈, _넣는복근)

{



std::cout << "사탄적그리스도 생성자 호출!" << std::endl;



}


void 설정도끼(S일본도 _넣는도끼)

{



m_cur도끼 = _넣는도끼;


}



//여기에 인젝션 함수 하나 더 적어야됨.


void 찌르기도끼(C조상& _넣은희생제물)

{



_넣은희생제물.설정체력(_넣은희생제물.받기체력() - m_cur도끼.공격력);



}




};




//조상을 그대로 빼닮은 노비 

class C노비 : protected C조상

{



private: //개인정보

//int m_i별종의개인정보;

//int m_i복근;




public:

//클래스 내부에 이넘 선언 가능 

enum E전자발찌 //c++는 이넘도 구조체도 전부 재정의가 필요없다.

{


k청동,

k은,

k금


};


private:

E전자발찌 m_족쇄;



public:

//기본 생성자

C노비() :

C조상(

50, //체력

0,  //마법력

0,  //경험치

0, //레벨

1, //공격력

1, //방어력

2333, //근육

666 //돈 


),

m_족쇄(E전자발찌::k청동)

{


std::cout << "C노비 생성자 호출..." << std::endl;



}


//어택 못하는 노비를 만들시 오버로딩 생성자를 응용 


C노비(E전자발찌 _넣은족쇄) : C조상(

50, //체력

0,  //마법력

0,  //경험치

0, //레벨

1, //공격력

1, //방어력

2333, //근육

666 //돈 


), m_족쇄(_넣은족쇄)

{


std::cout << "C노비 오버로딩 생성자 호출..." << std::endl;





}



//함수 오버라이딩


void PrintState()

{



C조상::PrintState();


std::cout << "= C노비 지역 =" << std::endl;


//


std::cout << E전자발찌To문자열(m_족쇄) << std::endl;



}



protected:

//캐릭터 포인터 반환 


const char* const E전자발찌To문자열(E전자발찌 _넣은족쇄) /* 전자 컨스트는 주소보호 후자 컨스트는 값 보호**/

{


switch (_넣은족쇄)

{

case E전자발찌::k청동: return "청동";

case E전자발찌::k은: return "은";

case E전자발찌::k금: return "금";

default: return "아무것도 없음";

}


}




};








///*****

struct S김일성

{

char* 이름; //이름

int 체력;

int 공격력;

int 방어력;

int 쉴드;

int 마법력;

int 교시;


//생성자

S김일성()

{





}



//소멸자

~S김일성()

{




}



//구조체 객체 포인터 함수

S김일성* 받기애비자기자신()

{


//this->  //부모꺼 자식꺼 다 보임.

return this; //지를 반환하는 포인터


}





public:

struct S비파형카빈소총

{


int 체력;

int 마력;

int 공격력;

int 방어력;

int 강화도;


//비파형카빈소총 생성자 호출

S비파형카빈소총() : 체력(666), 마력(666), 공격력(666), 방어력(666), 강화도(666)

{



}



};



private:

S비파형카빈소총 m_cur무기;


public:

//S김일성(int )



void 설정무기(S비파형카빈소총 _넣는무기)

{



m_cur무기 = _넣는무기;


}



//여기에 인젝션 함수 하나 더 적어야됨.


void 찌르기무기(C조상& _넣은희생제물)

{



_넣은희생제물.설정체력(_넣은희생제물.받기체력() - m_cur무기.공격력);



}






};



//계승자 구조체

struct S새끼장군님 : public S김일성 //상속받는 부분

{




int 령도;

int 핵무기;




//생성자

S새끼장군님()

{





}



//소멸자

~S새끼장군님()

{




}





//구조체 객체 포인터 함수

S새끼장군님* 받기새끼자기자신()

{

//this->  //부모꺼 자식꺼 다 보임.


return this; //지를 반환하는 포인터


}




};



//**********/


/****************




int main(void) {

SChild child;

printf("SParent this : %x\n",

child.GetParentThis());

printf("val1 : %x\n", &child.val1);

printf("val2 : %x\n", &child.val2);


printf("SChild this : %x\n",

child.GetChildThis());

printf("val3 : %x\n", &child.val3);

printf("val4 : %x\n", &child.val4);



return 0;

}




*****************/









/***전역 상수 const ****/









/*************메모****************


한량나이트(좌식자) 구조체


서인(평민) 구조체


노비 구조체





*********************************/





/********메모**********


typedef struct _SCharacInfo

{


char* name;  //이름

int lv; //레벨

int hp; //체력

int mp; //마법력

int atk; //공격력

int def; //방어력

unsigned int item; //아이템


} SCharInfo;



************************/





//typedef enum _논리카드 {







//} 논리카드;








//캐릭터정보 삼국지동이전시나리오 = { 0 , 0 , 0 , 0 , 0 , 0




//};




/********메모********


typedef enum _Eitem {

ITEM_EMPTY = 0, ITEM_WEAPON = 1, ITEM_ARMOR = 2,

ITEM_ACCESSORY1 = 4, ITEM_ACCESSORY2 = 8

}  Eitem;



************/





//typedef enum _넘기기 

//{            


//기다리자 , 엔터치자


//} 넘기기;


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

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

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


//메인함수 

int main(void) //int main() 이렇게해도됨. //void는 '공허' 즉 매개변수가 텅비었다는 뜻. 

{



//_wsetlocale(LC_ALL, L"korean");


//wchar_t szName[256];





/********개발자전용 점검 모드***************/


//개발자전용점검모드부르기(); //이건 개발 다하면 주석처리하기. 


//개발자전용점검모드부르기(); //이건 개발 다하면 주석처리하기. 





//암흑과 공허의 지배 

while (세상의시작 == 0) //세상의시작 변수가 0인 동안 무한루프

{


//태초에 하늘과 땅이 공허했고 암흑이었느니라.

정리화면(); //화면정리 함수 호출 



/*************인트로 화면**************/


//int iInput = 입력처리();


//입력버퍼 비우기 부분 

//정리입력버퍼(); //버퍼 비우는 함수 호출 


//맨첫화면();


맨처음시작되는검은화면();


인트로화면();




/******************입력 , 버퍼비우기*******************/

//하나님이 가라사대 빛이 있으라 하시니 ...

//입력 작업 부분 


//세상의시작 = 입력처리();




//입력버퍼 비우기 부분 

//정리입력버퍼(); //버퍼 비우는 함수 호출 

/****************************************/


//대기중(); //버퍼에 안들어가고 입력들어오는 값을 바로 보는거




//게임 시작전 


정리화면();


게임시작전();


세상의시작 = 666;





}




//////////

//////////

//////////


//빛이 생기니 하나님 보시기에 좋았더라.

while (세상의시작 != 0 /***이건 안됨***/ /**** || 세상의시작 = 1260;***/)  //세상의시작 변수가 0이 아니면 무한루프 

{

정리화면();


//


//printf("게임 시작 \n");


//메뉴 정보 출력 <= 이건 좀있다 만들기 


//시나리오선택화면();


세상의시작 = 0; //세상의시작 변수를 0으로 돌려서 반복문에서 벗어난다.



   /****c는 절차지향이라는 점을 항상 기억*****/


시나리오선택화면();



}



if (시나리오변수 == 동이전시나리오플레이실행) //시나리오변수가 동이전시나리오플레이실행 상수이면

{



시나리오변수 = 동이전시나리오플레이머무르기; //시나리오변수를 동이전시나리오플레이머무르기상수로 바꾼다.


왕겜성(); //그후 왕겜성 함수를 호출한다.



}



//이 부분에서 조상클래스 객체 2명이 소멸하는 소멸자(멸망기)가 호출된다.


printf("               ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\t\n");

printf("               ┃  게임 종료 할 ....... ?    \n");

printf("               ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\t\n");




//시스템이 정상종료되기 직전 대기창 

대기중(); //버퍼에 안들어가고 입력들어오는 값을 바로 보는거



   //이벤트 진행 상황 출력 

   //    printf("               ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\t\n");

   //    printf("               ┃     ┃\n");

   //    printf("               ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\t\n");




printf("               ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\t\n");

printf("               ┃  게임 종료합니다.......,   \n");

printf("               ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\t\n");


대기중();




return 0; //시스템 정상종료 

}










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

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

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

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

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

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

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














































# elif //그밖의 만약 




#else //그밖에 더.... (마지막으로)




#endif //여기에서 조건부 컴파일의 종료