2014-01-17 21 views
0

所以我現在正在用JAVA製作一個基於文本的冒險遊戲。我的代碼存在一個小問題,這使得遊戲的遊戲非常煩人。當玩家輸入一個命令,如「北上」,第一次工作正常。但第二次,它不起作用。它不顯示我的默認開關情況,所以它能識別命令。例如,當我輸入相同的命令時,「再次向北」,它就會起作用。所以它不是第一次工作,但只需再輸入一次就可以工作。有沒有辦法讓我這樣做,所以它不需要兩個輸入來工作? 這裏是我的代碼:JAVA,Switch case需要兩個條目才能工作

//// USER INPUT TIME //// 

System.out.println(">_"); 
playerCommand = input.nextLine(); 
loop: while (loopInt > 0) { 
    switch (input.nextLine()) { 
    case "go north": 
    case "n": 
     alleywayGoNorth(); 
     break loop; 
    case "go south": 
    case "s": 
     alleywayGoSouth(); 
     break loop; 
    case "open door": 
    case "o door": 
     alleywayOpenDoorLocked(); 
     break loop; 
    default: 
     System.out.println("That command is not valid at the moment."); 
     break; 
    } 
} 

//////// 
+0

您正在閱讀輸入兩次。 'playerCommand = input.nextLine();'讀取第一行。 'switch(input.nextLine())'讀取下一行。我建議你將'playerCommand = input.nextLine();'移動到while循環,然後將開關切換到'switch(playerCommand)' – user3100783

+0

刪除'loop:'標籤將導致while循環繼續執行(假設' loopInt'大於0)。我想這意味着在循環中使用帶有標籤的'break'會導致你跳出整個循環,看起來你不想要。 – mdl

+0

@mdl,這實際上是我想要的。沒有循環:和循環;它將不會再次要求用戶輸入。它會運行我的默認情況。 – user3207994

回答

1

for循環您的邏輯是錯誤的。將switch (input.nextLine())更改爲switch (playerCommand),然後在switch語句的末尾添加playerCommand = input.nextLine()。另外,在你的break語句中刪除所有對你的循環的引用。

+0

此方法不起作用。當我這樣做時,它自動輸出我的默認情況兩次,甚至不等待輸入。 – user3207994

+0

這是不可能的。 input.readLine()是一個阻塞調用,因此程序不會移動它,直到給出一些輸入。你的loopInt變量是什麼?它從何而來? –

+0

loopInt只是我在Variables.java文件中設置的一個int。這個開關箱所在的主類擴展了變量。 loopInt是100,所以它現在總是大於0。 – user3207994

0

由於您檢索了兩次輸入,所以您的行被「交錯」了一個。

變化:

switch (input.nextLine()) { 

switch (playerCommand) { 
+0

沒有。這使得我的默認情況下無限期地打印到屏幕上:c – user3207994

+0

我認爲這是因爲你的默認原因是'break'而不是'break loop'。 – Louis

+0

我這樣做是因爲如果用戶輸入一個無效的命令,我希望它回頭看循環的開始,以便他們可以再試一次。那些有斷裂循環工作的人,因此把他們從循環中送回新的。 – user3207994

-2

試試這個:

System.out.println(">_"); 
playerCommand = input.nextLine(); 
loop: while (playerCommand) { 
    switch (playerCommand) { 
    case "go north": 
    case "n": 
     alleywayGoNorth(); 
     break loop; 
    case "go south": 
    case "s": 
     alleywayGoSouth(); 
     break loop; 
    case "open door": 
    case "o door": 
     alleywayOpenDoorLocked(); 
     break loop; 
    default: 
     System.out.println("That command is not valid at the moment."); 
     break; 
    } 
    playerCommand = input.nextLine(); 
} 

免責聲明:我沒有運行此代碼,你將不得不測試它自己。

+0

「while(playerCommand)」在語義上沒有意義。 –

+0

不起作用:(是的,playerCommand不是布爾值,它是一個字符串, – user3207994

0

您將獲得玩家的兩次輸入。一旦初始化「playerCommand」,並在創建switch語句時執行一次。刪除playerCommand初始化並將其替換爲switch語句。

switch(playerCommand = input.nextLine()) { 
    ... 
} 

如果你不還是需要 「playerCommand」 變量,你可以使用:

switch(input.nextLine()) { 
    ... 
} 
+0

這兩者都不工作,它們都導致我的Switch在不等待輸入的情況下運行默認情況。 – user3207994