【问题标题】:Ruby nomethoderror for multidimensional array多维数组的Ruby nomethoderror
【发布时间】:2016-06-07 16:51:47
【问题描述】:

我正在开发 Ruby 程序,我正在创建单词搜索谜题。我有 10x10 双数组“arr”,我使用一种方法来查找随机起始位置(例如:arr[5][9]),然后我选择了一个方向,但我遇到了超出范围的问题。

示例:需要放入拼图中的单词之一是“狗”。我得到起始位置arr[5][9] 并遍历“狗”,一次将一个字母水平放置在数组中。所以arr[5][9] 是“d”,arr[5][10] 是“o”,但是当它尝试放置“g”时,我的程序崩溃并且我收到错误消息“no method [] for nil: nil class (no method error)”。我知道这是因为它超出了界限,但我怎样才能阻止它这样做呢?谢谢你

编辑:如果单词不适合,我希望我的程序选择一个新的起始位置,直到单词适合。我也想防止它越界

【问题讨论】:

  • 您是否希望它返回一个错误,指出单词太长无法放置?你想让狗的g在最左边的索引上吗?如果您可以发布一些代码和您尝试过的内容。

标签: arrays ruby multidimensional-array


【解决方案1】:

如果你有一个 10 x 10 的数组,那么所有的索引都应该在 0 到 9 之间。你需要保证单词在任一维度上都不会超出数组的边界。

所以如果你有一个词dog,例如,那么起始索引必须在0到7之间。

这是一个你可以使用的方法,它被调用的例子:

2.3.0 :001 > def random_x_value(word)
2.3.0 :002?>   rand(10 - word.length)
2.3.0 :003?>   end
 => :random_x_value
2.3.0 :004 > 16.times { print "#{random_x_value('dog')}  "}; puts
4  1  5  1  5  6  3  0  4  5  4  5  2  3  3  5
 => nil

[我之前用过(0..(10-word.length)).to_a.sample,后来发现可以用rand(10 - word.length),更简单更清晰。]

【讨论】:

  • 我已将答案编辑为使用rand,这比我最初使用的....to_a.sample 方法更简单、更清晰。
【解决方案2】:
def random_position(nrows, ncols, word)
  c = ncols - word.size
  rand(nrows * c).divmod(c)
end

20.times { p random_position(10, 10, 'dog') }
[5, 6]
[4, 4]
[9, 4]
[1, 6]
[8, 1]
[8, 6]
[5, 6]
[1, 6]
[1, 1]
[3, 0]
[5, 3]
[1, 5]
[6, 3]
[4, 2]
[1, 5]
[1, 3]
[4, 1]
[7, 2]
[1, 2]
[7, 1]

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2012-12-05
    • 1970-01-01
    • 2012-05-02
    • 2018-02-25
    • 2011-11-29
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多