2014-01-17 2 views
0

Так что я делаю текстовую приключенческую игру в JAVA на данный момент. У меня небольшая проблема с моим кодом, что делает геймплей игры очень раздражающим. Когда игрок вводит команду, например, «на север», при первом срабатывании. Но во второй раз это не сработает. Он не отображает мой случай переключения по умолчанию, поэтому он распознает команду. Когда я вхожу в ту же команду, например, «иди на север», опять же, она работает. Таким образом, это не работает в первый раз, но просто вводя его еще раз, он заставляет его работать. Есть ли способ, которым я могу это сделать, чтобы он не работал на двух входах? Вот мой код:JAVA, Корпус выключателя вмещает две записи для работы

//// 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

Логика вашего для петли неправильно. Измените switch (input.nextLine()) на switch (playerCommand), а затем добавьте playerCommand = input.nextLine() в конце оператора switch. Кроме того, удалите все ссылки на ваш цикл в своих операторах break.

+0

Этот метод не работает. Когда я это делаю, он автоматически выводит мой случай по умолчанию дважды, даже не дожидаясь ввода. – user3207994

+0

Это невозможно. input.readLine() - это блокирующий вызов, поэтому программа не будет перемещаться мимо него, пока не будет дан какой-либо ввод. Какова ваша переменная loopInt? От куда это? –

+0

loopInt - это просто int, который я установил в моем файле Variables.java. Этот основной класс, в котором находится этот случай коммутатора, расширяет переменные. 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

Ни один из них не работает. Оба они приводят к тому, что мой коммутатор работает по умолчанию, не дожидаясь ввода. – user3207994

Смежные вопросы