Как заменить соответствующие символы в строке? (Рубин) - PullRequest
0 голосов
/ 08 июня 2019

Я создаю игру палача и не знаю, как заменить подчеркивания в hidden_word (String) соответствующими буквами в player_input (Array).Есть идеи, что мне делать?Заранее спасибо, я ценю это!

def update
  if @the_word.chars.any? do |letter|
     @player_input.include?(letter.downcase)
     end
     puts "updated hidden word" #how to replace underscores?
  end
  puts @hidden_word
  puts "You have #{@attempts_left-1} attempts left."
end

У меня есть две строки: the_word и hidden_word и массив, player_input.Всякий раз, когда игрок выбирает букву, которая совпадает с словом, скрытое слово должно обновляться.

Например

the_word = "RUBY"

hidden_word = "_ _ _ _ "

Игрок выбирает" g ", все еще скрытое слово" _ _ _ _ "

Игрок выбирает" r ", обновления скрытого слова" R _ _ _ "

Вот остаток кода:


class Game
    attr_reader :the_word

    def initialize
        @the_word = random_word.upcase
        @player_input = Array.new
        @attempts_left = 10
    end

    def random_word
        @the_word = File.readlines("../5desk.txt").sample.strip()
    end

    def hide_the_word
        @hidden_word = "_" * @the_word.size
        puts "Can you find out this word? #{@hidden_word}"
        puts "You have #{@attempts_left} attempts left."
        puts @the_word #delete this
    end

    def update
        if @the_word.chars.any? do |letter|
            @player_input.include?(letter.downcase)
            end
            puts "updated hidden word" #how to replace underscores?
        end
        puts @hidden_word
        puts "You have #{@attempts_left-1} attempts left."
    end

    def guess_a_letter
        @player_input << gets.chomp
        puts "All the letters you have guessed: #{@player_input}"
    end

    def has_won?
        if !@hidden_word.include?("_") || @player_input.include?(@the_word.downcase)
            puts "You won!"
        elsif @attempts_left == 0
            puts "You lost..."
        end
    end

    def game_round #the loop need fixin
        puts "Let's play hangman!"
        hide_the_word
        while @attempts_left > 0
            guess_a_letter
            update
            @attempts_left -= 1 #fix this
            has_won?
            break if @player_input.include?("q") #delete this
        end
    end
end


new_game = Game.new
new_game.game_round

Ответы [ 3 ]

1 голос
/ 08 июня 2019

Вот код, который должен помочь вам. Соберите угаданные буквы в массиве. Затем сопоставьте символы слова с символом, если он был угадан, или с подчеркиванием.

word = "RHUBARB"
guessed_letters = ['A', 'R', 'U']
hidden_word = word.chars.map { |c| guessed_letters.include?(c) ? c : '_' }.join
# => "R_U_AR_"
0 голосов
/ 08 июня 2019

Один из вариантов - использовать регулярное выражение:

@hidden_word = @the_word.gsub(/[^#{@player_input.join('')}\s]/i, '_')
0 голосов
/ 08 июня 2019

Я не уверен насчет downcase, потому что вы тоже использовали uppercase.

Выберите только один регистр букв.

Но это будет работать для вас:

def update
  @the_word.each_char.with_index do |letter, index|
     @hidden_word[index] = letter if @player_input.include?(letter.downcase)
  end

  puts @hidden_word
  puts "You have #{@attempts_left-1} attempts left."
end

Сравнивает каждую букву секретного слова с введенными пользователем данными и изменяет подчеркивание в скрытом слове по совпадению.

Здесь я использовал String#each_char, String#[]=, Enumerator#with_index

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