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

问题描述 投票:1回答:4

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

ruby random sinatra
4个回答
4
投票

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

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

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


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

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


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

0
投票

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

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

  "The secret number is #{rand}"
end
© www.soinside.com 2019 - 2024. All rights reserved.