1

私はルビーで簡単なゲームを作成しています。ハイスコアを格納する2つの配列があります:$HS_Points$HS_Names。ハイスコ​​アを2つのファイルに保存していて、ポイントを少しエンコードしたかったのです(ポイントはで変換され.to_s(23)ます)。名前とスコアを降順で並べ替えて、10に制限したかったので、次のことを行う必要があります。

  • プレーヤーが獲得したポイントの量が、ハイスコアのポイントの量よりも多いかどうかを確認します(インデックス0から9)。
  • 受け取ったスコアがプレーヤーをトップ10に設定するのに十分な場合は、ポイントと名前をその場所に置き、他の場所を1つ押し下げます。

Simplepoints_array.sortは、ポイントを並べ替えて、名前をそのままにしておくため、機能しません。

その問題を解決する方法はありますか?できるだけ簡単に答えてください。

4

2 に答える 2

10

このようなもの?

names = ['Alice', 'Bob', 'Carol']
points = [22, 11, 33]

ジップ

Array#zipメソッドが必要になる場合があります。

pairs = names.zip(points)
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]

選別

配列フィールドで並べ替えるには、ペアの2つのフィールドを比較します。

名前順:

pairs.sort{|x,y| x[0] <=> y[0] }  
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]

スコアで並べ替え:

pairs.sort{|x,y| x[1] <=> y[1] }  
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]

並び替え

並べ替えるもう1つの方法は、比較ブロックの代わりに#sort_byメソッドです(Niklas Bに感謝します)。

名前順:

pairs.sort_by(&:first) 
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]

スコアで並べ替え:

pairs.sort_by(&:last)
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]

選択する

ハイスコ​​アより上のプレーヤーだけを選択するには:

pairs.select{|x| x[1] >20 }
#=> [["Alice", 22], ["Carol", 33]]

解凍

解凍するには:

pairs.map(&:first)
#=> ["Alice", "Bob", "Carol"]

pairs.map(&:last)
#=> [22, 11, 33]

これらのアイデアはあなたを正しい方向に向けるかもしれません。

于 2012-04-04T00:06:36.183 に答える
0

名前とスコアを別々の変数に保存しないでください。それらは一緒に結び付けられているので、それらのデータは一緒に結び付けられる必要があります。

たとえば、$ HighScoresを試してください。これは、次のような:name要素と:value要素を持つハッシュの配列です。

$HighScores = [  
   { :name => "Bob", :score => 234 },
   { :name => "Mark", :score => 2 },   
]

次に、ハイスコアを追加できます。

$HighScores << { :name => "New Guy", :score => 50000 }

次に、それらを再ソートして、1つのステートメントでトップ10を取得します。

$HighScores = $HighScores.sort { |a,b| b[:score] <=> a[:score] }[0,10] 

スコアがベース23でエンコードされている場合でも、これは機能します。(しかし、なぜあなたはそれをしているのですか?)

おそらく、それらを1つのファイルに保存する必要もあります。これを簡単にするために、Marshalモジュールの使用を検討してください。

于 2012-04-04T11:03:11.303 に答える