質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

1401閲覧

以下のプログラムを初心者でも理解できるよう説明してください。

bd_

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/02/01 00:05

編集2018/02/01 00:21

このプログラムの全体的な構造が分かりません。while文でループしていることは分かるのですがMath.Random()でどこからどこまでの乱数になるかが分かりません。
for (int i = 0; i < answer.length; i++) {
boolean flag = false;
answer[i] = (int) (Math.random() * 6 + 1);
do {
flag = false;
for (int j = i - 1; j >= 0; j--) {
if (answer[i] == answer[j]) {
flag = true;
answer[i] = (int) (Math.random() * 6 + 1);
}
}

} while (flag == true); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

motuo

2018/02/01 00:19

プログラムのコードは、```(バッククォート3つ)で囲うようにしてください。また、ご自身がどこまで理解できていて、何故、この質問をするに至ったのか、どこで詰まっているのかを明記しましょう。
guest

回答2

0

これはハングマンと呼ばれる、古くからあるゲームですね。(それこそパソコン黎明期どころか、原型はヴィクトリア朝の頃からともいわれます)
ある桁数の数(ただしこのプログラムでは使う数字は1~6)がランダムに決められます(ただし、同じ数字は2度以上出てこないようになっています)。プレーヤーが数を入力すると、

  • 位置も数字も合っていれば「ヒット」
  • 位置は合っていないが数字は合っている(使われている)なら「ブロー」

と表示します。
最終的に数が合えば(桁数分ヒットしてブローがないなら)終了です。

というのがゲームの流れです。それを踏まえたうえでコードを読みます。

Java

1for (int i = 0; i < answer.length; i++) { 2 boolean flag = false; 3 answer[i] = (int) (Math.random() * 6 + 1); 4 do { 5 flag = false; 6 for (int j = i - 1; j >= 0; j--) { 7 if (answer[i] == answer[j]) { 8 flag = true; 9 answer[i] = (int) (Math.random() * 6 + 1); 10 } 11 } 12 } while (flag == true); 13}

この部分は正解を作成しています。まずランダムな数列を作ったうえで、その数列上に重複する数が出てきていないか調べています(重複していたらそこを書き換えてチェックし直し)。

Java

1while (true) { 2 count++; 3 System.out.println("* "+count + "回目 *"); 4 for (int i = 0; i < answer.length; i++) { 5 System.out.print( (i + 1) + "個目 : "); 6 try { 7 input[i] = Integer.parseInt(br.readLine()); 8 } catch (NumberFormatException e) { 9 System.err.println("数値を入力してください"); 10 i--; 11 } catch (IOException e) { 12 System.err.println("もう一度入力してください"); 13 i--; 14 } 15 } 16 hit = 0; 17 blow = 0; 18 for (int i = 0; i < answer.length; i++) { 19 for (int j = 0; j < answer.length; j++) { 20 if (i == j && input[i] == answer[j]) { 21 hit++; 22 } else if (input[i] == answer[j]) { 23 blow++; 24 } 25 } 26 } 27 System.out.println("ヒット" + hit + " ブロー" + blow); 28 if (hit == 3) { 29 System.out.println("おめでとー"); 30 break; 31 } else { 32 System.out.println(); 33 } 34}

ここはプレーヤーからの答えの入力と、その判定です。桁数分だけ数値を入れていき(最初のfor文)、そのあとでヒット/ブローを数え上げて、結果を表示して、正解してなければ答えの入力を続けさせます。

さて、このコードは上の仕様を満たしていません
まず、桁数が answer.length で決められているのですが、同時に「使用する数字は1~6で、重複できない」ので、最大桁数は6以下でないといけません(でないと永遠に答えを決定できない)
そして合否判定で「ヒット数が3」と、なぜか限定してしまっています。これだとanswer.lengthが3であればいいのですが、4以上なら完全正解でなくても正解になってしまいます(逆に完全正解だと正解とみなされない)し、2以下なら永遠に正解になりません。

投稿2018/02/01 00:36

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Math.Random()

0~1未満の値

投稿2018/02/01 00:30

apo

総合スコア349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問