본문 바로가기
공부

C++ 인벤토리 판매기능 추가

by MY블로그 2022. 11. 28.

계속해서 수업중인 아이탬구매 및 인벤토리 구현에 이어서 이번과제는 인벤토리에 판매기능 넣기.

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]; // 동적할당 해제
	}
}

댓글