2015-05-22 73 views
0

我试图建立一个秘密数字游戏,其中:红宝石 - 循环不打破

  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 
+0

你们真棒。非常感谢您的参与。不能相信错误是额外的“打破”。并感谢您将其分解。即时从现在开始,我的条件从最不可能的最有可能 – giantqtipz

回答

3

这不是工作,你喜欢它打算:

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

如果你打破它,它读取这样的:

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

只得到一个break如果attempts == 0,然后只是因为嵌套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 

我敢肯定有词组一个更好的方式,但你希望你最有可能/优先级最高的if语句首先评估。在这种情况下,用户的猜测保证至少大于或小于秘密数字,因此首先要评估那些人,并且它永远不会真正下降到最后。你想评估正确的猜测(1/10),然后猜出(3/10),然后大于(1/2)/小于(1/2)。 else将永远不会触发,因为所有可能性都被上述覆盖。

2

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

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

||条件是有效的语法,但造成不受欢迎的行为。

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