我为我正在制作的爱好游戏创建了一个简单的LootTable类,它的工作原理非常好。但是,我很清楚代码中存在的缺陷。当我说缺陷时,我的意思是:实现的一个区域可以改进/简化,以减轻处理/计算成本。我将尝试尽可能地解释这一点,在此之前,这里是我的LootTable类的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using DreamforceFramework.Framework.Game.Logic.Structs;
using DreamforceFramework.Framework.Probability;
namespace DreamforceFramework.Framework.Game.Probability
{
public class LootTable
{
public string Name;
private readonly List<string> _lootTable;
private readonly Dictionary<string, int> _cachedLoot;
private bool _isRebuildRequired;
public LootTable()
{
_cachedLoot = new Dictionary<string, int>();
_lootTable = new List<string>();
}
public LootTable(string name)
{
this.Name = name;
_cachedLoot = new Dictionary<string, int>();
_lootTable = new List<string>();
}
public void Add(string name, int probability)
{
this._cachedLoot.Add(name, probability);
_isRebuildRequired = true;
}
public bool Contains(string name)
{
return _cachedLoot.ContainsKey(name);
}
public void Add(LootTableItem item)
{
this._cachedLoot.Add(item.Name, item.Rarity);
_isRebuildRequired = true;
}
public void Add(List<LootTableItem> items)
{
foreach (LootTableItem lootTableItem in items)
{
this._cachedLoot.Add(lootTableItem.Name, lootTableItem.Rarity);
}
_isRebuildRequired = true;
}
public void Remove(string name)
{
this._cachedLoot.Remove(name);
_isRebuildRequired = true;
}
public double ComputeProbability(string name)
{
double total = _cachedLoot.Values.Sum(n => n);
double percent = _cachedLoot[name] / total;
return Math.Round(percent * 100, 2);
}
public void Edit(string name, int newProbability)
{
this._cachedLoot[name] = newProbability;
_isRebuildRequired = true;
}
public void Clear()
{
this._cachedLoot.Clear();
this._isRebuildRequired = true;
}
private void Rebuild()
{
_lootTable.Clear();
foreach (KeyValuePair<string, int> pair in _cachedLoot)
{
for (int i = 0; i < pair.Value; i++)
{
_lootTable.Add(pair.Key);
}
}
_isRebuildRequired = false;
}
public string Next()
{
if (_isRebuildRequired)
{
this.Rebuild();
}
return _lootTable[DreamforceRandom.NextInteger(_lootTable.Count)];
}
public List<string> Next(int quantity)
{
List<string> returnList = new List<string>();
if (_isRebuildRequired)
{
this.Rebuild();
}
for (int i = 0; i < quantity; i++)
{
returnList.Add(_lootTable[DreamforceRandom.NextInteger(_lootTable.Count)]);
}
return returnList;
}
}
}
还有LootTableItem结构:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DreamforceFramework.Framework.Game.Logic.Structs
{
public struct LootTableItem
{
public string Name;
public int Rarity;
public LootTableItem(string name, int rarity)
{
this.Name = name;
this.Rarity = rarity;
}
}
}
对于那些浏览上述代码的人,您会看到我所谈论的效率低下的区域。为了生成内部战利品表,我创建了一个字符串列表,它等于项目的稀有性。所以说我把“生锈的剑”放入战利品表中,稀罕度为20.这意味着当重建战利品表时,它会在表中添加20个“生锈之剑”字符串。没什么大不了的?但现在让我们说我要添加两个对象。我在战利品表中添加值为100的“Ruby”和值为100的“Emerald”。好吧,这意味着我将在战利品表中创建200个字符串,当它可以简化为添加1个Ruby字符串和1个Emerald字符串时,这非常愚蠢。这将达到相同的概率,即50/50。
所以我的问题是:如何简化项目添加到LootTable的概率,以便自动优化数据,而不是创建一个巨大的字符串列表。
我希望我能够清楚地解释这一点,当涉及到书面表达时,我有时候很缺乏。
编辑:
以下是所选答案提出的有效解决方案: http://pastebin.com/4w0B0V6y