class GameController < ApplicationController
def index
@games = Game.all
respond_to do |format|
format.html
end
end
def start_game
session[:round] ||= 1
session[:points] ||= 0
@round = session[:round]
@points = session[:points]
end
def next_round
session[:round] += 1
session[:points] += 1200
@round = session[:round]
@points = session[:points]
end
def generate_round
numbers = Array.new(6){rand(9)}
@addition = []
@display = numbers
numbers.inject do |s, i|
@addition << s + i
@addition.last
end
end
def new
if @round == nil
start_game
generate_round
else
generate_round
end
if session[:addition]
if not session[:addition].index(params[:guess].to_i).nil?
puts "Correct."
next_round
else
puts 'Game over.'
end
end
session[:addition] = @addition
respond_to do |format|
format.html
end
end
end
嘿伙计们,
我试图将这个迷你游戏放在红宝石中,这取决于猜测数字。
在添加每个猜测点并且水平增加一之后。
然而,根据目前的代码,我在第2轮遇到困难。 很可能由于某些原因某些事情正在重置这些变量,但我似乎可以指出它是什么。
感谢任何帮助。
::编辑::
代码已更新。问题解决了! 感谢@ blackbird07,@ robertodecurnex和@ fl00r!
的帮助答案 0 :(得分:1)
控制器是无状态的,因此每次调用时都会重置所有变量。
您应该使用一些数据存储(数据库,文件系统)来存储您当前的状态。
另一个问题是所有这些代码都不应该属于控制器。
答案 1 :(得分:0)
由于您要保持会话的轮次,您应该使用会话值而不是实例变量,或者至少创建一个过滤器来为每个请求设置此变量。
使用过滤器:
before_filter :set_round
private
def set_round
@round = session[:round]
end
新方法(行动)正在做以下事项:
if @round = 0 then
它将0
分配给@round
而非比较它。
尝试if @round == 0
或if @round.zero?
您还需要增加会话值,而不仅仅是@round
变量。
记住:
= #=> Assignation
== #=> Equality, usually overwritten by the classes to return true base on the equality of the state/attributes of two objects.
=== #=> Equality, usually defined to compare the identity of two objects (to return true only if both objects are actually the same object).
答案 2 :(得分:0)
您不会在next_round操作中增加会话[:round]和会话[:points]的计数器。这样做,它应该工作。
session[:round] += 1
session[:points] += 1200
@round = session[:round]
@points = session[:points]