2017-06-01 2 views
1

J'ai essayé de travailler sur un faux script, mais quelque chose ne va pas et ça me rend frustré. Il randomise 4 nombres et les compare à 4 autres nombres, mais pour une raison quelconque, une fois les nombres devinés, il ne les imprimera plus.Ruby n'imprime pas de variable

#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) 

Rien de ce que je fais fonctionne, et il refuse de l'imprimer, il passe être trouvé. Je vais ajouter des données si nécessaire.

Sortie:

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: Cela n'a aucun sens de définir 'crack1 = pass1' dans un test pour' si crack1 == pass1'. S'ils sont déjà égaux, les rendre égaux ne fait rien. – meagar

+0

Vous pouvez utiliser des tableaux au lieu de noms de variables avec des nombres incrémentés. Par exemple, 'pass = [4,9,2,8]' et les appelle 'pass [0]' à 'pass [3]'. –

Répondre

1

Vous devez déclarer vos crack des variables en dehors de votre boucle:

# other variables 

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

loop do 
    # loop code 
end 

Pourquoi votre code ne fonctionnait pas? Parce que dans chaque loop, les variables crack sont effacées, en raison de leur étendue d'origine. À chaque itération, chaque variable crack est définie sur rand(0..9) ou nil.

Ainsi, après

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

crack1 sera réglé sur un nombre aléatoire, et donc vous serez en mesure d'imprimer sa valeur plus tard, mais une fois flag1 n'est pas 0, alors crack1 sera mis à nil .


Compte tenu des commentaires sur votre question (et en ajoutant quelques autres conseils), voici une option qui sécheront votre code un peu:

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 

Cela crée la même sortie exacte, sauf que il quitte la boucle une fois que le mot de passe a été craqué.