Как использовать цикл в другой цикл в Java - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь сделать небольшую игру:

  • Вы можете выбрать 2 героев: 1 Воин и 2 Маг.

  • Далее вам нужно выбрать способ передвижения: 1 на лошади 2, телепортация (доступна только магу).

  • Наконец, выберите оружие: 1 Меч 2 Посох (* Маг может использовать только Посох; Воин может использовать оба).

Я создал цикл для моего первого вопроса (выбор героя), чтобы, если пользователь вводит что-то еще, кроме 1 или 2, программа повторяет вопрос («Выберите своего героя: ...). Мне нужен То же самое сделано для моего второго и третьего вопроса (тем более, что существуют некоторые ограничения, например, если пользователь выбрал Воина, он не может выбрать Телепортацию в качестве своего варианта путешествия).

public static void main(String[] args) {
    int hero, travel, weapon;
    Scanner scan = new Scanner(System.in);

    loop:
        while (true) {
            System.out.println("Choose your hero: 1 for Warrior, 2 for Mage");
            hero = scan.nextInt();
            switch (hero) {
            case 1:
                System.out.println("Choose your travel option: 1 for Horse; 2 for Teleportation");
                travel = scan.nextInt(); 
                break loop;
            case 2:
                System.out.println("Choose your travel option: 1 for Horse; 2 for Teleportation");
                travel = scan.nextInt(); 
                break loop;
            default:
                break;
            }
        }                       
}

Я не знаю, как правильно использовать цикл внутри другого цикла. Я пробовал несколько вариантов, но он всегда возвращает ошибку.

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Как и в комментариях, я бы не стал использовать циклы внутри циклов.Вместо этого вы должны назначить переменные по одной за раз.Я написал вспомогательный метод selectVariable(String description, String varOne, String varTwo), который вы можете использовать, чтобы назначать переменные и дать вам начало вашей истории игры.Вы можете расширить его, если хотите предоставить пользователю больше возможностей.Также не используйте иллюзию, что выбор может быть сделан, если в этой ситуации выбора нет.

Вот код, который должен делать то, что вы хотите:

import java.util.Scanner;

public class Story {

  static Scanner scan = new Scanner(System.in);

  public static void main(String[] args) {
    int hero = chooseHero();
    int travel = chooseTravel(hero);
    int weapon = chooseWeapon(hero);

    //For printing purposes give your choice their respective string name again. 
    String heroDesc = hero == 1 ? "Warrior" : "Mage";
    String travelDesc = travel == 1 ? "Horse" : "Teleportation";
    String weaponDesc = weapon == 1 ? "Sword" : "Staff";

    System.out.printf("you are a %s, traveling by %s, wielding a %s" + System.lineSeparator(), heroDesc, travelDesc, weaponDesc);
  }

  private static int chooseHero() {
    return selectVariable("choose your hero class", "warrior", "mage");
  }

  private static int chooseTravel(int hero) {
    if (hero == 1) { // if the user has no choice don't give the illusion a choice can be made
      System.out.println("you are a Warrior you will travel by horse");
      return 1;
    } else {
      return selectVariable("choose your way of travel", "by horse", "teleportation");
    }
  }

  private static int chooseWeapon(int hero) {
    if (hero == 2) {
      System.out.println("you are a mage you will wield a staff");
      return 2;
    } else {
      return selectVariable("choose your weapon", "sword", "staff");
    }
  }

  //you can reuse this method to also assign other traits to your story
  private static int selectVariable(String description, String varOne, String varTwo) {
    int var;
    do {
      System.out.printf("%s: 1 %s, 2 for %s" + System.lineSeparator(), description, varOne, varTwo);
      var = scan.nextInt();
      switch (var) {
        case 1:
          System.out.printf("you have chosen %s" + System.lineSeparator(), varOne);
          return var;
        case 2:
          System.out.printf("you have chosen %s" + System.lineSeparator(), varTwo);
          return var;
        default:
          System.out.println(var + " is an invalid choice");
      }
    }
    while (true);
  }
}
1 голос
/ 18 июня 2019

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

Выбор героя: предложите оба варианта и сделайте петлю, пока не получите правильный ответ. Затем верните ответ

private static int queryHero() {
    Scanner scan = new Scanner(System.in);
    int hero;
    while (true) {
        System.out.println("Choose your hero: 1 for Warrior, 2 for Mage");
        hero = scan.nextInt();
        if(hero == 1 || hero == 2) {
            break;
        } else {
            System.out.println(hero + " is not a valid choice");
        }
    }
    return hero;
}

Выбор варианта путешествия: Предлагайте варианты в зависимости от выбранного героя и зацикливайтесь, пока не получите правильный ответ. Затем верните ответ

private static int queryTravelOptionForHero(int hero) {
    Scanner scan = new Scanner(System.in);
    int travelOption;
    while (true) {
        if (hero == 1) {
            System.out.println("Choose your travel option: 1 for Horse");
            travelOption = scan.nextInt();
            if (travelOption == 1) {
                break;
            } else {
                System.out.println(travelOption + " is not a valid choice");
            }
        } else if (hero == 2) {
            System.out.println("Choose your travel option: 1 for Horse; 2 for Teleportation");
            travelOption = scan.nextInt();
            if (travelOption == 1 || travelOption == 2) {
                break;
            } else {
                System.out.println(travelOption + " is not a valid choice");
            }
        }
    }
    return travelOption;
}

Выбор оружия: предлагайте варианты в зависимости от выбранного героя и петли, пока не получите правильный ответ. Затем верните ответ

private static int queryWeaponForHero(int hero) {
    Scanner scan = new Scanner(System.in);
    int weapon;
    while (true) {
        if(hero == 1) {
            System.out.println("Choose your weapon: 1 for Sword; 2 for Staff");
            weapon = scan.nextInt();
            if (weapon == 1 || weapon == 2) {
                break;
            } else {
                System.out.println(weapon + " is not a valid choice");
            }
        } else if(hero == 2) {
            System.out.println("Choose your weapon: 2 for Staff");
            weapon = scan.nextInt();
            if(weapon == 2) {
                break;
            }else {
                System.out.println(weapon + " is not a valid choice");
            }
        }

    }
    return weapon;
}

Тогда в своей главной:

int hero = queryHero();
int travelOption = queryTravelOptionForHero(hero);
int weapon = queryWeaponForHero(hero);

System.out.println("hero: " + hero);
System.out.println("travelOption: " + travelOption);
System.out.println("weapon: " + weapon);

Примечание: я не уверен, знаете ли вы о них, но есть способы сделать этот код лучше, используя перечисления и списки

1 голос
/ 18 июня 2019

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

Нет реального оправдания для использования switch labels и loops внутри loops

Просто напишите 3 простых цикла, один за другим - это будет просто читать, понимать и отлаживать.

Я не хочу писать код для вас, это не цель этого сайта, но вот Псевдокод:

Loop 1 (selecting heroes)

If(heroes != Warrior)
    Loop 2 (selecting travel)
else travel=Horse

Loop 3 (selecing weapon)
...