1

我正在使用 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

4 回答 4

4

每次有 GET 请求时"/",都会执行相关代码,从而生成(带有警告)一个新的SECRET_NUMBER.

解决这个问题的一种方法是为第一次猜测(在这种情况下应该生成一个秘密号码)和连续猜测(在这种情况下不应该生成一个新的秘密号码)路由到不同的 URL。

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

于 2013-07-15T17:19:56.793 回答
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

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

于 2013-07-16T03:48:01.883 回答
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 方法仅提供一个参数,因为您将其定义为顶部的常量。(因为我是红宝石新手,如果我错了,有人可以纠正我。)

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
于 2016-12-10T10:55:05.397 回答
0

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

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

  "The secret number is #{rand}"
end
于 2019-03-27T17:21:32.533 回答