ruby-on-rails - Ruby - 编写一个猜测单词中字母的程序

标签 ruby-on-rails ruby

背景:我正在使用一个类构建一个类似于刽子手的游戏,其中玩家 1 输入要猜的单词,玩家 2 尝试猜测它。分配给玩家 2 的猜测次数与所讨论的单词相关,但重复猜测不计入玩家。

每次猜测都应该通过显示他们猜测单词的进度向玩家 2 提供持续的反馈,这应该在每个猜测阶段结束时打印出来。 ex)单词“代码”将显示为“_ _ _ _ ”,如果要猜测字母“o”,则反馈将显示为“ _ _ _ _”等。一旦猜出单词或玩家还剩 0 次尝试,便会宣布获胜者。

问题 1:我无法在 game_won 时关闭程序?方法评估为真。它会继续运行,直到 attempts == game_word.length + 2。关于如何以获胜语句结束程序有什么想法吗?

问题 2:我尝试添加一个 game_lost 方法,但一旦玩家 2 尝试次数用完就无法让它工作(尝试创建一个实例变量以绑定(bind)到界面中的尝试,但每当它在类,弹出一个错误,指出它是一个 nil 类,而不是一个整数。我如何制作一个函数方法来说明游戏何时丢失?

问题 3:每当输入不正确的字母时,“不,再试一次...”响应会打印出与单词长度一样多的次数。它似乎在 guess_the_letter 方法中打印出最后评估的 x 次。

问题4:如果输入的单词包含多个相同的字母,则单词进度更新将出现与该字母在游戏单词中存在的次数相同的次数。 (似乎与问题 3 类似)关于我在这里做错了什么的任何想法。

    class GuessingGame

    def initialize(word)
        @word = word.downcase
        @display_word = "_" * word.length
    end

    # Take a guess in the form of a letter and check to see if it is in the
    # target word, update the word pattern to include the missing  letter
    def guess_the_letter(g_letter)
        g_letter.downcase
        @word.split("").each_with_index do |w_letter, index|
            if g_letter == w_letter
                @display_word[index] = g_letter
                puts "Here is your progress towards guessing the word:"
        p @display_word
            end
          if !@word.include? (g_letter)
            puts "Nope, try again..."
          end
        end
    end

    # Determine winning conditions
    def game_won?
      if    @word == @display_word
            puts "Congratulations Player 2, you won!"
            true
        else
            false
      end
    end

    def game_lost?
      #method body
    end
end

puts "Welcome to the Word Guessing Game!"
puts "This game is for 2 players."
puts "Player 1, please enter a word for player 2 to guess..."
game_word = gets.chomp

game = GuessingGame.new(game_word)

attempts = 0
guessed_letters = []

#Create an interface for the users to play the game

until attempts == game_word.length + 2
  puts "Player 2, please guess a letter..."
    letter_guess = gets.chomp
    if guessed_letters.include? letter_guess
        puts "You already tried that letter, enter a new one."
        letter_guess = gets.chomp
    end
    guessed_letters << letter_guess
  game.guess_the_letter(letter_guess)
  game.game_won?
  attempts += 1 
end

最佳答案

问这种问题的时候,要指出第46行在哪里。

在你的例子中,我猜它是表达式 attempts == @word.length。您不在类上下文中,因此@word 不引用 GuessingGame 中的实例变量。

您不能直接访问另一个对象(即不同于self 的对象)的实例变量,因此您需要提供访问器方法。 Ruby 使用 attr_reader 使这变得容易:

attr_reader :word

@word 创建一个名为 word 的读取访问器方法。

更新:我刚刚看到您修改了原始代码。使用新代码,您将遇到与@bad_guesses 相同的问题。

顺便说一句,如果您编辑您的帖子,请始终解释您所做的更改。

关于ruby-on-rails - Ruby - 编写一个猜测单词中字母的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41438294/

相关文章:

ruby-on-rails - 如何将变量添加到现有模型 ruby​​ on rails

ruby-on-rails - 按条件划分的状态机事件不起作用

ruby-on-rails - 如何在 ActiveRecord 中指定为accepts_nested_attributes_for 设置的字段

ruby-on-rails - "Can' t 批量分配 protected 属性“具有嵌套属性

ruby-on-rails - 如何从 Ruby 运行非阻塞命令?

ruby-on-rails - heroku scale web=1 返回 "no such type as web"

ruby-on-rails - Heroku:在/app/config/storage.yml 中找不到 Active Storage 配置(运行时错误)

ruby-on-rails - 如何将 Pry 输出转储到文件或 Vim?

ruby-on-rails - 在 sublime text 2 中突出显示 rspec

ruby - 仅匹配 RAR 文件集中第一个文件的正则表达式