2012-05-13 4 views
3

Rubyで靴を使用してRubyでゲームを作っています ボタンをクリックすると "Two"コードが計算されます。 値2配列内で発生します。 と表示される値2のすべてのインスタンスについて、スコアは2だけインクリメントされます。Ruby Shoes:値が配列内で発生する回数をカウントする

このコードは、選択された量のケースで機能しますが、 @ array = [2,1,2,2,3 ]#配列に3つの2があるので スコアは6であると仮定しますが、代わりに私のコードは4を返します...なぜですか?

button "  twos  " do  
    @array.each_with_index do |value, index| 
     if (@array[index] == 2) 
      @score = @score + 2 
      @points = @score + 2 
     end #if  
end #loop end #button 
+0

ドル記号を意味しますか? – Flexoid

+0

ああ私はこのサイトの新しいユーザーです。これは書式設定のエラー – user1391983

答えて

6

このコードはよく見えますが、実際は同じことをしています。おそらく、インスタンス変数@score@pointsの初期値を確認する必要がありますか?

@array = [2,1,2,2,3] 

@score = @points = 0 

@score = @array.count(2) * 2 
@points = @score 

@score 
=> 6 
@points 
=> 6 
+0

でしたので、このコードを試しました。@array = [2,4,2,2,4]になったら、2というスコアを付けましたそれはなぜでしょうか? – user1391983

+0

このコードをクリーンな環境、例えばirbで試してみると、それはあなたに6を返す。だから私はあなたが示していないコードの部分の問題を考える。 PS。今のコードはもっと良く見えます) – Flexoid

+0

hmmタイトルを使ってスコアを印刷する以外に、@scoreに関して使用したコードはすべてあなたのものと同じで、配列をプリントアウトすると、正しい配列が出力されます。あなたの助けをありがとう!大変感謝しています! – user1391983

0

Enumerable#injectの方法をお勧めします。 注入あなたはカウント数の抽象メソッドを実装して、プロジェクト内のどこにでもそれを使用することができますによって:

def count_of_element array, element 
    array.inject(0) { |count, e| count += 1 if e == element; count } 
end 

puts count_of_element [2,1,2,2,3], 2 # => 3 

も、よりよい解決策があるかもしれません - このようArrayクラスのためのメソッドを定義します。

class Array 
    def count_of_element element 
    inject(0) { |count, e| count += 1 if e == element; count } 
    end 
end 

puts [2,1,2,2,3].count_of_element 2 # => 3 

もっとクールに見えます。がんばろう!

+0

Eeh、Flexoidのソリューションからわかるように、 'count'メソッドは既に存在しています。あなた自身を定義する必要はありません。 – Mischa

関連する問題