2011-07-13 95 views
0
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 

嘿家伙, 我试图把这个迷你游戏放在红宝石,这取决于猜测数字。 添加每个猜测点后,等级增加1。这个循环有什么问题?

但是就目前的代码而言,我在第二轮卡住了。 很可能是因为某些原因重置了这些变量,但我似乎可以指出它是什么。

将不胜感激任何形式的帮助。

::编辑::更新

代码。问题解决了! 感谢您的帮助@ blackbird07,@robertodecurnex和@ fl00r!

+0

好奇,什么是Ruby中的“不”?我不熟悉它......然后我又是一个Ruby新手。 – Meltemi

+0

这些东西在控制器中做了什么? – fl00r

+1

这是几乎昨天你的问题的转贴:http://stackoverflow.com/questions/6654978/how-to-one-up-for-points-and-rounds-in-a-game – thedaian

回答

0

你不增加会话计数器[:圆形]和会话[:分]在您的next_round行动。做到这一点,它应该工作。

session[:round] += 1 
session[:points] += 1200 
@round = session[:round] 
@points = session[:points] 
+0

我认为这是通过做+ = 1来实现的,并且由于两者的会话都被设置为实例变量,所以它也会转移到会话中。 (它增加到第2轮和1200pts =一次迭代)::编辑::你先生是一个真正的绅士,问题固定!谢谢。仍然想知道为什么实例变量不会更新分配的会话。 –

+0

这是因为你必须考虑robertodecurnex的回答:if @round == 0 then;再加上你必须在你的新动作中阅读session [:round] - >将我的帖子更新为 – emrass

+0

以上实例变量未绑定到会话值。会话是在请求之间持续存在的唯一东西。这就是为什么你必须在你调用的每个动作中初始化会话中的实例变量 – emrass

1

控制器是无状态的,所以当你每次调用它时,所有的变量都会被重置。

您应该使用一些datastorage(数据库,文件系统)来存储您的当前状态。

而另一个你的问题是,所有这些代码根本不应该属于控制器。

+0

我相信他打算为* session *保持游戏状态。但是,我同意控制器太麻烦了。 – Meltemi

+0

@Meltemi,不过,看起来他从不更新会话数据。 – fl00r

+0

@ fl00r - @meltemi指出,我认为session []会允许我存储当前状态,直到我销毁它。有什么办法可以在目前的状态下修复它吗?现在我想只是为了工作(超越第二轮)。然后,我很可能会将它重写为一个更合适的带有数据库和模型中定义的东西的Rails应用程序。 –

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). 
+0

感谢您指出,但即使我修复它,如果@圆==零,仍然不能解决问题。在每次成功猜测之后,Round仍然停留在2。 –

+0

这是因为会话问题。您需要更新会话和实例变量。顺便说一下,你可以随时使用会话而不是变量。 – robertodecurnex