For循环不工作-函数只被调用一次

本文关键字:调用 一次 循环 工作 函数 For | 更新日期: 2023-09-27 18:13:12

我的for循环有一些问题。我试着把它放在不同的地方,但仍然没有运气。我正在做一个项目,随机改变一个矩形的不透明度(我有红色、黄色、蓝色和绿色)。我让项目工作,所以它选择一种颜色,提高不透明度,等待,然后降低不透明度。然而,我想重复这一点,循环不会。

下面是我的代码:
private int RandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }
        public void Start_Tapped_1(object sender, TappedRoutedEventArgs e)
        {
            loopthegame(5);
        }
        public void loopthegame(int amount) 
        {
            for (int i = 0; i < amount; i++) {
                startgame();
            }
        }
        public async void startgame()
        {
                int randomcolor = RandomNumber(1, 8);
                switch (randomcolor)
                {
                    case 1:
                        Blue.Opacity = 1;
                        break;
                    case 2:
                        Red.Opacity = 1;
                        break;
                    case 3:
                        Yellow.Opacity = 1;
                        break;
                    case 4:
                        Green.Opacity = 1;
                        break;
                    case 5:
                        Blue.Opacity = 1;
                        break;
                    case 6:
                        Red.Opacity = 1;
                        break;
                    case 7:
                        Yellow.Opacity = 1;
                        break;
                    case 8:
                        Green.Opacity = 1;
                        break;
                }
                await Task.Delay(1000);
                Blue.Opacity = 0.25;
                Red.Opacity = 0.25;
                Yellow.Opacity = 0.25;
                Green.Opacity = 0.25;
        }

For循环不工作-函数只被调用一次

似乎你的异步应该稍微更新:

public void loopthegame(int amount) 
{
    for (int i = 0; i < amount; i++) {
        Task<int> t = startgame();
        await t;
    }
}
//...
public async Task<int> startgame()
{
     int randomcolor = RandomNumber(1, 8);
     switch (randomcolor)
     {
          case 1:
              Blue.Opacity = 1;
              break;
          //...
          case 8:
              Green.Opacity = 1;
              break;
      }
      await Task.Delay(1000);
      Blue.Opacity = 0.25;
      Red.Opacity = 0.25;
      Yellow.Opacity = 0.25;
      Green.Opacity = 0.25;
      return randomcolor;
}

那么你需要做你的async权利(一个小修改):

    public async void loopthegame(int amount)
    {
        for (int i = 0; i < amount; i++)
        {
            // this 
            await startgame();
        }
    }

:

    public async Task startgame()
    {
       //...
    }

您的问题实际上是在您的随机数生成器。当您创建一个没有种子的随机数生成器(new random())时,它使用时间作为种子。它运行得足够快,以至于你每次都使用相同的种子,所以RandomNumber每次都返回相同的数字。而不是每次都创建一个新的Random,你应该有一个你可以多次使用的Random。在构造函数/主方法中创建一个,并在RandomNumber方法中重复使用。

用这段代码很容易测试:

for (int i = 0; i < 5; i++)
{
    Random random = new Random();
    Console.WriteLine(random.Next(1, 8));
}

试一下,它将打印相同的值五次