2016-06-07 4 views
1

나는 wordsearch puzzle을 만들고있는 Ruby 프로그램을 만들고있다. 나는 10x10 두 배 배열 "arr"가 있고 무작위 출발 위치 (예 : arr[5][9])를 찾아내는 방법을 사용한다, 그러나 나는 방향을 선택한다 그러나 나가 경계를 나가는 곳에 문제가있다.다차원 배열을위한 Ruby nomethoderror

예 : 퍼즐에 넣어야하는 단어 중 하나가 "개"입니다. 나는 시작 위치 arr[5][9]을 얻고 한 번에 한 글자 씩 가로로 배열에 배치하여 "dog"를 반복합니다. 그래서 arr[5][9]은 "d"이고, arr[5][10]은 "o"입니다. 그러나 "g"를 넣으려고하면 프로그램이 충돌하고 "no method [] for nil: nil class (no method error)"이라고 말하는 오류가 발생합니다. 나는 그것이 경계를 벗어나기 때문에 이것이라고 알고 있지만, 어떻게하면 그것을 막을 수 있습니까? 고마워요.

편집 : 단어가 맞지 않으면 단어에 맞을 때까지 새로운 시작 위치를 선택해야합니다. 또한 범위를 벗어나는 것을 막으려 고합니다

+1

너무 길기 때문에 단어를 놓을 수 없다는 오류를 반환 하시겠습니까? 개 g이 가장 왼쪽의 색인에 오길 원합니까? 코드를 게시하고 시도한 내용을 게시 할 수 있습니다. –

답변

1

10 x 10 배열의 경우 모든 인덱스는 0에서 9 사이 여야합니다. 단어가 배열의 범위를 초과하지 않도록 보장해야합니다. 치수.

은 그래서 당신은 단어를 이있는 경우, 예를 들어, 다음 시작 인덱스가 있어야합니다 당신이 그것의 예제와 함께,이 사용할 수있는 방법은 호출되는 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)를 사용할 수 있다는 것을 깨달았다.]

+0

나는 원래 사용했던'.... to_a.sample' 접근법보다 더 간단하고 명확한'rand' 사용법을 편집했습니다. –

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]