あなたの質問は広すぎると思います。しかし、とにかく提案を提供します。
おそらくRPGなので、見つけることができるアイテムはたくさんあります。いくつかは武器であり、いくつかは鎧であり、いくつかは他の価値があり、そしていくつかは単に役に立たない。私がこれに近づいていた場合、私はそれらすべてを表すクラスを持ってそれを呼び出すことを選ぶかもしれませんItem
。私はこれから型を導き出すかもしれません:、、、Weapon
.. ..Armour
Trinket
また、どういうわけか、すべての武器をプログラムに登録します。単純なコンストラクターがあったとしましょう...
Weapon::Weapon( const char *name, int cost, int minlevel, int damage, int speed );
さて、この武器のレジストリ/リポジトリは、私が賢明だと感じたどんな種類のコンテナでもあります。これは、Cスタイルの配列、、、または名前の検索を可能vector
にするものである可能性があります。map
他の素晴らしいことをすることができるのは、あなたが自分で作成したクラスでさえあるかもしれません。それでは、それを実行しましょう(内部的には、を使用する場合があります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;
}
とにかく、この答えの何かがあなたに役立つことを願っています。私の側にはかなりの推測があります...