我有一个简单的代码来生成游戏中的角色。
string[] sex = new string[] { "Man", "Woman" };
string[] age = new string[] { "Child", "Teen", "Young", "Middle-aged", "Elderly", "Old" };
string[] beauty = new string[] { "Beautiful", "Pretty", "Normal", "Plain", "Ugly" };
Random i = new Random();
string sexR = sex[i.Next(0, sex.Length)];
string ageR = age[i.Next(0, age.Length)];
string beautyR = beauty[i.Next(0, beauty.Length)];
Console.WriteLine("{0} {1} {2}", sexR, ageR, beautyR);
虽然我只有三行但是没关系。但我希望将来有更多的性格特征。如何创建一个函数,从我在程序中创建的任意数组生成随机值?
答案 0 :(得分:1)
您可以创建数组列表并循环遍历这些数组,分别存储每个属性并使用stringbuilder输出结果。
List<string[]> traits = new List<string[]>
{
new string[] { "Man", "Woman" },
new string[] { "Child", "Teen", "Young", "Middle-aged", "Elderly", "Old" },
new string[] { "Beautiful", "Pretty", "Normal", "Plain", "Ugly" }
};
Random i = new Random();
StringBuilder traitOutput = new StringBuilder();
foreach (string[] trait in traits)
{
traitOutput.AppendFormat("{0} ", trait[i.Next(0, trait.Length)]);
}
Console.WriteLine(traitOutput);
答案 1 :(得分:1)
如果您希望能够获得任意数量的列表的值,而不是只有一个列表的值,那么编写一个接受列表集合的方法,并选择每个列表中的随机项:
public static IEnumerable<T> ChooseFromAll<T>(
IEnumerable<IList<T>> lists,
Random generator)
{
foreach (var list in lists)
yield return list[generator.Next(list.Count)];
}
答案 2 :(得分:1)
我认为我们可以先为您的用例讨论更清晰的代码。你显然正在创造某种人,所以让我们用一个人类来代表。 我们有一个非常复杂的创建场景,我们可以将它放在构造函数中,但我认为最好的办法是为此创建一个工厂类。
鉴于此,我们可以使用像GetRandomElement
这样的技巧来简化语法。但是,我认为我们不需要进一步概括。我并不热衷于通过属性或类似的东西进行预测,我认为保持可能值的数组不同是更具声明性。
public class Person{
public string Sex { get;set;}
public string Age {get;set;}
public string Beauty { get;set;}
}
public class RandomPersonFactory{
private Random random;
private string[] SexChoices = new[] { "Man", "Woman" };
private string[] AgeChoices = new[] { "Child", "Teen", "Young", "Middle-aged", "Elderly", "Old" };
private string[] BeautyChoices = new[] { "Beautiful", "Pretty", "Normal", "Plain", "Ugly" };
public RandomPersonFactory(Random random){
this.random = random;
}
public Person CreatePerson(){
return new Person {
Sex = GetRandomElement(this.SexChoices),
Age = GetRandomElement(this.AgeChoices),
Beauty = GetRandomElement(this.BeautyChoices)
};
}
private T GetRandomElement<T>(T[] array){
return array[this.random.Next(array.Length)];
}
}
你可以这样组织你的代码;但是,如果你没有在运行时真正改变个人的特征数量和类型,那就是不必要的复杂性和误导。问问自己,你是否可以让一个人没有性别特征或年龄特征等。在这种情况下,我会以类似的方式写工厂,但我会在{{1}中一次建立一个特征的集合。方法,然后创建具有该集合的人。
CreatePerson