2017-01-03 89 views
2

背景:使用一个类,我正在构建一个类似hang子手的游戏,其中玩家1输入一个要猜测的单词,玩家2尝试猜测它。分配给玩家2的猜测数与相关单词有关,但重复的猜测不计入玩家。红宝石 - 编写一个猜测字母的程序

每个猜测应该通过显示他们猜测单词的进度来向玩家2提供连续的反馈,这应该在每个猜测阶段结束时打印出来。例如)'代码'一词将显示为“_ _ _ _ ”,如果字母“o”被猜测,反馈将看起来像“ _ o _ _”等。一旦该单词被猜测或者球员还剩0次,则宣布获胜者。

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

问题2:我尝试添加一个game_lost方法,但一旦玩家2尝试完成时尝试创建一个实例变量(尝试创建一个与接口中的尝试绑定的实例变量,但每当它被外部调用问题3:每当输入一个不正确的字母时,就会出现一个错误信息,说明它是一个零类,而不是一个整数。我怎样才能创建一个函数方法来指明游戏何时丢失?

问题3: “不,再试一次...”的答复打印出来的次数与单词的长度一样多,似乎是在guess_the_letter方法中打印出最后一次评估的次数x次。 ISSU e 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 [email protected]? (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 
+0

请在尝试传达复杂概念时养成使用段落的习惯。你的问题是一段难以理解的文字。另外,不要在你的问题中加入“编辑”之类的东西。我们不关心你的问题在过去是否被严重地表述过,只要它现在已经写得很好*(编辑历史也可以用几种非常好的格式提供)。 –

+0

谢谢,我对文本块进行了一些编辑,使其更清晰。仍然习惯了网站@JörgWMittag – Dan

回答

1

当问这样的问题时,你应该指出,第46行是。

就你而言,我想这是表达式attempts == @word.length。你不在类上下文中,所以@word在GuessingGame中没有引用实例变量。

您不能直接访问另一个对象的实例变量(即与self不同的对象),因此您需要提供一个访问器方法。红宝石使得这个简单的使用attr_reader

attr_reader :word 

创建一个读存取的方法@word被称为word

更新:我只是看到你已经修改了你的原代码。使用新代码,您会遇到与@bad_guesses相同的问题。

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

+0

我在类声明下面有一个“attr_reader:word”。当我编辑attr_reader以包含@bad_guesses时,错误提示“未定义的方法'长度'为nil:NilClass”,而不是“未定义的局部变量或方法'bad_guesses'”。因此,它将它识别为一个nil类而不是数组。 ..?我迷路了。 – Dan

+0

我需要看到整个更新的代码才能评论这个..... – user1934428

+0

代码片段中编写的代码是最新的。我相信所有这些都改变了,我拿出attr_reader中的getter方法(以及它们在界面中的使用)来解决我原来的问题,因为我没有试图在类之外访问任何实例变量。我留下了我添加到背景中的4个错误。对不起,如果我没有正确理解你的要求。 – Dan