java - 调用 Java 中另一个循环中创建的变量,以及如何在 do...while 循环中具有多个条件

标签 java

我正在为学校类制作一个石头剪刀布游戏。我让一切正常工作,除了在回答无效选择时设置一些东西来重述问题。我认为 do...while 语句在这里是最好的,但我意识到我正在循环的“do”部分中调用一个变量。因此,由于它正在调用另一个循环中的某些内容,因此它找不到该变量。另外,在我的 while 语句中,我是否正确列出了可接受的变量?我很确定这部分是我编的。

非常感谢大家的帮助!

import java.util.Scanner;

public class RockPaperScissorsTest {

    public static void main(String[] args) throws Exception {

        Scanner input = new Scanner(System. in );
        do {
            System.out.println("Player 1, choose 1 for rock, 2 for paper, or 3 for scissors.");
            int P1 = input.nextInt();
        } while (P != 1; P1 != 2; P1 != 3);
        System.out.println("");
        System.out.println("");
        System.out.println("");
        do {
            System.out.println("Player 2, choose 1 for rock, 2 for paper, or 3 for scissors.");
            int P2 = input.nextInt();
        } while (P2 != 1; P2 != 2; P2 != 3);
        if (P1 == 1 & P2 == 1)
            System.out.println("It's a tie!");
        if (P1 == 1 & P2 == 2)
            System.out.println("Player 2 wins!");
        if (P1 == 1 & P2 == 3)
            System.out.println("Player 1 wins!");
        if (P1 == 2 & P2 == 1)
            System.out.println("Player 1 wins!");
        if (P1 == 2 & P2 == 2)
            System.out.println("It's a tie!");
        if (P1 == 2 & P2 == 3)
            System.out.println("Player 2 wins!");
        if (P1 == 3 & P2 == 1)
            System.out.println("Player 2 wins!");
        if (P1 == 3 & P2 == 2)
            System.out.println("Player 1 wins");
        if (P1 == 3 & P2 == 3)
            System.out.println("It's a tie!");
    }
}

最佳答案

有几件事跳出来:

  1. 在 Java(以及语法上源自 B 的大多数其他语言)中,逻辑 AND 运算符是 &&,而不是 &( & 是一个数学运算符,执行按位 boolean OR)。

    所以

    if (P1 == 1 && P2 == 1)
    //          ^^---- &&, not &
    
  2. 在 Java 中,变量具有 block 作用域。这意味着在 block 内声明的变量仅在该 block (及其包含的任何 block )内可用,而在该 block 外部不可用。因此,您在此处的循环内定义的 P2 :

    do {
        System.out.println("Player 2, choose 1 for rock, 2 for paper, or 3 for scissors.");
        int P2 = input.nextInt();
    //  ^----------------------------- here
    } while (/*...*/);
    

    ...仅在循环内可用,而不是在循环之后可用。您需要在循环外声明该变量。 (当然,P1 也是如此。)在这种情况下,最好的位置是函数的顶部:

    int P1, P2;
    
  3. 在任何逻辑条件(包括 while 的条件)中,要组合多个条件,可以使用逻辑运算符 &&(“and”)和 ||(“或”),而不是分号(;)。例如:

    do {
        System.out.println("Player 2, choose 1 for rock, 2 for paper, or 3 for scissors.");
        P2 = input.nextInt();
    } while (P2 != 1 && P2 != 2 && P2 != 3);
    //               ^^---------^^---- "If P2 is not 1 AND P2 is not 2 AND P2 is not 3"
    
  4. 您进行了三种不同的测试来查看是否平局,并且通常您会对相同条件进行大量重新测试(大量 P1 == 1P2 == 2 等)。您可以简单地通过检查 P1 == P2 来测试平局,并且可以通过使用 else 显着减少条件检查的数量,例如:

    if (P1 == P2) {
        System.out.println("It's a tie!");
    }
    else if (P1 == 1) {
        if (P2 == 2) {
            System.out.println("Player 2 wins!");
        }
        else {
            System.out.println("Player 1 wins!");
        }
    }
    else if (P1 == 2) {
        if (P2 == 1) {
            System.out.println("Player 1 wins!");
        }
        else {
            System.out.println("Player 2 wins!");
        }
    }
    else { // P1 == 3
        if (P2 == 1) {
            System.out.println("Player 2 wins!");
        }
        else {
            System.out.println("Player 1 wins");
        }
    }
    
  5. (更高级) 查看enum。在我重新设计你的逻辑时,我只是相信你的逻辑是正确的,因为我不知道 123 是什么时候看代码。 (显然,我可以在更高的位置查看您输出的消息。)使用 enum 将使代码更加清晰。 (if (P2 == RPS.Paper))

我建议学习一些 Java 指导教程。甲骨文has several .

关于java - 调用 Java 中另一个循环中创建的变量,以及如何在 do...while 循环中具有多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19787536/

相关文章:

java - Handler.postDelayed 对比 Runnable.run。可以调用 .run 而不是 .postDelayed 吗?

java - 解释一下java访问内部类的方法?

java - Android - 显示没有标题栏或有菜单按钮的菜单

java - run 方法有效,但线程不会调用它

java - 我无法使用 Ormlite 从 sqlite 数据库检索数据?

java - 无法执行,没有命名参数匹配

无法通过将鼠标移开来取消 JavaFX MenuItem

java - 如何用另一个 JButton 替换 JPanel 中的 JButton

java - Java 中的线程数是否有硬性限制?

java - Jax-rs - 将有关最大结果、偏移量和结果的信息添加到第一个节点