2016-06-07 75 views
1

我正在Ruby程序中创建字词搜索拼图。我有10x10双数组“arr”,我用一种方法来找到一个随机的起始位置(例如:arr[5][9]),然后我选择一个方向,但我有问题在哪里出界。多维数组的红宝石nomethoderror

示例:需要放置在拼图中的单词之一是“狗”。我得到起始位置arr[5][9],并重复“狗”,一次一个字母地放在数组中。因此arr[5][9]是“d”,arr[5][10]是“o”,但是当它尝试放置“g”时,我的程序崩溃,并且出现错误说“no method [] for nil: nil class (no method error)”。我知道这是因为它出界了,但我怎么能阻止它这样做呢?谢谢

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

+1

您是否希望它返回一个错误,指出该词由于太长而无法放置?你想让狗的g位于最左边的索引?如果你可以发布一些代码和你试图做的。 –

回答

1

如果你有一个10×10的数组,那么所有的索引应该在0到9之间。你需要保证这个词不会超过数组的界限尺寸。

所以,如果你有一个字,例如,然后开始索引必须是7

这里介于0和被调用,您可以使用这一点,这样的例子方法:

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)这是简单和清晰。]

+0

我编辑过使用'rand'的答案,它比我原来使用的'.... to_a.sample'方法更简单,更清晰。 –

0
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]