I\'m creating a simple game in ruby, and I have two arrays storing high score: $HS_Points
and $HS_Names
. I\'m saving high score in two files, and I wan
Something like this?
names = ['Alice', 'Bob', 'Carol']
points = [22, 11, 33]
You may want the Array#zip method:
pairs = names.zip(points)
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]
To sort by an array field, compare two fields of the pair.
Sort by name:
pairs.sort{|x,y| x[0] <=> y[0] }
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]
Sort by score:
pairs.sort{|x,y| x[1] <=> y[1] }
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]
Another way to sort is the #sort_by method instead of a comparison block (thanks to Niklas B.)
Sort by name:
pairs.sort_by(&:first)
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]
Sort by score:
pairs.sort_by(&:last)
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]
To select just the players above a high score:
pairs.select{|x| x[1] >20 }
#=> [["Alice", 22], ["Carol", 33]]
To unzip:
pairs.map(&:first)
#=> ["Alice", "Bob", "Carol"]
pairs.map(&:last)
#=> [22, 11, 33]
These ideas may point you in the right direction.
Don't store the names and the scores in separate variables; they're tied together, so their data should be tied togeher.
Try, say, $HighScores, which is an array of hashes with a :name element and a :value element, like:
$HighScores = [
{ :name => "Bob", :score => 234 },
{ :name => "Mark", :score => 2 },
]
Then you can add a high score:
$HighScores << { :name => "New Guy", :score => 50000 }
and then re-sort them and take the top 10 in one statement:
$HighScores = $HighScores.sort { |a,b| b[:score] <=> a[:score] }[0,10]
This will still work if the scores are base-23 encoded. (but why are you doing that?)
You should probably also save them to a single file. To make that easier, consider using the Marshal module.