2013-05-11 104 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)); 
} 

試試吧,它會打印相同的值的五倍。