首页 > 解决方案 > 选择两个随机整数分配值的最佳方法

问题描述

我正在创建一个龙与地下城角色创造者。有一个随机化功能将创建一个完整的字符表。我已经完成了一部分,但我不太确定最好的方法。

我设置种族修饰符的方式是使用 if 语句。这是一个例子。

if (raceInt == 0 || raceInt == 2 || raceInt == 10)
{
    raceStrMod = 2;
}

if (raceInt == 3 || raceInt == 4 || raceInt == 5 || raceInt == 11 || raceInt == 12)
{
    raceDexMod = 2;
}

但是,有些种族具有修饰符,可让您选择两个统计数据来添加修饰符,例如力量或敏捷。为这些比赛选择两个随机整数的最佳方法是什么?

例如,半精灵种族将获得 +2 敏捷,然后 +1 其他两个随机统计数据。所以我需要找到一种方法来随机选择剩余的两个整数以使值 = 1。

我的比赛模组初始化为

int raceStrMod = 0;
int raceDexMod = 0;
int raceConMod = 0;
int raceIntMod = 0;
int raceWisMod = 0;
int raceChaMod = 0;

然后 if 语句根据随机选择的种族分配一个值。

谢谢大家的投入!这就是我最终编码的方式

        if (raceInt == 9)
        {
            int randomX = rnd.Next(1, 5);
            int randomY = rnd.Next(1, 5);

            int attempts = 0;
            while (randomX == randomY && attempts < 10)
            {
                randomY = rnd.Next(1, 5);
                attempts++;
            }

            //if they are still not unique after 10 attempts
            if (randomX == randomY)
            {
                if (randomX == 5)
                    randomY = 1;
                else
                    randomY = randomX + 1;
            }

            int[] randomNumbers = { randomX, randomY };

            foreach (int i in randomNumbers)
            {
                switch (i)
                {
                    case 1:
                        raceStrMod = 1;
                        break;
                    case 2:
                        raceDexMod = 1;
                        break;
                    case 3:
                        raceConMod = 1;
                        break;
                    case 4:
                        raceIntMod = 1;
                        break;
                    case 5:
                        raceWisMod = 1;
                        break;
                }
            }
        }

标签: c#

解决方案


你的班级有没有向你介绍过enum类型?如果没有,您的期末项目在使用课堂上未教授的语言功能方面是否有任何限制?

你的问题可以说太宽泛了,因为即使在现实世界的代码中也有很多不同的方法来解决这类问题,而且课堂环境引入了潜在的障碍,虽然可能会限制问题,但由于不为人知,因此无法知道答案实际上会为你工作。

那就是说……

忽略课堂方面,只关注问题本身,我会使用enum类型和字典来处理这类事情。例如:

enum Attribute
{
    Strength,
    Dexterity,
    Constitution,
    Charisma,
    Intelligence,
    Wisdom,
    Count, // must always be last
}

Dictionary<Attribute, int> modifiers = new Dictionary<Attribute, int>();

然后你可以选择一个随机属性,比如(假设你有一个random引用一个Random对象的变量……不要犯经典的新手错误,Random每次你想选择一个新的随机数时都创建一个新对象):

Attribute attributeToModify = (Attribute)random.Next((int)Attribute.Count);

您可以像这样存储该选择:

modifiers[attributeToModify] = 1;

这可用于存储您喜欢的许多修饰符。您可以将其封装在代表角色本身的对象中,也可以将其放入单独的AttributeModifiers类中。执行后者的一个优点是,如果您有来自不同来源的修饰符,您可以在角色对象中将其作为AttributeModifier实例列表进行跟踪,每个实例依次跟踪这些修饰符的实际来源。

这只是触及表面而已。正如我所指出的,这个问题本身相当广泛。但我强烈建议使用可用的语言特性来确保您的变量以特定于类型的方式表示事物,而不是仅仅使用int不是真正整数的事物的值,并使用更正确地表示语义的集合类您的代码打算这样做。

请注意,这也意味着您可能应该有enum比赛的类型。例如:

enum Race
{
    Dwarf,
    Elf,
    HalfElf,
    Halfling,
    HalfOrc,
    Human,
    // etc.
}

您的语句链if可能更好地表示为switch

Attribute racialMod;

switch (race)
{
    case Human:
    case Halfling:
    // etc.
        racialMod = Attribute.Strength;
        break;
    case Elf:
    case HalfElf:
    // etc.
        racialMod = Attribute.Dexterity;
        break;
}

modifiers[racialMod] = 2;

类似的东西。关键是要确保代码读起来更像原始规范所说的(如果你真的写过的话)。这将使代码更容易理解,并且您在代码中添加错误的可能性会更小(例如,您不小心输入了错误的魔法,未命名的整数)。


推荐阅读