1. 介绍:
基于SpriteStone类实现的AttributeStone(或者叫ElementStone更贴切),
- 重写了str(返回含有灵石信息字符串)的方法,
- 增加了transAttr(转化灵石元素)的方法,
- 支持cout直接输入,
- 并且定义了枚举StoneAttr的“<<”重载运算符操作。
2. 目标:
- 下一步实现,StoneBag类,并将其作为修仙者类的内置参数
3. 源码:
AttributeStone.h
#pragma once
#include "SpriteStone.h"
enum class StoneAttr
{
METAL, // 金
WOOD, // 木
WATER, // 水
FIRE, // 火
EARTH // 土
};
class AttributeStone
: public SpriteStone
{
public:
AttributeStone(int count, StoneAttr attr = StoneAttr::METAL);
string str() const;
// actions //
AttributeStone transformAttr(StoneAttr attr, int num = 0);
protected:
StoneAttr m_attr;
};
ostream& operator<<(ostream& cout, StoneAttr attr);
AttributeStone.cpp
#include "AttributeStone.h"
AttributeStone::AttributeStone(int count, StoneAttr attr)
{
this->m_count = count;
this->m_level = SpriteStoneLevel::ATTRIBUTE_LEVEL;
this->m_attr = attr;
}
string AttributeStone::str() const
{
stringstream ret;
ret << "[";
switch (m_attr)
{
case StoneAttr::METAL:
ret << "金灵石";
break;
case StoneAttr::WOOD:
ret << "木灵石";
break;
case StoneAttr::WATER:
ret << "水灵石";
break;
case StoneAttr::FIRE:
ret << "火灵石";
break;
case StoneAttr::EARTH:
ret << "土灵石";
break;
default:
ret << "未知灵石";
break;
}
ret << "] " << m_count << " 枚";
return ret.str();
}
AttributeStone AttributeStone::transformAttr(StoneAttr attr, int num)
{
if (num == 0)
{
num = m_count;
m_count = 0;
cout << "元素灵石转化:"
<< num << " 枚 " << m_attr
<< " 成功转化为 "
<< num << " 枚 " << attr
<< endl;
return AttributeStone(num, attr);
}
else if (num > m_count)
{
cout << "元素灵石转化:"
<< "转化数量 大于 存在数量,"
<< "没有足够的灵石支持转化"
<< endl;
}
else
{
int transNum = m_count - num;
m_count -= num;
cout << "元素灵石转化:"
<< transNum << " 枚 " << m_attr
<< " 成功转化为 "
<< transNum << " 枚 " << attr
<< endl;
return AttributeStone(transNum, attr);
}
}
ostream& operator<<(ostream& cout, StoneAttr attr)
{
switch (attr)
{
case StoneAttr::METAL:
cout << "金灵石";
break;
case StoneAttr::WOOD:
cout << "木灵石";
break;
case StoneAttr::WATER:
cout << "水灵石";
break;
case StoneAttr::FIRE:
cout << "火灵石";
break;
case StoneAttr::EARTH:
cout << "土灵石";
break;
default:
cout << "未知灵石";
break;
}
// TODO: 在此处插入 return 语句
return cout;
}
main.cpp // 测试文件
#include "AttributeStone.h"
using namespace std;
void testAttrStone()
{
cout << "属性灵石测试:" << endl;
cout << string(48, '-') << endl;
AttributeStone mstone(10, StoneAttr::METAL);
AttributeStone wstone(10, StoneAttr::WOOD);
AttributeStone wastone(10, StoneAttr::WATER);
AttributeStone fstone(10, StoneAttr::FIRE);
AttributeStone estone(10, StoneAttr::EARTH);
cout << mstone << endl;
cout << wstone << endl;
cout << wastone << endl;
cout << fstone << endl;
cout << estone << endl;
cout << "------元素灵石转化:------" << endl;
mstone.transformAttr(StoneAttr::FIRE, 100);
cout << endl;
}
int main(void)
{
testAttrStone();
system("pause");
return 0;
}