계속해서 수업중인 아이탬구매 및 인벤토리 구현에 이어서 이번과제는 인벤토리에 판매기능 넣기.
Item.h
#pragma once
class Item
{
private: //자식한테도 비공개
protected: //자식한테만 공개
public:
string name;
int price;
Item();
//추상화로 생성했다면 가상함수로 소멸
virtual ~Item();
//생성자 오버로딩
Item(string _name);
Item(string _name, int _price);
Item(const Item& src);
//가상함수 : 자식클래스에서 재정의가 이루어질거라고 예상될 때
virtual void Print();
virtual Item* Create(const Item* src);
};
class Weapon : public Item //상속
{
public:
int att;
Weapon();
~Weapon();
Weapon(string _name, int _price, int _att);
Weapon(const Weapon& src);// 다운캐스팅 Weapon& 이라고 명시해둠
void Print() override; //재정의
Item* Create(const Item* src) override; //재정의
};
class Armor : public Item //상속
{
public:
Armor();
~Armor();
Armor(string _name, int _price, int _def);
Armor(const Armor& src);// 다운캐스팅 Armor& 이라고 명시해둠
int def;
void Print() override; //재정의
Item* Create(const Item* src) override; //재정의
};
Item.cpp
#include "stdafx.h"
Item::Item()
{
//cout << "아이템 생성" << endl;
}
Item::~Item()
{
//cout << "아이템 소멸" << endl;
}
Item::Item(string _name)
: name(_name)
{
}
Item::Item(string _name, int _price)
: name(_name), price(_price)
{
}
Item::Item(const Item& src)
{
name = src.name;
price = src.price;
}
void Item::Print()
{
cout << "아이템 : " << name << "\t"
<< "가격 : " << price << endl;
}
Item* Item::Create(const Item* src)
{
return new Item(*src);
}
Weapon::Weapon()
{
//cout << "무기 생성" << endl;
}
Weapon::~Weapon()
{
//cout << "무기 소멸" << endl;
}
Weapon::Weapon(string _name, int _price, int _att)
: att(_att), Item(_name, _price)
{
}
Weapon::Weapon(const Weapon& src)
: Item(src), att(src.att)
{
}
void Weapon::Print()
{
cout << "아이템 : " << name << "\t"
<< "가격 : " << price << "\t"
<< "공격력 : " << att << endl;
}
Item* Weapon::Create(const Item* src)
{
return new Weapon(*(Weapon*)src);
}
Armor::~Armor()
{
//cout << "방어구 소멸" << endl;
}
Armor::Armor(string _name, int _price, int _def)
: def(_def), Item(_name, _price)
{
}
Armor::Armor(const Armor& src)
: Item(src), def(src.def)
{
}
void Armor::Print()
{
cout << "아이템 : " << name << "\t"
<< "가격 : " << price << "\t"
<< "방어력 : " << def << endl;
}
Item* Armor::Create(const Item* src)
{
return new Armor(*(Armor*)src);
}
Shop.h
#pragma once
class Shop
{
public:
Item* items[6]; //추상화
//추상화 <-> 구체화
vector<Item*> inven; // 벡터로 만든다.
//아이템이 구매될때마다 인벤에 하나씩추가되도록.
//한국 게임은 인벤토리가 정해져있고 별도의 과금으로
//인벤토리를 확장하는 방식이기때문에
//일반 배열로 만들어도 된다!
public:
void GoShop();
};
Shop.cpp
#include "stdafx.h"
void Shop::GoShop()
{
//Weapon a; a는 지역변수 생성은 선언되었을때 된다.(런타임)
//함수는 코드 영역에 저장된다. 코드영역은 read only 컴파일타임에 미리올라가있다.
items[0] = new Item("도토리", 100);
items[1] = new Item("돌맹이", 200);
items[2] = new Weapon("나뭇가지", 100, 10);
items[3] = new Weapon("나무몽둥이", 200, 30);
items[4] = new Armor("냄비뚜껑", 100, 10);
items[5] = new Armor("롱패딩", 300, 30);
int money = 100000;
int shopmainselect;
while (true)
{
system("cls");
cout << "[1].상점 [2].인벤토리 [그외].나가기"<< "\t" << "현재소지금 : " << money << " $ " << endl;
cin >> shopmainselect;
if (shopmainselect == 1)
{
//system("cls");
cout << endl;
cout << "[아이템목록]" << endl;
cout << endl;
for (int i = 0; i < 6; i++)
{
cout << "[" << i << "]";
items[i]->Print();
}
int choice;
cout << endl;
cout << "구매할 아이템을 선택해주세요(안사고나가기:99) : ";
cin >> choice;
if (choice == 99)
{
continue;
}
else
{
inven.push_back(items[choice]->Create(items[choice]));
money -= items[choice]->price;
cout << endl;
cout << "[ " << items[choice]->name << " ]"<<" 을 획득했다!";
cout << endl;
cout << endl;
cout << "구매완료 " << items[choice]->price << " $ 사용" << endl;
Sleep(1500);
}
}
if (shopmainselect == 2)
{
//system("cls");
cout << endl;
cout << "[인벤토리]" << endl;
cout << endl;
int invencount = 0;
/*for (int i = 0; i < inven.size(); i++)
{
cout << "[" << i << "]";
inven[i]->Print();
}*/
for (vector<Item*>::iterator i = inven.begin(); i != inven.end(); i++)
{
cout << "[" << invencount++ << "]";(*i)->Print();
}
int invenchoice;
cout << endl;
cout << "[1].판매하기 [2].나가기"; cin >> invenchoice;
if (invenchoice == 1)
{
int sellchoice;
cout << endl;
cout << "판매할 아이템의 번호를 입력해 주세요 : "; cin >> sellchoice;
if (sellchoice > inven.size())
{
cout << "잘못 입력하셨습니다. 다시 입력해 주세요." << endl;
Sleep(1500);
continue;
}
else
{
money += inven[sellchoice]->price;
cout << endl;
cout << "[ " << inven[sellchoice]->name << " ]" << " 이 사라졌다!";
cout << endl;
cout << endl;
cout << "판매완료 " << inven[sellchoice]->price << " $ 획득" << endl;
inven.erase(inven.begin() + sellchoice);
Sleep(1500);
}
}
else
{
continue;
}
}
else
{
continue;
}
}
for (int i = 0; i < 6; i++)
{
delete items[i]; // 동적할당 해제
}
for (int i = 0; i < inven.size(); i++)
{
delete inven[i]; // 동적할당 해제
}
}
'공부' 카테고리의 다른 글
C++ 샵&인벤토리 아이템 수량 추가 (0) | 2022.11.29 |
---|---|
C++ Lvalue & Rvalue (0) | 2022.11.29 |
C++ 복사생성자 & 팩토리패턴 (0) | 2022.11.28 |
C++ 상점.인벤토리(추상화,가상함수 사용하기) (0) | 2022.11.27 |
C++ 가상함수 & 재정의 (0) | 2022.11.24 |
댓글