C# WPF太空游戏行星名称生成器重复问题排查与解决
太空探索游戏开发中的重复行星名称Bug排查与解决
我用C#和WPF开发一款简单太空探索游戏,遇到一个顽固Bug:Star类构造器通过Random类随机生成若干带唯一名称的行星,即便从名称列表移除已用名称,ComboBox里还是会出现重复名称。
原始构造器代码
public Star(List<Planet> _planetlist) { int range = _planetlist.Count; int amountOfPlanets = random.Next(1, 6); List<String> usableNames = new List<String>(PlanetNames); for (int i = 0; i != amountOfPlanets; i++) { Planet planet = _planetlist[random.Next(0, range)]; planet.name = usableNames[random.Next(0, usableNames.Count)]; usableNames.Remove(planet.name); systemPlanets.Add(planet); } }
问题现象
- 受随机性影响,并非每次运行都会出现重复,但确实存在逻辑问题。
尝试过的无效修复方案
public Star(List<Planet> _planetlist) { int range = _planetlist.Count - 1; // range存储传入planetList参数中的行星数量 int totalPlanets = random.Next(1, 6); // 星系中的行星数量范围为1 -> 6 int planetPointer; // 暂未初始化,将存储0到传入行星列表长度的随机数,用于选择随机行星 int iteration = 0; while (iteration < totalPlanets) { planetPointer = random.Next(0, range); Planet planet = _planetlist[planetPointer]; // 从行星列表中选择随机行星并赋值给Planet变量 planet.Name = planet.PlanetNames[planetPointer]; // 为行星选择随机名称 systemplanets.Add(planet); for (int iterator = 0; iterator <= totalPlanets; iterator++) // 此循环用于检查当前行星名称是否与星系中其他行星重复 { if (planetlist.Count == 0) { break; } else if (systemplanets[iterator].Name == planet.Name) { planet.Name = planet.PlanetNames[random.Next(0, planet.PlanetNames.Count)]; iterator = 0; } } iteration++; } }
填充ComboBox的代码
private void buttonTravel_Click(object sender, RoutedEventArgs e) { String uniAgeString = LabelUniAge.Content.ToString(); ComboBoxStar.Items.Clear(); ComboBoxPlanet.Items.Clear(); if (ulong.TryParse(uniAgeString, out ulong convertedAge) == true) { universe.ageUniverse(convertedAge); } else { throw new Exception(); } LabelUniAge.Content = universe.universeage; Star star = new Star(planetList); foreach (Planet planet in star.SystemPlanets) { ComboBoxPlanet.Items.Add(planet.name); } }
编辑:已解决,但求原因解释
反复调试后发现:生成的名称原本都是唯一的,但添加到ComboBox时,有时会莫名变成已存在的名称。
我没有修复原有代码,而是重写了生成唯一行星名称的逻辑——创建一个存储唯一名称的列表供ComboBox使用,同时为行星的name属性赋值,问题解决。
重写后的代码
Planet类方法
public void generatePlanetNames(int _totalPlanets) { usedNames.Clear(); string generatedName; bool isUnique; for (int i = 0; i != _totalPlanets; i++) { isUnique = false; while (isUnique == false) { generatedName = planetNames[random.Next(1, planetNames.Count)]; if (usedNames.Contains(generatedName)) { break; } else { isUnique = true; name = generatedName; usedNames.Add(generatedName); } } } }
按钮点击事件代码
Star star = new Star(planetList); int totalSystemPlanets = random.Next(1, 7); HotParadise.generatePlanetNames(totalSystemPlanets); foreach (string planetName in HotParadise.usedNames) { ComboBoxPlanet.Items.Add(planetName); }
TLDR:不清楚为什么添加到ComboBox的值会随机变化,重写方法后问题解决,希望有人能解释原因。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

