2015-11-27 3 views
0

Я относительно новый студент Ruby, и хотя я могу сказать, что это никогда не будет языком, который я предпочитаю, мне хотелось бы хотя бы понять его, потому что это язык шлюза. Для моего проекта нам поручено решить лабиринт, переданный в многомерный массив. Мы не изучили рекурсию или какие-либо передовые методы. Это обзор. Моя конкретная проблема в моем коде заключается в том, что в моем while loop Я получаю сообщение об ошибке для значения, которое я передаю в свой массив.Ruby programming Почему цикл While генерирует (NoMethodError)?

Р.Б.: 60 в `: неопределенный метод` [] 'для ноля: NilClass (NoMethodError) из -e: 1: в `нагрузки'

Я сделал исследование в течение часа или около того и это означает, что значение, которое я передаю в мой массив, равно нулю, но я присвоил ему значение. Мой код ниже. Я выделил его для переменной row, которая вызывает ошибку, но я присвоил значение row, и это проходит через штраф. это когда я использую row+=1, что он бросает ошибку, я думаю. (Хотя я мог быть неверным.) Я также спрашиваю об этом моего учителя, но он не ответил, поэтому я думал, что я отправлю его здесь, а также в надежде найти решение этой ошибки.

maze=[] 

def main_menu (options) 
options.each_with_index do |option, index| 

printf("%-s. %-s\n", "#{index+1}", "#{option}") 
end 
print "Please make a selection:" 
main_selection=gets.to_i 
return main_selection 
end 

menu_selection=["Maze 1", "Maze 2", "Maze 3", "Maze 4", "Maze 5", "Maze 6", "Maze 7", "Maze 8", "Maze 9", "Maze 10", "Quit"] 
user_selection=0 
path=1 
row=0 
column=0 
while user_selection != menu_selection.length 
user_selection=main_menu(menu_selection) 
puts user_selection 
case user_selection 
when 1 
    maze.clear 
    mz_file=File.open("maze1.mz") 

    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    mz_file.close 
    maze.each do |row| 
    puts row.join 
    end 

    maze.each_index do |row| 
    column = maze[row].index "F" 
    if column 
     maze[row+1][column]=0 
     maze[row-1][column]=0 
     maze[row][column+1]=0 
     maze[row][column-1]=0 
    end 
    end 
    maze.each do |row| 
    puts row.join 
    end 

    #WHILE LOOP FOR MAZE 

    while row <=maze[0].length 
    column=0 
    while column <= maze.length 
     if maze[row][column]== 0 
     maze[row+1][column]==path 
     maze[row-1][column]==path 
     maze[row][column+1]==path 
     maze[row][column-1]==path 
     end 
     column=column+1 
    end 
    row=row+1 
    end 
    maze.each do |row| 
    puts row.join 
    end 
when 2 
    maze.clear 
    mz_file=File.open("maze2.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 3 
    maze.clear 
    mz_file=File.open("maze3.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 4 
    maze.clear 
    mz_file=File.open("maze4.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 5 
    maze.clear 
    mz_file=File.open("maze5.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 6 
    maze.clear 
    mz_file=File.open("maze6.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 7 
    maze.clear 
    mz_file=File.open("maze7.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 8 
    maze.clear 
    mz_file=File.open("maze8.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 9 
    maze.clear 
    mz_file=File.open("maze9.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
when 10 
    maze.clear 
    mz_file=File.open("maze10.mz") 
    while !mz_file.eof? 
    line=mz_file.gets.chomp.split("") 
    maze.push line 
    end 
    maze.each do |row| 
    puts row.join 
    end 
    mz_file.close 
end 
end 

ответ

4

У вас здесь много проблем. Ваши отступы ошибочны, что поможет вам выявить некоторые проблемы, такие как незамкнутые петли/блоки (что является проблемой в коде, который вы опубликовали). Вы затеняете переменную row несколько раз с индексами цикла, вы не можете удалить пустое пространство перед проверкой ответов на строки (что почти наверняка помещает в ваш массив nil s), вы используете == для того, что кажется назначением вокруг 50 строк в вашу программу, вы используете <= для тестирования индекса массива по длине.

Попробуйте протестировать свои небольшие задачи, например, прочитать строку ввода и разбить ее, в irb. Это дает вам прямую и немедленную обратную связь, если есть проблемы с тем, как вы занимаетесь бизнесом. Вы также должны рассмотреть возможность использования редактора или IDE, которые помогут вам с отступом и сделать некоторые проверки здравомыслия по таким вещам, как ==, где вам кажется, что хотите назначить.