2016-11-11 2 views
1

Как бы я в основном говорю в ELSIF ниже «если букв == (письмо, содержащихся в массиве„letterbank“) ===> печать письма»ELSIF письма, которое содержится в массиве

def hide_or_not(an_array, a_guess) 
    an_array.each do |letter| 
     if a_guess == letter 
     print a_guess 
     elsif SOMETHING HERE 
     print letter 
     else 
     print "_" 
     end 
    end 
    end 

предполагающих метод получает a_guess, который представляет собой букву в виде строки и массив из отдельных букв. Когда письмо угадывается, по-видимому, или же «_» печатается

an_array = ["r", "i", "c", "s", "h", "a", "w"] 
letter_guess = "r" 

то жаль, что я также при условии, что я должен сохранить каждое письмо догадывался, поэтому я хочу, чтобы где-то inlcude в letterbank. Я не знаю, если я должен сделать это ниже moethod или внутри него ... (уже угадываются буквы)

letterbank = ["s", "w", "t", "j"] 

так что в этом случае, я хотел бы ниже, чтобы напечатать ... спасибо!

+2

'letterbank.include? letter' – mudasobwa

+0

Подсказка: Строки - это массивы символов. Создание литеральных массивов символов бесполезно. – tadman

ответ

0

Один из способов - использовать хеш вместо массива. Скопируйте значения letterbank в хэш-карту. Буква 1 (или true), чтобы указать, что письмо существует.

def hide_or_not(an_array, a_guess) 
    letterbank = ["r", "s", "w", "t", "j"] 
    letterhash = {} # define a new hash 
    letterbank.each { |c| letterhash[c] = 1 } # copy array values into the hash 

    an_array.each do |letter| 
    if (a_guess == letter) 
     print a_guess 
    elsif letterhash[letter] # check if the letter is in the hash 
     print letter 
    else 
     print "_" 
    end 
end 

конец

an_array = ["r", "i", "c", "s", "h", "a", "w"] 
hide_or_not(an_array, 'r') 
1

Это решение использует строку вместо массива, но может так же легко использовать массивы. (Добавление символов в строку и печать после завершения итерации дает некоторую дополнительную гибкость при печати, например, позволяя использовать puts).

class LetterGuesser # Hangman 
    def initialize(word) 
    @word = word; 
    @guessed_letters = ''; 
    end 

    def guess_letter(letter) 
    @guessed_letters << letter if [email protected]_letters.include?(letter) 
    current_guesses = '' 
    @word.each_char do |char| 
     if guessed_letters.include?(char) 
     current_guesses << letter 
     else 
     current_guesses << '_' 
     end 
    end 
    puts current_guesses 
    end 
end 

game = LetterGuesser.new('test') 
game.guess_letter('e') 
+1

Использование класса - хороший способ его инкапсуляции. Здесь стоит отметить, что этот код можно значительно сжать при более эффективном использовании Enumerable и других функций Ruby, таких как 'if', которые возвращают значение для уменьшения дублирования. – tadman

+0

@tadman: thumsbup: может определенно сократить его, но в то же время хотел сохранить ответ в стиле вопроса, чтобы он мог легко его понять и при необходимости скорректировать (например, добавив 'elsif', который я не был обязательно его цель). – Levsero

1

Самое минимальное решение здесь использовать оголенные струны и String#tr сделать замену для вас:

def hide_or_not(word, guesses) 
    word.tr('^' + guesses, '_') 
end 

Где вы можете увидеть это работает так:

hide_or_not('rickshaw', 'r') 
# => "r_______" 

hide_or_not('rickshaw', 'rswtj') 
=> "r___s__w" 

Массивы и строки часто работают в основном теми же способами, что и в:

# Define an empty string 
guesses = '' 

# Append a character to the string 
guesses << 'r' 
Смежные вопросы