【问题标题】:How to use a loop into another loop in Java如何在Java中使用循环进入另一个循环
【发布时间】:2019-06-18 07:44:52
【问题描述】:

我正在尝试制作一个小游戏:

  • 您可以选择 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;
            }
        }                       
}

我不知道如何在另一个循环中正确使用一个循环。我尝试了几个选项,但总是返回错误。

【问题讨论】:

  • 为什么你希望你的新循环在这个循环中?据我了解你的问题,你可以把它放在这个之后。
  • 你必须使用循环吗?使用多个没有任何循环的简单方法可能是一个更好的解决方案。
  • 附注:不要不要在标签上使用中断!任何种类的标签都是邪恶的。在几年的编程中,我已经忘记了它们甚至存在,我希望不会很快看到它们。为什么?如果你必须使用它们,那么你的方法可能太复杂了,你应该想出一些其他的方法来组织你的代码。
  • 作为风格指南建议 - 尽量不要提供不可用的建议。没有什么比你提出的场景更令人气愤的了……这样想吧。你想要哪个英雄? A) 战士。然后:什么交通工具? A) 传送器。然后程序有效地说“哈哈,你不能那样做 - 运气不好,再去猜测正确的组合!”。但这只是我的建议——毕竟这是你的游戏。另外作为提示,您可能在一段时间内不需要一段时间。有一些 ifs 的一段时间可能对你有用。

标签: java loops while-loop switch-statement java.util.scanner


【解决方案1】:

拆分东西总是一个好主意,而不是制作嵌套循环。这是一种将程序拆分为 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);

注意:我不确定您是否了解它们,但有一些方法可以使用枚举和列表使这段代码更好

【讨论】:

  • 谢谢,这似乎完全符合我的要求。不幸的是,我对枚举和列表一无所知,我是初学者。
  • @Felix 我假设是这样,因为问题是初学者级别。这就是我这样写的原因。但是这个解决方案没有问题,是正确的做法。
  • @Bentaye 再次感谢您!您能否也帮我解决一下:如果一开始我希望用户输入他的名字,然后在每个短语之前使用他的名字(例如名字+“,选择你的英雄),我应该为此添加一个单独的方法吗?还是我应该把它放到方法 queryHero 中?
  • 你可以有一个方法来查询名字(比如queryUserName()),然后你可以将名字传递给其他方法,就像你传递英雄一样,新的方法签名将是queryHero(String userName), queryTravelOptionForHero(int hero, String userName) ...
  • @bentaye 它工作得很好,谢谢你和最良好的祝愿!
【解决方案2】:

您的流程可以编写为简单的程序代码。因此,我会以最简单的形式编写它——至少作为开始。

loops 中使用switch labelsloops 没有真正的理由

只需编写 3 个简单的循环,一个接一个 - 它会很容易阅读、理解和调试。

我不想给你写代码,这不是本站的目的,但这里是一个伪代码:

Loop 1 (selecting heroes)

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

Loop 3 (selecing weapon)

【讨论】:

    【解决方案3】:

    就像 cmets 建议的那样,我不会在循环内使用循环。相反,您应该一次分配一个变量。我编写了一个帮助方法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);
      }
    }
    

    【讨论】:

    • 非常感谢您的回答!我有一个关于为每个整数指定一个字符串名称以用于打印目的的问题:我尝试为 4 个不同的选项(战士、法师、流氓和野蛮人)执行此操作,但它没有奏效……它只有在以下情况下才有效有两个值?
    • @Felix 在当前状态下仅适用于这两个选项。如果你想要四个选项,你必须扩展方法或重载方法selectVariable (String description, String varOne, String varTwo)。如果你愿意,我可以用另一种方法为四个变量编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多