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

时间:2017-01-03 07:16:46

标签: ruby-on-rails ruby

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

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

问题1:game_won时我无法让程序关闭?方法计算结果为true。它继续运行,直到尝试== game_word.length + 2.关于如何用获胜声明结束程序的任何想法?

问题2:我尝试添加一个game_lost方法,但是一旦玩家2用完了尝试就无法使其工作(尝试创建一个与接口中的尝试绑定的实例变量,但无论何时在外面调用它在类中,弹出一个错误,声明它是一个nil类,而不是一个整数。如何制作一个功能方法来说明游戏何时丢失?

问题3:每当输入错误的字母时,“Nope,try again ...”响应将打印出与单词长度一样多的次数。它似乎是在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

1 个答案:

答案 0 :(得分:1)

当提出这类问题时,你应该指出第46行是什么。

在你的情况下,我猜它是Notifier.delay(run_at: 5.minutes.from_now).signup(@user) 这个词。您不在类上下文中,因此@word不引用GuessingGame中的实例变量。

您不能直接访问另一个对象的实例变量(即与attempts == @word.length不同的对象),因此您需要提供一个访问器方法。 Ruby使用self

轻松实现这一点
attr_reader

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

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

顺便说一句,如果你编辑你的帖子,请总是解释你改变了什么。