#include <stdio.h>
#include <iostream>
#include <windows.h>

#include "플레이어.h"


//게임프로그래밍 타입객체 패턴 보기. 즉 디자인 패턴.

//enum
typedef enum _E짐승의상태
{

 사자입 = 0,
 곰발 = 1,
 표범몸뚱이 = 2


} E짐승의상태;

// 아이템 종류
//typedef enum _EItem {
// ITEM_EMPTY = 0,
// ITEM_WEAPON = 1, ITEM_ARMOR = 2,
// ITEM_ACCESSORY1 = 4, ITEM_ACCESSORY2 = 8
//} EItem;


//구조체 (struct)
//사용자 정의 자료형
//구조체는 어디서든 접근이 가능하다.

typedef struct _첫번째짐승
{

 //char* 이름; //이름
 int 체력;
 int 마력;
 int 경험치;

 unsigned int 사탄의속성;
 //왜 빨간줄 뜨지


 //public:
 //void 데미지체력(첫번째짐승* _캐릭터, int _데미지)
 //{

 //_캐릭터->


 //}


} 첫번째짐승;


typedef struct _구조체플레이어
{
 //구조체의 기본 접근자는 public
 char 돈;
 int 체력;
 int 마력;

 int 경험치;


public:

 //C++에서는 구조체에도 접근 제한을 지정하거나
 //함수선언 및 정의가 가능
 void 치료()
 {

  체력 += 10;

 }

 void 섹스()
 {

  체력 += 1000;

 }


 void 자위()
 {

  체력 += 666;

 }

 void 잠자기()
 {

  체력 += 5000;

 }


 


}구조체플레이어;


void 업데이트마력(구조체플레이어* _캐릭터, int _주어진마력)
{


 std::cout << "이야압 마력 받아라! 플레이어!"
  << std::endl;
 _캐릭터->마력 += _주어진마력;


}


//구조체 외부에 함수 정의
//구조체에 접근하기위해서 객체를 전달받아야함
void 데미지체력(첫번째짐승* _캐릭터, int _데미지)
{

 std::cout << "이야압 데미지 받아라! 짐승!"
  << std::endl;

 _캐릭터->체력 -= _데미지;


}



void 왕겜성(플레이어& _플레이어, 플레이어& _플레이어2);





void 왕겜성(플레이어& _플레이어, 플레이어& _플레이어2)
{

 _플레이어.치료();

 _플레이어2.치료();

 _플레이어.치료();

 _플레이어2.치료();
 _플레이어.치료();

 _플레이어2.치료();

 _플레이어.데미지();

 _플레이어2.데미지();
 _플레이어.데미지();

 _플레이어2.데미지();
 _플레이어.데미지();

 _플레이어2.데미지();
 _플레이어.데미지();

 _플레이어2.데미지();
 _플레이어.데미지();

 _플레이어2.데미지();
 _플레이어.데미지();

 _플레이어2.데미지();


 std::cout << "플레이어의 체력은 ... : "
  << _플레이어.얻기체력() << std::endl;

 //_플레이어.

 


}


//구조체에는 데이터를 담아두고
//이를 관리하는 기능(함수)들을 별도로 작성
void 구타(구조체플레이어* _플레이어)
{

 _플레이어->체력 -= 10;

}




int main(void)
{//오늘은 Class라는걸 배울건데.
 // c++의 시작이자 끝... 이걸 어떻게 잘쓰냐가 관건.
 // c++는 문법 자체는 c하고 비슷하기때문에 문법은 안어려워요. 씨뿔뿔의 철학이나 그런것들을 잘이해하고 쓰는거... 그게 힘들거든요. 잘 묵상하고 생각을 하시면서 쓰세요.
 //관점이나 철학에 관련된 부분들은 사람마다 다른게 있기때문에 따라친다고해서 만들어지는게아니니까 생각을 잘하셔야되요.


 //면접에서 스캇 마이어스 의 이펙티브 책 물어보므로 반드시 볼 것. c++를 잘쓰기위한 왠만한게 다 들어가있다. 한번 봐선 이해안된다.
 //빨리 보시면 빨리 보시는만큼 요런게 있구나를 알수있어서 괜찮습니다.
 //다른 책들은 안보더라도 요거는 무조건 보시길 추천드립니다. 번역본이 시중에 다 나와있음.


 //객체 == 오브젝트

 //구조체 객체 생성
 //구조체 생성 및 초기화
 //c++에서는 typedef를 하지않아도
 //구조체명으로 객체를 생성 가능
 첫번째짐승 몬스터에너지쳐먹은니니키 = {

  2333,
  2333,
  2333,
  사자입|곰발|표범몸뚱이


 };


 구조체플레이어 옷치킨이성계 = {

  100,100,100,100

 };

 옷치킨이성계.체력 = 1392;

 구타(&옷치킨이성계);

 업데이트마력(&옷치킨이성계, 666);

 printf("옷치킨이성계 체력 : %d\n", 옷치킨이성계.체력);


 printf("니니키 체력 : %d\n", 몬스터에너지쳐먹은니니키.체력);


 //데미지 쳐먹이는 함수 호출
 데미지체력(

  &몬스터에너지쳐먹은니니키, //데미지 쳐먹일 대상

  666 //주는 데미지

 );

 printf("니니키 체력 : %d\n", 몬스터에너지쳐먹은니니키.체력);


 std::cout << "==========================" << std::endl;
 std::cout << "==========================" << std::endl;
 std::cout << "==========================" << std::endl;
 std::cout << "==========================" << std::endl;
 std::cout << "==========================" << std::endl;
 std::cout << "==========================" << std::endl;


 //클래스 객체  Class Object
 // ->인스턴스(Instance) 즉 클래스 객체를 '인스턴스'라고도 부른다.

 플레이어 플레이어1;

 //플레이어1.데미지();

 //플레이어1.

 //플레이어1. //멤버접근연산자Memver Access Operator
  // . <= 이게 멤버접근연산자
 //클래스의 멤버 접근 연산자도 c하고 똑같긴 하지만
 //하면 볼수있는 애들만 보인다.
 //훨씬 더 안전하게 데이타를 보호하고 관리할수가 있습니다.


 플레이어 엔피씨;

 왕겜성(플레이어1, 엔피씨);


 //system("pause");

 return 0;
}