1

我正在用 ruby​​ 创建一个简单的游戏,我有两个数组存储高分:$HS_Points$HS_Names. 我将高分保存在两个文件中,我想对点进行一点编码(点转换为.to_s(23))。我想按降序对名称和分数进行排序并将它们限制为 10。所以,我需要:

  • 检查玩家得分的点数是否高于高分的点数(在索引 0 到 9 上)。
  • 如果收到的分数足以让玩家进入前 10 名,则将分数和姓名放在该位置,将其他位置向下推一位。

简单points_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]]

种类

要按数组字段排序,请比较该对的两个字段。

按名称分类:

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]]

排序方式

另一种排序方法是#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 }

然后对它们重新排序并在一个语句中获得前 10 名:

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

如果分数是 base-23 编码的,这仍然有效。(但你为什么这样做?)

您可能还应该将它们保存到单个文件中。为了使这更容易,请考虑使用Marshal模块。

于 2012-04-04T11:03:11.303 回答