Как мне повторить код для определенного случая в операторе switch и не повторить его для других?

1

Я делаю текстовую приключенческую игру. В одной комнате я хочу спросить у игрока, что делать, и если он войдет в дверь, он/она перейдет в следующую комнату. Если он подберет фонарик, "что вы хотите сделать?" вопрос повторяется, после чего они могут пройти через дверь. Вот мой код:

case 1:
                System.out.println("What do you want to do? Type 'door' to go through the door or 'flashlight' to pick up the flashlight.");
                String roomOneAction = input.nextLine();

                switch(roomOneAction) {

                    case "flashlight":
                        System.out.println("Picked up flashlight.");
                        //repeat what do you want to do? question
                        break;

                    case "door":
                        System.out.println("You open the door.");
                        //continue plot, don't repeat question
                        break;

                    default:
                        System.out.println("Error");
                        // repeat what do you want to do? question
                        break;
                    }
                break;

С этим кодом прямо сейчас, он повторяет вопрос для всего, что вы набираете. Я не хочу, чтобы это произошло, если набрана "дверь".

Кроме того, как я могу сделать это так, что как только фонарик будет поднят и вопрос будет повторен, фонарик не может быть поднят во второй раз?

  • 1
    Второй вопрос: держите где-то состояние мира, например, «поднят ли фонарик». Точнее, нужно отслеживать местоположение фонарика: это на лице пользователя? Это в комнате? Первое: у штатов есть критерии перехода, которые определяют, что может и / или может произойти дальше. Прямо сейчас кажется, что вы загнали себя в угол, где поддержка обоих вышеперечисленных вариантов приведет к некоторому очень грязному и трудоемкому коду. Возможно, вы захотите переосмыслить, как хранится состояние игры и как принимаются решения о том, что может произойти дальше.
Теги:

4 ответа

1

В этом случае вам, вероятно, следует сохранить информацию, если вы хотите снова спросить:

boolean askAgain = true;
//...
case "door":
    //...
    askAgain = false;
//...
if (askAgain) {
    System.out.println("...");
}
1

Я бы рекомендовал использовать цикл while здесь. Может ли игрок делать что-либо еще в комнате или покидать комнату по-другому? Если они могут покинуть комнату, используя команду "дверь", настройте цикл while, чтобы конечным фактором являлась команда "дверь".

1

Это может быть близко к тому, что вы хотите:

import java.util.Scanner;

public class Game {
    private static boolean flashlightPicked = false;
    private static boolean doorEntered = false;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (true) {
            int x = 1;
            switch (x) {
            case 1:
                System.out
                        .println("What do you want to do? Type 'door' to go through the door or 'flashlight' to pick up the flashlight.");
                String roomOneAction = input.nextLine();

                switch (roomOneAction) {

                case "flashlight" :
                    if(!flashlightPicked){
                        System.out.println("Picked up flashlight.");
                        flashlightPicked = true;
                    } else {
                        System.out.println("Already picked up flashlight!");
                    }
                    // repeat what do you want to do? question
                    break;

                case "door":
                    if(!doorEntered){
                        System.out.println("You open the door.");
                        doorEntered = true;
                    }else{
                        System.out.println("Already opened the door!");
                    }
                    // continue plot, don't repeat question
                    break;

                default:
                    System.out.println("Error");
                    // repeat what do you want to do? question
                    break;
                }
        }
    }
}
  • 0
    Вместо private static main должен создать new Game() и позволить ей делать свою работу.
  • 0
    Как продолжается сюжет в door проеме? Из-за while (true) оператор swtich вводится снова (и снова).
0

Мне не нравится идея каскадирования нескольких переключателей, как вы это делали. Вы должны использовать шаблон состояния и шаблон команды, но я предполагаю, что вы начинающий программист, поэтому я просто попытаюсь ответить на ваш вопрос.


Оберните roomOneAction в цикле while, например

boolean foundFlashlight = false;
boolean askAgain = true;
while (askAgain)
{
  // question + switch statement and so on
}

если игрок выбирает вспышку, установите для foundFlashlight значение true.

В следующем прогоне игрок снова спрашивает. Если он выбирает фонарик, вам нужно оценить переменную foundFlashlight, если значение true, сообщите игроку, что у него уже есть фонарик, и он должен ответить снова.

В случае с дверью просто установите для параметра askAgain значение false. Тогда цикл завершается.


Но опять же, это не хороший, чистый и простой в обслуживании подход. Вы должны взглянуть на некоторые шаблоны проектирования. Особенно вышеупомянутый государственный шаблон.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню