2013-05-11 81 views
0

我有我的for循环的一些问题。我尝试将它放置在不同的区域,但仍然没有运气。我正在研究一个项目,该项目随机更改矩形的不透明度(我有红色,黄色,蓝色和绿色)。我得到了该项目的工作,以便它选择一种颜色,提高不透明度,等待,然后降低不透明度。不过,我想重复一遍,循环不会。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; 
     } 
+0

哪种语言? – 2013-05-11 15:01:47

+0

我假设C#所以我已经标记了它 - 如果错误请更正。 – 2013-05-11 15:07:07

+0

调试时,它工作吗?许多事情似乎在实际运行中不能正常工作,但在调试时会发生。 – SimpleVar 2013-05-11 15:10:52

回答

0

看来你的异步应稍微更新:

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; 
} 
+1

这工作,但我不得不添加“async”loopthegame()函数。 – 2013-05-11 15:32:26

0

那么你需要做的异步权(稍作修改):

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

另外:

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

这也适用! :) – 2013-05-11 15:32:58

+0

很高兴我可以帮助:) – 2013-05-11 15:34:32

0

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

这是很容易使用这段代码进行测试:

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

试试吧,它会打印相同的值的五倍。