You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:53:17