有没有更好的方法来生成随机对象?

时间:2018-12-30 15:07:42

标签: c#

我正在尝试创建一个函数,以从对象的子集生成随机对象,并从其中包含值的子集的值。

当前我正在使用switch / case,它可以工作,我只是好奇是否有更好的方法。

包含主要功能的类:

public class Loot : MonoBehaviour, IPointerClickHandler {
    enum BaseType {Sword, Dagger};
    enum BaseQuality {Weak, Normal, Strong}

    public void OnPointerClick(PointerEventData eventData) {
        Array baseTypes = Enum.GetValues(typeof(BaseType));
        Array baseQualities = Enum.GetValues(typeof(BaseQuality));

        System.Random random = new System.Random();

        String baseType = baseTypes.GetValue(random.Next(baseTypes.Length)).ToString();
        String baseQuality = baseQualities.GetValue(random.Next(baseQualities.Length)).ToString();

        int damage = 0;
        switch(baseQuality) {
            case "Weak":
                damage = -1;
                break;
            case "Strong":
                damage = 1;
                break;
        }

        Weapon weapon = new Weapon();
        switch(baseType) {
            case "Sword":
                weapon = new Sword();
                break;
            case "Dagger":
                weapon = new Dagger();
                break;
        }

        weapon.Name = baseQuality + " " + baseType;
        weapon.Attack += damage;

        Debug.Log("created " + weapon.Name + " with attack " + weapon.Attack);
    }
}

武器课:

public class Weapon : Item {
    public int Attack { get; set; }
}

剑类(匕首类基本相同):

public class Sword : Weapon {
    public Sword() {
        Attack += 3;
    }
}

这是按原样进行的,但是我很好奇,当我实现更多武器类型和质量时,是否有一种更动态的方式来做到这一点。

2 个答案:

答案 0 :(得分:0)

我将使Random变量成为全局变量。但是我认为它不会变得更加动态。 所以是的,只需将System.Random random = new System.Random();放在方法上方,就可以了。 (您每次输入该方法都会生成一个新的随机对象,但是如果只生成一次,那应该没问题) 希望我能帮忙,祝您有愉快的一天。

答案 1 :(得分:0)

如果您的构造函数没有参数,则可以使用反射,这种方法的代码会更短

 Type[] weaponTypes= new Type[] { typeof(Sword), typeof(Dagger) };
 Weapon weaponInstance = (Weapon)Activator.CreateInstance(types[baseType]);