2017-06-01 3 views
1

私は偽の小さなピンクラッキングスクリプトで作業しようとしていますが、何かが間違っていて、それが私を不満にしています。それは4つの数字を無作為に選び、4つの他の数字と照合しますが、なんらかの理由で数字が推測された後、それ以上は印刷されません。Rubyは変数を印刷しません

#RubyCodeStart 

pass1 = 4 
pass2 = 9 
pass3 = 2 
pass4 = 8 
guess = 0 
flag1 = 0 
flag2 = 0 
flag3 = 0 
flag4 = 0 
loop do 
    if flag1 == 0 
     crack1 = rand(0..9) 
    end 
    if flag2 == 0 
     crack2 = rand(0..9) 
    end 
    if flag3 == 0 
     crack3 = rand(0..9) 
    end 
    if flag4 == 0 
     crack4 = rand(0..9) 
    end 
    if crack1 == pass1 
     crack1 = pass1 
     flag1 = 1 
    end 
    if crack2 == pass2 
     crack2 = pass2 
     flag2 = 1 
    end 
    if crack3 == pass3 
     crack3 = pass3 
     flag3 = 1 
    end 
    if crack4 == pass4 
     crack4 = pass4 
     flag4 = 1 
    end 
    guess += 1 
    puts "#{crack1} \| #{crack2} \| #{crack3} \| #{crack4} === Guess \# #{guess}" 
# if crack == pass 
#  break 
# end 
end 
sleep(30) 

私はうまく動作せず、見つからないと印刷することを拒否します。必要に応じてデータを追加します。

出力:

あなたはループの外あなたの crack変数を宣言する必要が
8 | 0 | 6 | 1 === Guess # 1 
4 | 6 | 1 | 8 === Guess # 2 
| 1 | 3 | === Guess # 3 
| 1 | 5 | === Guess # 4 
| 3 | 9 | === Guess # 5 
| 3 | 3 | === Guess # 6 
| 5 | 4 | === Guess # 7 
| 3 | 4 | === Guess # 8 
| 4 | 3 | === Guess # 9 
| 0 | 6 | === Guess # 10 
| 3 | 8 | === Guess # 11 
| 4 | 5 | === Guess # 12 
| 2 | 4 | === Guess # 13 
| 8 | 7 | === Guess # 14 
| 8 | 4 | === Guess # 15 
| 9 | 5 | === Guess # 16 
| | 7 | === Guess # 17 
| | 5 | === Guess # 18 
| | 7 | === Guess # 19 
| | 7 | === Guess # 20 
| | 7 | === Guess # 21 
| | 1 | === Guess # 22 
| | 2 | === Guess # 23 
| | | === Guess # 24 
| | | === Guess # 25 
| | | === Guess # 26 
| | | === Guess # 27 
| | | === Guess # 28 
| | | === Guess # 29 
| | | === Guess # 30 
| | | === Guess # 31 
| | | === Guess # 32 
| | | === Guess # 33 
| | | === Guess # 34 
| | | === Guess # 35 
| | | === Guess # 36 
| | | === Guess # 37 
| | | === Guess # 38 
| | | === Guess # 39 
| | | === Guess # 40 
+0

FYI: 'crack1 == pass1'のテストで' crack1 = pass1'を設定するのは意味がありません。彼らがすでに等しい場合、それらを再び等しくすることは何もしません。 – meagar

+0

変数名の代わりに配列を使用して、数字を増やしたい場合があります。例えば、 'pass = [4,9,2,8]'と 'pass [0]'〜 'pass [3]'を参照してください。 –

答えて

1

:なぜあなたのコードが働いていなかった

# other variables 

crack1 = 0 
crack2 = 0 
crack3 = 0 
crack4 = 0 

loop do 
    # loop code 
end 

loopでは、元のスコープのために、crackの変数が消去されるためです。すべての反復で、crackの各変数はrand(0..9)またはnilのいずれかに設定されます。

if flag1 == 0 
    crack1 = rand(0..9) 
end 

crack1は、いくつかのランダムな番号に設定されますので、あなたは後でその値を印刷することができますが、flag10ないと、その後、crack1nilに設定された後、そう

、 。ことを除いて、これはまったく同じ出力を作成します

pass = [4, 9, 2, 8] 
flag = [0, 0, 0, 0] 
crack = [0, 0, 0, 0] 
guess = 0 

until crack == pass do 
    (0..3).each do |i| 
    crack[i] = rand(0..9) if flag[i] == 0 
    flag[i] = 1 if crack[i] == pass[i] 
    end 

    guess += 1 
    puts "#{crack.join(" | ")} === Guess \# #{guess}" 
end 


あなたの質問にアカウントにコメントを取る(および他のいくつかのヒントを追加する)、ここにあなたのコードビットを乾燥する一つの選択肢ですパスワードが解読されたらループを終了します。

関連する問題