質問: sc.next(); // 解答を入力 if(yourAns.equals(answer)) { // 判定 System.out.println("正解"); break; } else { System.out.println("不正解"); } } System.out.println("もう一度実行しますか 1.はい 2.いいえ"); if(!sc.next().equals("1")) { break; } } System.out.println("終了します"); } } ``` 追記です: 現在、while文の中で for文を使い、入力した答えと、予め用意されていた答えがtrueの場合、変数iにを1つ足すようにコードを追加してみたのですが 1枚目の画像のように、無限ループしてしまいます。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/be8d150a75a81db7706b32382794ae34.png) そこで、1度処理をしたあと繰り返し自体を中断させるため、break;を記述すると ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/d493f229910271cd6496b332d3743590.png) 2枚目の画像のように、下の「もう一度実行しますか〜〜」の処理がされず、延々と「0回目の正解です」→入力→「0回目の正解です」が繰り返され i++がデッドコードとエラーが出てしまうところで躓いております。
回答: こんな感じでしょうか。 ``` for(int numOfCorrect = 1; true; numOfCorrect++) { ... while(true) { ... } System.out.println(numOfCorrect + "回目の正解です"); ... } ``` 追記のコードが上手くいかない理由 > > > ``` > for(int i = 0; yourAns.equals(answer); i++) { > System.out.println(i + "回目の正解です"); > } > ``` > > for文は、`for(初期化部; 条件式; 更新式)`という形式で書きます。 上記のコードでは、ループ内において条件式の判定が変わるような影響がありません。 よって、**無限ループとなり、iはカウントアップされ続けます。** > > > ``` > for(int i = 0; yourAns.equals(answer); i++) { > System.out.println(i + "回目の正解です"); > break; > } > ``` > > 上記のコードでは、breakが無条件に実行され、**ループが二周以上することはありません。** `i++`に警告が出るのは、ループが必ず一周で終わるため、更新式が用いられないからです。 通常break文やcontinue文は、何らかの条件付きで記述します。 また、上記for文に突入する際は、毎度iが0に初期化されます。 よって、**何度実行しても『0回目の正解です』としか表示され得ません。** 私が示した解法について 回答冒頭のコードについてです。 aiueo19さんの元のコードの、次の構造を利用しています。 ``` 外側のループ { ... 内側のループ { ... 正解したら脱出 } 正解した回数を表示(したい) ... } ``` 要するに、**『外側のループを繰り返した回数 = 正解した回数』**なのです。 ループを実現するにはfor文とwhile文があります。 これらは相互代替可能ですが、ここではfor文の**カウンタ**を利用しています。 よって、次のように書きました。(冒頭のコードと全く同じ内容です) ``` for(int numOfCorrect = 1; true; numOfCorrect++) { ... while(true) { ... } System.out.println(numOfCorrect + "回目の正解です"); ... } ``` ループを新しく内側に入れ込んだりする必要はありません。 単に、外側のループをfor文に置き換えれば万事解決するのです。 プログラムの書き方について かなりいろいろと調べ、奮闘されているようですね。これ自体は、とても大切なことです。 ただ、今回のコードは、for文の基本的な使い方がわかっていれば問題なく解決できるはずです。 ですので、基本的な部分を確認するように申し上げました。 スラスラとコードを書くのには慣れが必要です。 基本的な部分を、不足なくしっかり押さえ、コードの挙動を追う癖をつけてください。