2011-07-13 17 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増加した後。このループで何が問題になっていますか?

しかし、現在のコードでは、私はラウンド2で立ち往生しています。 ほとんどの場合、何らかの理由でこれらの変数がリセットされていますが、それが何であるかを特定することができます。

どんな種類のヘルプにも感謝します。

::編集::

コードが更新されました。問題が解決しました! help @ blackbird07、@robertodecurnex、@ fl00rありがとう!

+0

奇妙なことに、ルビーには何がないのですか?私はそれに精通していない...そして再び私はルビーnewbです。 – Meltemi

+0

このすべてのものはコントローラで何をしていますか? – fl00r

+1

これは昨日のあなたの質問のかなりの再投稿です:http://stackoverflow.com/questions/6654978/how-to-one-up-for-points-and-rounds-in-a-game – thedaian

答えて

0

あなたはセッションのカウンタを増加させません。これを行うと、それは動作するはずです。

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

私はそれが+ = 1を行うことによって達成されたと思って、両方のセッションがインスタンス変数として設定されているので、それもセッションに転送されます。 (それは第2ラウンドと1200pts = 1回の反復まで増加する)::編集::あなたは本当の紳士、問題は修正されました!ありがとうございました。インスタンス変数がなぜ割り当てられたセッションも更新しない理由を知りたいのですが。 –

+0

これは、あなたもrobertodecurnexの答えを考慮に入れなければならないからです:もし@round == 0ならば;あなたの新しいアクションでセッション[:round]を読まなければなりません - >上記の私の投稿を更新します – emrass

+0

インスタンス変数はセッション値にバインドされていません。セッションは、リクエスト間で維持される唯一のものです。これは、呼び出すすべてのアクションでセッションからインスタンス変数を初期化する必要がある理由です – emrass

1

コントローラにはステートレスなので、すべての変数は、呼び出すたびにリセットされます。

現在の状態を保存するには、データストア(データベース、ファイルシステム)を使用する必要があります。

もう1つの問題は、このコードがすべてコントローラに属していないことです。

+0

私は彼が意図していると信じていますゲームの状態を保持する*セッション*のために。しかし、私はコントローラがあまりにもphatであることに同意します。 – Meltemi

+0

@Meltemi、ねえ、彼は決してセッションデータを更新しないようです。 – fl00r

+0

@ fl00r - @meltemiが指摘したように、私はセッション[]は私がそれを破壊するまで現在の状態を保存できると思っていました。現在の状態で修正できる方法はありますか?私は今のところ(2ラウンドを越えて)働くだけでいいです。次に、モデルに定義されているDBやものを使って、より適切なレールアプリケーションに書き換えます。 –

0

セッションでラウンドを維持しているので、インスタンス変数の代わりにセッション値を使用するか、少なくともすべての要求でこの変数を設定するフィルタを作成する必要があります。フィルタの使用

before_filter :set_round 

private 

def set_round 
    @round = session[:round] 
end 

新しいメソッド(アクション)は、次のことを行っている。

if @round = 0 then 

それは@round0を割り当てる代わりに、それを比較です。

if @round == 0試してみてくださいまたはちょうどif @round.zero?

あなたはセッション値だけでなく@round変数1を増加させることも必要になります。

は覚えている:あなたのnext_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 == nilに修正しても、それを指摘してくれてありがとう。各成功の推測の後、ラウンドはまだ2で立ち往生しています。 –

+0

セッションの問題が原因です。セッション変数とインスタンス変数の両方を更新する必要があります。 Btw、あなたは変数の代わりに常にセッションを使用することができます。 – robertodecurnex