我正在使用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在范围方面的位置有关。有什么想法吗?
答案 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