Sinatra + Ruby:随机数每次都在不断变化。范围问题?

时间:2013-07-15 17:12:46

标签: ruby random sinatra

我正在使用Sinatra使用Jumpstart Labs构建WebGuesser。我在浏览器的文本字段中输入一个数字。我点击提交,我应该得到一个回复​​,说我的号码太低或太高(或在5以内)。我使用Shotgun加载服务器。我想能够猜测一个数字,而不是每次我猜的随机数变化。

代码

require 'sinatra'
require 'sinatra/reloader'


def check_guess(guess)
if params["guess"].to_i == guess
        "You got it right!"
elsif params["guess"].to_i > guess 
    if params["guess"].to_i > (guess + 5)
        "Way too high!"
    else 
        "Close.. but too high!"
    end
elsif params["guess"].to_i < guess
    if params["guess"].to_i < (guess - 5)
        "Way too low!"
    else
        "Close.. but too low!"
    end
end
end 


# Home route
get '/' do 
    SECRET_NUMBER = rand(100)
    message = check_guess(SECRET_NUMBER)
    erb :index, :locals => { :message => message }
end

目前,我每次都会收到一个新的随机数 我觉得这没有用。我觉得这可能与我的SECRET_NUMBER在范围方面的位置有关。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

每次向"/"发出GET请求时,都会执行相关代码,生成(有警告)新SECRET_NUMBER

解决这个问题的一种方法是路由到第一个猜测的不同URL(在这种情况下应该生成一个密码),以及连续的猜测(在这种情况下不应该生成新的密码)。 / p>

此外,对于随时间变化的事物,使用常量是非常糟糕的做法。

答案 1 :(得分:2)

您可以将初始值存储在用户会话中,因为您必须在sinatra中启用会话。

configure do
  enable :sessions
  set :session_secret, "somesecretstring" 
end

之后,您可以通过转到某个路线来创建一个号码

get '/random' do
  session[:number] = rand(100)
end

然后,您可以检查您在不同路线上的猜测

get '/checkguess' do
  check_guess(session[:number]) unless session[:number].nil?
end

这是基本思想,你必须进一步定义它。希望它对你有所帮助

答案 2 :(得分:1)

我现在正在寻找完全相同的问题:

require "sinatra"
require "sinatra/reloader"

number = rand(100)

get '/' do
  guess = params["guess"].to_i
  message = check_guess(guess, number)
  erb :index, :locals => {:bok => number, :alert => guess, :msg => message}
end

将rng放在get块之外就行了。生成的数字保持不变,直到您更改代码中的某些内容(甚至在末尾添加空格并保存文件可以重新随机化该数字。)或完全重新启动服务器。

关于常量(SECRET_NUMBER),因为你将check_guess方法定义为顶部的常量,所以只给check_guess方法一个参数是有帮助的。 (因为我是红宝石的新手,如果我错了,有人可以纠正我。)

SECRET_NUMBER = rand(100)

get '/' do ... end

def check_guess(guess)
  if guess < SECRET_NUMBER
    "Your Guess is Too LOW!"
  elsif guess > SECRET_NUMBER
    "Your Guess is Too HIGH!"
  else
    "Conguratulations! You guessed it right:)"
  end

答案 3 :(得分:0)

对于仍在寻找答案的任何人。 rand应该在get块之外定义

require 'sinatra'
require 'sinatra/reloader'
rand = (rand() * 100).to_i
get '/' do

  "The secret number is #{rand}"
end