[英]display each character of a string as an underscore with a space between each underscore 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
由于您并不关心实际字符,而是希望将每个字符都表示为_
,因此我将执行以下操作:
Array.new("cookie".length, '_').join(' ')
#=> "_ _ _ _ _ _"
要么:
('_' * "cookie".length).split(//).join(' ')
#=> "_ _ _ _ _ _"
用您的字符串变量替换"cookie"
...
我假设您最终将要存储用户的猜测并仅显示他们猜测的字母。 尝试这个:
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(' ')
这是一个基于第一个代码段的简单但功能齐全的子手示例。 基本上,我正在做的是循环运行第一个代码段,并每次获取用户输入,做一点逻辑,看他们是否猜对了正确的字母,并跟踪剩余的尝试次数。
@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
您使用tr
在正确的轨道上,但是您需要使用反转运算符^
来不翻转匹配的猜测。 这是您需要的核心功能:
def underscored(word, guesses)
word.tr('^' + guesses, '_').chars.join(' ')
end
例如:
underscored('transistor', 'aebr')
# => "_ r a _ _ _ _ _ _ r"
如果您将每个猜出的字母附加到字符串上,例如guesses << guess
那么它与tr
可以很好地配合使用。 请记住,字符串从根本上讲是一个字符数组,因此不要为此类事情创建显式数组。
如果您想跟踪@guess_counts,我会考虑将其初始化并在每个计数后添加一个,并在告诉他们有多少初始猜测时仅调用game.guesses_available。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.