みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Java初心者です。どうか教えてください><

1週間ほど前からJavaの勉強を始めたものです。初歩的な質問で申し訳ないのですが、是非おしえていただきたくて投稿いたしました。
秀和システムからでている「わかりやすいJava入門編」を使って勉強しているのですが、課題の1つでつまづいてしまい、解決法がわからないので質問させていただきました。

課題の内容は以下です。

1、10本のうち3本が当たりで、最大10回引ける。あたりが出たら取り出す。3つ全てあたりが出たら終了。
2、eclipseのコンソール画面上から「キーをタイプすればくじが引けます」と表示、キーを入力すればくじ引き開始。
3、キー入力後0.1秒ごとに ■ が表示され、1秒後10個になった時点でくじ引き結果表示。

そこで、わたしは、まずint[ ]の配列を10個用意し、ループ分で[0]~[9]まで順にランダムに0~9の数字を入力し、 i番目の[i]に入っている数字が、それより以前の配列に入っている場合、[i]配列の抽選をやりなおす、というやり方でやろうと思って以下のような書き方をしたのですが、どうやら間違っているようで重複の場合のやり直しをしてくれません;;

初心者なので、見づらい書き方をしているかもしれませんがお許しください><

package exercise;
import lib.Input;
public class Lot_6 {

static int[] lot = new int[10];
static int i;

public static void main(String args[]){

int a = 0;
for(int i=0; i < lot.length ;i++){

if (a < 3){
Input.getString("キーをタイプするくじが引けます");
animation();

do{
lot[i]=(int)(10*Math.random());
} while(isTrue());

if((lot[i] == 0) ^ (lot[i] == 1) ^ (lot[i] == 2)){
System.out.println("あたり");
a++;

} else {
System.out.println("はずれ");
}
} else {
break;
}
}
}

public static void animation() {
for(int m = 0;m < 10;m++){
System.out.print("■ ");
delay(100);
}
}
public static void delay(int t) {
try {
Thread.sleep(t);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static boolean isTrue(){
boolean is = false;
for(int n=0;n <= i-1;n++){
if(lot[i] == lot[n])
is = true;
else {
continue;
}
}
return is;

}


}

そこで、間違っている箇所を調べるために do{ } while();ループの中にSystem.out.println(isTrue());を加え、if(a < 3) { }の内の最後にSystm.out.println(lot[i]);を加えました。


ちゃんと重複した場合isTrue()にTrueを返しているか、重複した場合やりなおしをしてくれているか、を調べるためです。
そしてコンソール画面の実行結果が以下です。



[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
6
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
3
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
あたり
1
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
4
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
あたり
0
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
4
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
4
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
5
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
はずれ
9
[キーをタイプするくじが引けます] >
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false
あたり
2




数字が重複していますし、trueが一個もありません。
ということはisTrue()メソッドの部分で誤りがあるんでしょうか?

public static boolean isTrue(){
boolean is = false;
for(int n=0;n <= i-1;n++){
if(lot[i] == lot[n])
is = true;
else {
continue;
}
}
return is;

}

こう書けば、lot[i]がlot[0]~lot[i-1]の間でいつでも重複しているものがあれば boolean is = true;により上書きされて、isTrue()はtrueが返されると思ったのですがそうはならないのでしょうか。

すいません。いろいろ手は尽くしたのですがどうしても分からなくて質問させていただきました。
ご回答いただけますとうれしいです><b

投稿日時 - 2011-06-05 16:46:19

QNo.6788123

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

重複する数字を見つけたら、そこで判定を終了しないと誤動作します。


初心者ということなので、聞き流してもらっても構わないのですが、気になったことをいくつか。


●乱数生成をメインの流れの中で行っていますが、メソッドで独立させるのがいいです。
(プログラムの流れがわかりやすくなります)

●メソッドをすべてstaticにしていますが、インスタンスメソッドにしたほうが、後々のことを考えるといい場合が多いです。

●isTrueメソッドのようにメソッド外の変数を使う構造はやめましょう。メソッドの独立性がなくなりますし、デバッグが困難になりがちです。


●今回のような乱数なら、配列に0から9までを入れ、シャッフルするのが楽です。(標準クラスの何かにメソッドがありました)


以上です。

投稿日時 - 2011-06-05 18:49:04

お礼

ありがとうございました。
お教えいただいた通り、配列に0から9までを入れ、シャッフルする方法でやるともっとシンプルにできました><b
ご回答いただきまして本当にありがとうございます^^
また何か質問させていただいたときに、機会があればまたご教授の程よろしくおねがいいたします><
本当にありがとうございました^^

投稿日時 - 2011-06-06 09:34:18

あなたにオススメの質問