我正在尝试创建一个单词猜谜游戏,它将一个字符串作为输入。我发现很难尝试将字符串的每个字符显示为下划线,并在它们之间留有空格。例如,单词“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
答案 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。