まず、answer
の初期状態は、[0, 0, 0]
です。
ランダム値はサイコロと同じ1~6のどれかになります。
外側のforループは、for (int i = 0; i < answer.length; i++)
なので、最初はanswer[0]
にランダム値を入れます。
5
が入ったとすると、answer
は[5, 0, 0]
になります。
内側のループはfor (int j = i - 1; j >= 0; j--)
ですが、
i = 0
の時は最初の時点でj >= 0
を満たさないので、
forループに入らずに進み、flag=false
のままなのでdo while
も抜けて
次に進みます。
次は、i = 1
になるのでanswer[1]
にランダム値を入れます。
4
が入ったとすると、answer
は[5, 4, 0]
になります。
内側のforループは、i = 1
の時はfor (int j = 1 - 1; j >= 0; j--)
になりますので、1回だけ、つまり
自分より前の要素answer[0]
とだけ同じかどうか確かめます。
この場合は5
と4
ですから、同じでないので、flag=false
のままになり、
do while
を抜けて次に進みます。
★目印
次は、i = 2
になるのでanswer[2]
にランダム値を入れます。
5
が入ったとすると、answer
は[5, 4, 5]
になります。
内側のforループは、i = 2
の時はfor (int j = 2 - 1; j >= 0; j--)
になりますので、自分と自分より前の要素answer[1]
とanswer[0]
と順に確かめます。
この場合は、answer[2] == answer[1]
は等しくありませんが、
answer[2] == answer[0]
は等しいので、if文の中に入ります。
if文の中では、flag=true
にして、answer[2]
にランダム値を入れます。
2
が入ったとすると、answer
は[5, 4, 2]
になります。
flag=true
になったので、do
の次(「★目印」)に戻ってからもう一度同じことをします。
i = 3
になると、外側のfor文の条件を満たさなくなりますので、ループが終了し
すべての計算が終了します。
長くなりましたが、このようにして、値がかぶらないようにしています。
ただ、正直あまり良いコードでは無いですね。
randomするところが2箇所にあったりループが複雑すぎる気がします。
例:
lang
1loop1:
2for (int i = 0; i < answer.length;) {
3 answer[i] = (int)(Math.random() * 6 + 1);
4 for (int j = i - 1; j >= 0; j--) {
5 if (answer[i] == answer[j]) {
6 continue loop1; // かぶっていたら外側のループの最初に戻る
7 }
8 }
9 i++; // かぶっていないときだけ次に進む
10}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/10 03:10