我觉得你的问题太笼统了。但无论如何我都会提供一个建议。
据推测,作为 RPG,您可以找到许多项目。有些是武器,有些是盔甲,有些有其他价值,有些只是没用。如果我正在接近这个,我可能会选择有一个类来代表它们并调用它Item
。我什至可以从中派生出类型:Weapon
, Armour
, Trinket
, ...
我也会以某种方式在程序中注册我所有的武器。假设我有一个简单的构造函数......
Weapon::Weapon( const char *name, int cost, int minlevel, int damage, int speed );
现在,这个武器注册表/存储库将是我认为合理的任何类型的容器。它可能只是一个 C 风格的数组 a vector
,或者它可能是 amap
或允许名称查找的东西。它甚至可能是你自己创建的一个可以做其他好事的类。所以让我们这样做(在内部你可能只使用 a vector
)。
启动时,您需要注册所有项目。假设您在注册表中为不同的项目类型保留了单独的列表。所以你可能有一个Add
武器功能和另一个盔甲功能......
void Repository::Add( Weapon &weapon )
{
weapons.push_back(weapon);
}
你的初始化可能是这样的。
Repository repository; // A global somewhere, maybe...
repository.Add( Weapon( "Plastic Spork", 1, 1, 1, 10 ) );
repository.Add( Weapon( "M. C. Hammer", 5, 5, 5, 15 ) );
repository.Add( Weapon( "Stroustrup", 1000, 100, 0x7fffffff, 1 ) );
// etc...
现在,您的存储库中拥有所有可用的武器(和其他物品)。选择一堆随机武器现在很容易。
Weapon Repository::RollWeapon( int minlevel )
{
//...
}
也就是说,如果我正确理解了您的问题。也许您想要生成具有随机统计数据的武器。有很多方法可以做到这一点,但您可能需要考虑在Weapon
(或确实Item
)上有一个函数来随机化/扰乱已注册项目的统计信息。
virtual void Item::RandomizeStats();
此功能的武器版本可能只是采用默认damage
值并将其更改 +/- 20%。在这种情况下,它可能就像这样简单:
virtual void Weapon::RandomizeStats()
{
int amount = damage / 5;
damage += (rand() % (amount * 2 + 1)) - amount;
}
您甚至可以将其构建到您的存储库中:
Weapon Repository::RollRandomizedWeapon( int minlevel )
{
Weapon w = RollWeapon( minlevel );
w.RandomizeStats();
return w;
}
无论如何,希望此答案中的某些内容对您有用。我个人有一点猜想...