Почему я получаю «неявное преобразование false в строку» - PullRequest
0 голосов
/ 19 января 2019

Я новичок в программировании и в качестве забавного небольшого упражнения попытался сделать девиз игры в слова, но на данный момент это работает, только если вы ответите правильно с первого раза.Я хочу, чтобы программа сказала мне, сколько букв в слове, которое я угадал, находится в правильном ответе, но не то, что это за буквы.Я думал, что у меня есть, но «если answer.include? Word_array [iterations] == true» выдает мне ошибку, которая говорит, что неявное преобразование alse в строку

def jotto()
    file_content = File.readlines("words.txt")
    i = 0
    new_array = []
        while i < file_content.length 
            temp_str = file_content[i]
            if temp_str.length == 4
                new_array << temp_str
            end
            i = i + 1
        end

    answer = new_array[rand(new_array.length)]

    puts(answer)

    puts "Guess the secret word"

    word = gets

    word_array = []

    word_array << word

    i = 0

        while answer != word
            iterations = 0
            w = 0
            while iterations <= word.length

                if answer.include? word_array[iterations] == true
                    w = w + 1
                end
                iterations = iterations + 1
            end
        puts("That's not correct but there are " + w + " of the same letters")
        end
    print("Yes! " + answer + " is the right answer!")

end

jotto ()

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я думаю, что Tiw указал на вашу первую проблему, но их несколько.

Вот обновленная версия вашего кода с некоторыми комментариями, объясняющими, почему было сделано изменение.

Я также включилболее рубиновая версия.

def jotto()
    file_content = File.readlines("words.txt")
    i = 0
    new_array = []
        while i < file_content.length 
            temp_str = file_content[i].chomp  #added
            if temp_str.length == 4
                new_array << temp_str
            end
            i = i + 1
        end

    answer = new_array[rand(new_array.length)]

    puts(answer)

    puts "Guess the secret word"

    # you need to get the word from the user inside the while loop.
    # word = gets

    # word_array = []

    # word_array << word  # This adds the word to an array of strings .. you want to turn the string into an array of characters

    #i = 0  # not used
        # added
        word = nil
        while answer != word
            #added
            word = gets.chomp
            word_array = word.chars # see comment above
            iterations = 0
            w = 0
            while iterations < word.length  # was <=

                if answer.include? word_array[iterations]  # == true
                    w = w + 1
                end
                iterations = iterations + 1
            end
        puts("That's not correct but there are " + w.to_s + " of the same letters") if word != answer # there are better ways.
        end
    print("Yes! " + answer + " is the right answer!")

end
jotto()

Более рубиновый способ ведения дел

def jotto()
    answer_list = File.readlines("words.txt").map { |line| line.strip } # map each read line into an array of strings without any whitespace
    answer = answer_list.sample  # get a random element 
    puts answer  #for debug only
    puts "Guess the secret word"

    loop do
        guess = gets.strip 
        break if guess == answer  # exit the loop if correct 
        # map each char in answer to an array of true/false depending on if it matches the guess position
        matched_positions = answer.chars.each_with_index.map { |char ,index| char == guess[index] } 
        number_of_matching_positions = matched_positions.count(true) # count the number of true entires (positions that matched)
        puts("That's not correct but there you did match #{number_of_matching_positions} positions - try again")
    end
    puts "Yes! " + answer + " is the right answer!"
end

jotto()
0 голосов
/ 19 января 2019

Грамматическая ошибка,

if answer.include? word_array[iterations] == true

является избыточным, а также не цитируется правильно.

То, что вы пытались было:

if answer.include?(word_array[iterations]) == true

Но Руби читает это как:

if answer.include? (word_array[iterations] == true)

Но правильный путь:

if answer.include? word_array[iterations]

Не нужно проверять, верно ли это, поскольку include? даст вам true или false и уже может применяться к if.

Например:

"abcd".include? 'a'
#=> true
"abcd".include? 'f'
#=> false
"abcd".include?('a') == true
#=> true

Как вы можете видеть, когда вы сравниваете true == true, вы все равно получаете true, так зачем их сравнивать?

Об ошибке преобразования nil, я думаю, это потому что:

while iterations <= word.length

должно измениться на

while iterations < word.length

Поскольку максимальный индекс строки - это длина строки минус один. (От 0 до длины-1).

Кроме того, gets будет вводить дополнительный \n с ним, замените его на gets.chomp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...