遍历字典<int、int[]>并获得意外结果



我一直在使用c#和Visual Studio创建一个应用程序来帮助我的Game Mastering。在应用程序的这一部分工作,我有麻烦得到我期望的答案。

我尝试了几种不同的方法来给出"权重"。包括(当前的)Dictionary<int, int[]>,锯齿数组,多个数组,我发现字典将是最简单的。

我期待,当我点击一个按钮,它运行以下代码产生一个结果,但我得到任何地方从3-5个结果。

challenge1_click是按钮点击事件:

private void challenge1_Click(object sender, EventArgs e)
{
Dictionary<int, int[]> weights = new Dictionary<int, int[]>() {
{ 30, new int[]{5,0,0,0,0}},
{ 60, new int[]{0,4,0,0,0}},
{ 70, new int[]{0,0,3,0,0}},
{ 95, new int[]{0,0,0,3,0}},
{ 100,new int[]{0,0,0,0,1}}
};
Random one = new Random();
Random two = new Random();
int d100 = RollDice(100, one);
int[] results = IndividualTreasure(weights, d100);
TreasureResults(results);
}
private int[] IndividualTreasure(Dictionary<int, int[]> weights, int d100)
{
int cp = 0, sp = 0, gp = 0, ep = 0, pp = 0;
Random num = new Random();
foreach (KeyValuePair<int, int[]> entry in weights)
{
if (d100 <= entry.Key)
{
for (int i = 0; i < entry.Value.Length; i++)
{
if (entry.Value[i] > 0)
{
switch (i)
{
case 0:
for (int j = 0; j < entry.Value[i]; j++)
{
int randNum = RollDice(6, num);
cp += randNum;
}
break;
case 1:
for (int j = 0; j < entry.Value[i]; j++)
{
int randNum = RollDice(6, num);
sp += randNum;
}
break;
case 2:
for (int j = 0; j < entry.Value[i]; j++)
{
int randNum = RollDice(6, num);
gp += randNum;
}
break;
case 3:
for (int j = 0; j < entry.Value[i]; j++)
{
int randNum = RollDice(6, num);
ep += randNum;
}
break;
case 4:
for (int j = 0; j < entry.Value[i]; j++)
{
int randNum = RollDice(6, num);
pp += randNum;
}
break;
}
}
}
}
}
int[] result = new int[5] { cp, sp, gp, ep, pp };
return result;
}
private void TreasureResults(int[] results)
{
int cp = results[0];
int sp = results[1];
int gp = results[2];
int ep = results[3];
int pp = results[4];
lbl_cp_amount.Text = cp.ToString();
lbl_sp_amount.Text = sp.ToString();
lbl_gp_amount.Text = gp.ToString();
lbl_ep_amount.Text = ep.ToString();
lbl_pp_amount.Text = pp.ToString();
}

按钮click被链接到一个表单按钮,所以它只被调用一次。我得到的结果应该是:

如果d100 <=字典键,循环遍历值并找到大于0的任何值,并随机进行多次滚动。

当我按下按钮时,代码的行为就好像它正在运行所有的键,并返回多个结果。

在检查d100是否小于或等于条目时。键,我没有检查它是否比前一个键大。因此,如果它小于第一个键,那么它也小于其余键所以我必须添加以下内容:

int previousKey = 0;
foreach (KeyValuePair<int, int[]> entry in weights)
{
int knownKey = entry.Key;
if (d100 <= knownKey && d100 > previousKey)
{
previousKey = entry.Key;

我向那些读到这篇文章并感到非常困惑的人道歉。