c#中的随机事件系统.怎么做

本文关键字:事件系统 随机 | 更新日期: 2023-09-27 18:16:23

我只是一个编程世界的初学者,因此我有一个简单的问题。是否有可能随机执行函数?如果有,你会怎么做?这只是基于我在另一个论坛上读到的一个帖子的好奇心。基本上,讨论是关于如何为游戏生成随机事件,他们评论了某些语言(特别是AS3)中使用的"hack"。这个窍门就是把函数当作变量来对待。例子:

//Make an array of the functions
public function makeEarthquake():void{}
public function causePlague():void{}
public function spaceZombieAttack():void{}
//select at random
var selection:uint = Math.random() * eventArrray.length;
//Call it
eventArray[selection]();

我希望这是清楚的。我会很高兴与任何答案,可以解释如何随机调用方法。谢谢你。

编辑:谢谢你们,所有的答案都很有帮助!

c#中的随机事件系统.怎么做

这当然有可能。一个直接的方法是拥有一个委托列表或数组:

在c#中看起来是这样的:(在一个基本的控制台应用程序中)

class Program
{
    // Create the functions:
    static void Beep()
    {
        Console.Beep();
    }
    static void SayHello()
    {
        Console.WriteLine("Hello!");
    }
    // Create the function delegate:
    private delegate void RandomFunction();
    static void Main(string[] args)
    {
        // Create a list of these delegates:
        List<RandomFunction> functions = new List<RandomFunction>();
        // Add the functions to the list:
        functions.Add(Beep);
        functions.Add(SayHello);
        // Make our randomizer:
        Random rand = new Random();
        // Call one:
        functions[rand.Next(0, 2)](); // Random number either 0 or 1
        // This is just here to stop the program
        // from closing straight away should it say "Hello"
        Console.ReadKey();
    }
}

让这些函数具有不同数量的参数需要更多的努力,但是

您可以有一个List<Action>并从中随机选择。

class Program
{
    static void Main(string[] args)
    {
        List<Action> actions = new List<Action>();
        actions.Add(() => Program.MakeEarthquake());
        actions.Add(() => Program.CausePlague());
        actions.Add(() => Program.SpaceZombieAttack());
        Random random = new Random();
        int selectedAction = random.Next(0, actions.Count());
        actions[selectedAction].Invoke();
    }
    static void MakeEarthquake()
    {
        Console.WriteLine("Earthquake");
    }
    static void CausePlague()
    {
        Console.WriteLine("Plague");
    }
    static void SpaceZombieAttack()
    {
        Console.WriteLine("Zombie attack");
    }
}

你可以创建一个动作列表,然后在列表中随机选择一个项目,就像下面的代码

    List<Action> actions = new List<Action>();
    actions.Add(() => makeEarthquake());
    actions.Add(() => causePlague());
    actions.Add(() => spaceZombieAttack());
    var random=new Random();
    int rndNumber = random.Next(actions.Count);
    actions[rndNumber].Invoke();

你为什么不像往常一样随机选择一个数字,然后在一个公共函数中使用这个数字,这个函数反过来调用基于你得到的函数?

public void DoRandomThing()
{
    switch(new Random().Next(1,4))
    {
        case 1:
            makeEarthquake();
            break;
        case 2:
            causePlague();
            break;
        case 3:
            spaceZombieAttack();
            break;
    }
}