Ruby 不会打印变量

Ruby wont print variable

我一直在尝试制作一个假的小 pin-cracking 脚本,但出了点问题,这让我很沮丧。它随机抽取 4 个数字,并将它们与其他 4 个数字进行比较,但由于某种原因,在猜到这些数字后,它不再打印它们。

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

我所做的一切都不起作用,而且它拒绝打印它,直到它被发现。如果需要我会添加数据。

输出:

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

您需要在循环外声明 crack 变量:

# 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 将被设置为某个随机数,因此您稍后可以打印它的值,但是一旦 flag1 不是 0,那么 crack1 将设置为 nil.


考虑到对您的问题的评论(并添加一些其他提示),这里有一个选项可以让您的代码稍微干燥:

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

这将创建完全相同的输出,除了它在密码被破解后退出循环。