0

学校の授業でじゃんけんゲームを作っています。無効な選択が回答されたときに質問を言い換えるために何かを設定することを除いて、すべてが機能しました。ここでは 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!");
    }
}
4

3 に答える 3

3

いくつかのことが飛び出します:

  1. Java (および構文的に B から派生した他のほとんどの言語) では、論理AND 演算子は&&, ではなく&(&は算術演算子であり、ビット単位のブール OR を実行します)。

    そう

    if (P1 == 1 && P2 == 1)
    //          ^^---- &&, not &
    
  2. Java では、変数にブロック スコープがあります。つまり、ブロック内で宣言された変数は、そのブロック (およびそれに含まれるすべてのブロック) 内でのみ使用でき、そのブロックのでは使用できません。したがって、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. 任意の論理条件 (a の条件を含むwhile) で、複数の条件を組み合わせるには、セミコロン ( ) ではなく、論理演算子&&(「and」) と(「or」) を使用します。たとえば、次のようになります。||;

    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. 同点かどうかを確認するために 3 つの異なるテストがあり、通常は、同じ条件 (多くのP1 == 1P2 == 2など) を何度も再テストしています。if をチェックするだけで同点かどうかをテストできます。たとえば、 を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. (より高度な) sをenum調べます。あなたのロジックを作り直す際に、私は単にあなたのロジックが正しいと信じて1いました. (明らかに、出力されたメッセージを見ることができます。) anを使用すると、コードがより明確になります。( )23enumif (P2 == RPS.Paper)

いくつかのガイド付き Java チュートリアルを実行することをお勧めします。Oracleにはいくつかの.

于 2013-11-05T11:12:21.503 に答える
0

@TJとして。Crowder は、'AND' ('&&') 操作と 'OR' ('||') を理解する必要があると言いました。

これはソリューションへのコンパイル アプローチですが、機能させるにはコードを改善する必要があります。Javaの学習を楽しんでいただければ幸いです。

import java.util.Scanner;

public class RockPaperScissorsTest {

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

    Scanner input = new Scanner(System. in );
    int P1 = 0;
    int P2 = 0;
    do {
        System.out.println("Player 1, choose 1 for rock, 2 for paper, or 3 for scissors.");
        P1 = input.nextInt();
    } while (P1 != 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.");
        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!");
}

}

于 2013-11-05T11:19:22.857 に答える
0

変数をグローバルに宣言する必要があります。スキャナーを宣言するポイント。そして、ループで初期化するだけです。

ループ外:

int P1;

ループ内でのみ行う:

P1 = input.nextInt();
于 2013-11-05T11:16:42.483 に答える