河内塔,Ruby 有条件

Towers of Hanoi, Ruby conditional

我的第一个 if 条件遇到了问题,它检查以确保添加的新片段小于 under/before 它的片段。在添加之前,我的河内塔游戏运行良好。下面是我的代码:

arrays = [[5,4,3,2,1],[],[]]
win = false

while win != true
   puts "Choose a top piece: (1, 2, 3) "
   top = gets.to_i
   puts "Which stack to place this piece? (1, 2, 3)"
   stack = gets.to_i

   if (arrays[stack-1] == nil) ||
      (arrays[stack-1][arrays[stack-1].count-1] > arrays[top-1][arrays[top-1][arrays[top-1].count]])
     arrays[stack-1].push(arrays[top-1].pop)
   else
     "You need to follow the rules."
   end

   print arrays
   if arrays[1] == [5,4,3,2,1] || arrays[2] == [5,4,3,2,1]
     print "You're a winner!"
     win = true
   end
end
~

下面是我得到的错误。如何以简洁的方式执行检查和处理我的 nil 值数组?

towers_hanoi:13:in `[]': no implicit conversion from nil to integer (TypeError)
        from towers_hanoi:13:in `<main>'

使用empty?方法判断数组是否为空。不过,仅供参考,如果您想查看变量是否具有 nil 值,请使用 nil?

此外,last 方法在这里会有很大帮助,立即从输入中减去 1 将使代码更具可读性。试试这个:

arrays = [[5,4,3,2,1],[],[]]
win = false

while win != true
   puts "Choose a top piece: (1, 2, 3) "
   stack_from = gets.to_i - 1
   puts "Which stack to place this piece? (1, 2, 3)"
   stack_to = gets.to_i - 1

   if (arrays[stack_to].empty?) ||
      (arrays[stack_to].last > arrays[stack_from].last)
     arrays[stack_to].push(arrays[stack_from].pop)
   else
     "You need to follow the rules."
   end

   print arrays
   if arrays[1] == [5,4,3,2,1] || arrays[2] == [5,4,3,2,1]
     print "You're a winner!"
     win = true
   end
end

那个 if 语句中发生了很多奇怪的事情。

绝对使用Array#empty?来检查数组是否为空。空数组不是零。

其次,你的一些数组括号太复杂了,我不确定你想在这里完成什么,但在某些情况下你肯定会检查 nil > number:

(arrays[stack-1][arrays[stack-1].count-1] > arrays[top-1][arrays[top-1][arrays[top-1].count]])

我怀疑这就是您要尝试执行的操作(因为它会引发错误)。我会花一点时间考虑您的逻辑和重构。在 Towers of Hanoi 中,您只需要担心检查您正在移动的棋子是否小于您要移动到的堆栈中的最后一个棋子(代表顶部)。

使用 Array#last,您将获得更简单的解决方案。