2016-06-07 109 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]