将字符串的每个字符显示为下划线,每个下划线ruby之间有一个空格

时间:2017-03-09 21:24:06

标签: ruby

我正在尝试创建一个单词猜谜游戏,它将一个字符串作为输入。我发现很难尝试将字符串的每个字符显示为下划线,并在它们之间留有空格。例如,单词“cookie”将显示为_ _ _ _ _ _,每个下划线表示字符串的每个字符。 我尝试过使用scan和tr但是还没能让它工作。我有以下代码:

class Game
  attr_reader :word
  attr_accessor :guess_counts

  def initialize(word)
    @word = word
  end

  def guesses_available
    @guess_counts = @word.length
  end

  def display
     print @word.tr_s('a-z','_ ')
  end

end


# user interface

puts "Please enter a word to initialize the Guessing The Word game"
  secret_word = gets.chomp

  game = Game.new(secret_word)

puts "you have #{@guess_counts} attemps left"
game.display 

4 个答案:

答案 0 :(得分:4)

既然你不关心实际的角色,但想把每个角色都呈现为_,我会这样做:

Array.new("cookie".length, '_').join(' ')
#=> "_ _ _ _ _ _"

或者:

('_' * "cookie".length).split(//).join(' ')
#=> "_ _ _ _ _ _"

"cookie"替换为您的字符串变量...

答案 1 :(得分:3)

我假设您最终会想要存储用户的猜测并仅显示他们猜测过的字母。试试这个:

guesses = [] #letters guessed go into this array
@word.chars.map { |c| guesses.include?(c) ? c : '_' }.join(' ')

如果你只是试图为每个字母显示下划线而没有任何其他逻辑,你可以这样做:

@word.chars.map { |c| '_' }.join(' ')

如果您想对用户猜到的单个字母采取行动,您可以这样做:

letter = 'a' #or whatever letter you get from the user
@word.chars.map { |c| letter == c ? '-' : '_' }.join(' ')

这是一个基于第一个代码段的简单但功能齐全的hangman示例。基本上我所做的就是在一个循环中运行第一个片段,每次都获得用户输入,做一些逻辑,看看他们是否猜到了正确的字母,并跟踪剩下的尝试次数。

@word = 'boop'

guesses = [] #letters guessed go into this array
tries = 5

while tries > 0
  guess = gets[0]
  if !@word.include? guess
    puts "wrong."
    tries -= 1
    next
  end
  guesses << guess
  display = @word.chars.map { |c| guesses.include?(c) ? c : '_' }.join(' ')

  puts display

  if !display.include? '_'
    puts 'you win!'
    break
  end

end

答案 2 :(得分:1)

您使用tr走在正确的轨道上,但您需要使用反转运算符^而不是翻转匹配的猜测。这是您需要的核心功能:

def underscored(word, guesses)
  word.tr('^' + guesses, '_').chars.join(' ')
end

例如:

underscored('transistor', 'aebr')
# => "_ r a _ _ _ _ _ _ r"

如果您将每个猜到的字母附加到字符串,例如guesses << guess,那么它与tr完全一致。记住一个字符串基本上是一个字符数组,所以不要为这些事情制作一个显式数组。

答案 3 :(得分:0)

如果你想跟踪@guess_counts,我会考虑初始化它并在每次计数后添加一个,并在告诉他们有多少初步猜测时只调用game.guesses_available。