2012-06-01 100 views
2

我不知道還有什麼在這種情況下使用,但一個if語句。結束一個else if語句C#

我想要做的是從Windows窗體中獲取值string direction;並檢查它是否具有我正在查找的值。然後檢查turtleDir是否是表示方向turtleDir的字符串值。

問題出現在else if語句中,當turtleDirlookingleft時,它會執行所有其他if語句。我想要它做的是在它完成之後,如果它需要停止並等待下一個命令。沒有經歷所有的陳述。

有人可以請教我如何解決這個問題,我做錯了什麼?

下面是代碼:

else if (Program.form.direction == "right") 
{ 
    if (turtleDir == "left") 
    { 
     angle = -1.6f; 
     turtleDir = "lookingLeft"; 
     Program.form.direction = ""; 
    } 
    else if (turtleDir == "lookingLeft") 
    { 
     angle = 3.15f; 
     turtleDir = "lookingDown"; 
    } 
    else if (turtleDir == "lookingDown") 
    { 
     angle = 1.6f; 
     turtleDir = "lookingRight"; 
    } 
    else if (turtleDir == "lookingRight") 
    { 
     angle = 0.0f; 
     turtleDir = "lookingUp"; 
    } 
} 
+2

你可以用C#中的字符串進行切換,這種方法似乎是一個很好的選擇。 :)但你也可以考慮切換到枚舉方向。 –

+4

所有_else if_語句都不可能運行。可能發生的情況是您的主循環(我們在您的文章中看不到)繼續運行,因此它會一次又一次地點擊「if ... else」代碼,然後執行lookLeft-> lookingDown-> lookingRight- > lookingUp,此時'if ... else'中的條件都不能匹配。你的錯誤在「停止並等待」。你的程序如何停止並等待下一個命令? –

+0

你是關於它保持循環,我昨天有一個按鍵,即時通訊在XNA開發和它的更新方法相同的問題。所以不知道在哪裏停止或等待是 –

回答

6

您可以使用switch聲明字符串,太:

switch (turtleDir) { 
    case "left": 
     angle = -1.6f; 
     turtleDir = "lookingLeft"; 
     Program.form.direction = ""; 
     break; 
    case "lookingLeft": 
     angle = 3.15f; 
     turtleDir = "lookingDown"; 
     break; 
    // other cases 
} 

這樣,switch塊總是在您的指令完成後退出。您也可以在最後添加case default:時指定該字符串不匹配這些值時要執行的操作。請記住,每種情況都需要以break聲明(或return/throw)終止,但我認爲在這種情況下您不需要這些聲明)。

如果仍然執行每個案例,您的問題就在別的地方。如果一個方法包含這個代碼,並且從例如turtleDir == "left",該方法的每個連續調用將讓循環turtleDir,直到每個案件已執行和turtleDir結束與最終值"lookingUp"。所以看看你的控制流程,也許跟蹤你是否已經執行了這個檢查。也許跟蹤已經過的時間,並且只有在特定狀態下有一段時間(我不知道您的要求)才更改turtleDir

編輯:您應該在每case聲明中設置Program.form.direction = ""。這就是爲什麼你的代碼被一遍又一遍地執行。另外,如果沒有方向輸入,也要清除它。

+0

仍然沒有,它不是退出:( –

+0

@ Sigh-AniDe然後你的問題在別處。這個代碼,只有一個案件將被執行,我認爲包含該代碼的方法可能會被多次調用,你檢查過嗎? – Botz3000

+0

它的xna因此被稱爲multipe時間,因爲它在更新方法中,但我該如何阻止它? –

0

您可以使用空return; - 聲明,但後來你離開你的方法太...

+0

它不起作用,它仍然通過所有其他的事情,如果陳述 –

+0

你必須把'返回;'進入每種情況下 – webber2k6

+0

我確實把返回到每個案件 –

0

使用開關

switch (turtleDir) 
{ 
    case "left": 
     angle = -1.6f; 
     turtleDir = "lookingLeft"; 
     Program.form.direction = ""; 
     break; 

    case "lookingLeft": 
     angle = 3.15f; 
     turtleDir = "lookingDown"; 
     break; 

    case "lookingDown": 
     angle = 1.6f; 
     turtleDir = "lookingRight"; 
     break; 

    case "lookingRight": 
     angle = 0.0f; 
     turtleDir = "lookingUp"; 
     break; 

    default: 
     // Optional, but place any actions if non of the above is matched 
     break; 
} 
0

別的怎麼回事....

下,只有一個IF/ELSE-IF語句的分支將被執行。出於可讀性原因,您可能需要重構SWITCH語句;但不是因爲它會改變你的行爲

看看這段代碼:

if(0 == 0) { Console.WriteLine("Branch 1"); } 
    else if(true==true) { Console.WriteLine("Branch 2"); } 
    else if(false==false) { Console.WriteLine("Branch 3"); } 

所有的條件都爲真。第一個執行。只有第一個。(0 == 2){Console.WriteLine(「Branch 1」);如果(0 == 2){Console.WriteLine(「Branch 1」);}}。 } else if(true == true){Console.WriteLine(「Branch 2」); } else if(false == false){Console.WriteLine(「Branch 3」); }

只有第二個執行。

如果條件爲真,一系列else-if將不會全部執行。

我的猜想是你正在循環這個真快的東西,下一次迭代正在進入IF邏輯並執行下一個分支。您可能需要發佈更多代碼,以便針對您的特定情況獲得更有用的答案。

追溯這種情況的最好方法是恕我直言,就是在您的IF邏輯開始處放置一個斷點,並逐步執行一次執行的代碼。您應該看到它只能進入一個ELSE-IF分支並退出,並且您可以看到它是否重新進入。

最後,SWITCH語句不允許您隱式執行多個分支。

switch(test) 
    { 
     case "one": 
      Console.WriteLine("Branch 1"); 
     case "two": 
      Console.WriteLine("Branch 2"); 
    } 

這甚至不會編譯。我相信在C/C++中,除非明確地添加break,否則您可能會遇到case語句;或類似的控制聲明。在C#中,情況並非如此。