Ruby – 循环没有破坏

我正在尝试创建一个秘密数字游戏,其中:

  1. 随机选择1到10之间的数字
  2. 玩家有3次尝试猜测秘密号码
  3. 如果玩家在所有尝试中猜错,或猜测正确的号码,他们将被提示是否要重播游戏。

我的问题是:

  1. 当playerInput == secret_number时,“尝试”循环不会中断。 它只会在使用所有3次尝试时中断。
  2. 当所有3次猜测都用尽时,无法打印消息“对不起,但你没有更多的尝试”。
  3. 我认为我的数学也是关闭的……尝试

代码如下。 先谢谢你们!

puts "Welcome to the Secret Number Game! Please tell me your name" player_name = gets.strip puts "Welcome #{player_name}!" puts "Guess a number between 1 - 10. You only have 3 attempts!" restart = true def guess_check( playerInput, secret_number, attempts ) if playerInput > secret_number puts "Too high! try again!" elsif playerInput < secret_number puts "Too low! try again!" elsif playerInput == secret_number puts "Congratulations, you guessed the secret number! [#{secret_number}]" elsif attempts == 0 puts "Sorry, you're out of guesses, the secret number is [#{secret_number}]" else puts secret_number end end while restart guesses = [] attempts = 3 secret_number = 1 + rand(10) while attempts attempts = attempts - 1 puts "Guess the secret number, you have #{attempts} tries left" playerInput = gets.to_i guesses.push( playerInput ) guess_check( playerInput, secret_number, attempts ) puts "You've guessed #{guesses}" break if playerInput == secret_number || break if attempts == 0 end puts "Do you want to play again? (y/n)" answer = gets.strip restart = false if answer == "n" end 

这不像你想要的那样工作:

 break if playerInput == secret_number || break if attempts == 0 

如果你打破它,它看起来像这样:

 if attempts == 0 if playerInput == secret_number or break break end end 

如果attempts == 0 ,它只会break ,并且只有因为嵌套的if语句中的第一个条件失败或者它通过了。 这应该使它像你想要的那样工作:

 break if playerInput == secret_number || attempts == 0 

它不会打印用尽的猜测消息,因为首先执行了正确或错误答案的条件。 要解决此问题,您的条件需要按以下顺序排列:

 def guess_check( playerInput, secret_number, attempts ) if playerInput == secret_number puts "Congratulations, you guessed the secret number! [#{secret_number}]" if attempts == 0 puts "Sorry, you're out of guesses, the secret number is [#{secret_number}]" elsif playerInput > secret_number puts "Too high! try again!" elsif playerInput < secret_number puts "Too low! try again!" #else <= this can actually be removed, the if statement will never get this far #puts secret_number end end 

我确信有一个更好的方式来表达它,但如果首先评估语句,你希望你最不可能/最高优先级。 在这种情况下,用户的猜测保证至少大于或小于秘密数字,因此首先评估这些,并且它永远不会真正下降到最后。 你想评估正确的猜测(1/10),然后猜测(3/10),然后大于(1/2)/小于(1/2)。 else永远不会触发,因为上述所有可能性都包括在内。

这里只是一个简单的改变:

 break if playerInput == secret_number || attempts == 0 

你的|| 条件是有效的语法,但导致不需要的行为。

我重构你的代码。

 puts "Welcome to the Secret Number Game! Please tell me your name" player_name = gets.strip puts "Welcome #{player_name}!" restart = true def guess_check( playerInput, secret_number) if playerInput > secret_number puts "Too high! try again!" elsif playerInput < secret_number puts "Too low! try again!" end end while restart guesses = [] attempts = 3 secret_number = 1 + rand(10) puts "Guess a number between 1 - 10. You only have 3 attempts!" while attempts playerInput = gets.to_i guesses.push( playerInput ) # once guessed, should exit current loop. if playerInput == secret_number puts "Congratulations, you guessed the secret number! [#{secret_number}]" break; end puts "You've guessed #{guesses}" #if not guessed, then should check the number is low or high. guess_check(playerInput, secret_number) attempts = attempts - 1 #if out of guesses, exit from current loop if attempts == 0 puts "Sorry, you're out of guesses, the secret number is [#{secret_number}]" break; else puts "Guess the secret number, you have #{attempts} tries left" end end puts "Do you want to play again? (y/n)" answer = gets.strip restart = false if answer == "n" end