在Ruby中重新安排1d列表

时间:2013-12-17 21:59:52

标签: ruby arrays list ruby-1.8.7

我正在尝试模拟一副被切割的牌。所以我提示玩家选择1到32之间的数字(这个牌组中的牌数)。它存储在$cut_the_deck_number变量中。

然后我需要以某种方式将牌(从那个号码移动到牌组的末端)移动到牌组的前面。

这个代码有点起作用,但不好,b.c它创建一个2D数组,当我只需要一个列表。

我需要$ deck才能

$deck = ["2 of diamonds", "5 of clubs", etc]

而不是

$deck = [["2 of diamonds, "5 of clubs"], ["8 of spades", etc, etc]]

我知道还有其他一些方法,但它不起作用,因为我使用的是RUBY 1.8.7

def cuttingthedeck
  bottomcut = $deck.pop($cut_the_deck_number)
  topcut = $deck.pop($deck.length)
  $deck.push(bottomcut)
  $deck.push(topcut)
end

3 个答案:

答案 0 :(得分:2)

只需将两半重新加在一起:

$deck = bottomcut + topcut

在Ruby中,添加数组相当于连接它们的元素:

irb(main):001:0> [1, 2, 3] + [3, 4, 5]
=> [1, 2, 3, 3, 4, 5]

答案 1 :(得分:2)

您可以展平您的阵列:$deck.flatten!。这是另一种选择:

deck = ["a", "b", "c", "d", "e"]
cut = 2
deck += deck.slice!(0, cut)
p deck #=> ["c", "d", "e", "a", "b"]

答案 2 :(得分:2)

就个人而言,我会用课程代表卡片和卡片......

卡片可能是:

class Card
  attr_reader :suit, :value

  def initialize(suit, value)
    @suit, @value = suit, value
  end

  def to_s
    value = case @value
    when 1
      :A
    when 11
      :J
    when 12
      :Q
    when 13
      :K
    else
      @value
    end

    "#{value}#{suit}"
  end

  alias_method :inspect, :to_s
end

而Deck看起来像:

class Deck
  attr_reader :cards

  def initialize
    @cards = []

    [:S, :H, :D, :C].each do |suit|
      ([1] + (7..13).to_a).each do |value|
        @cards << Card.new(suit, value)
      end
    end
  end

  def shuffle!
    @cards.shuffle!
    self
  end

  def cut!(cut_at = nil)
    cut_at ||= rand(1..(@cards.size - 1))
    @cards += @cards.slice!(0, cut_at)
    self
  end
end

然后你可以打电话:

require 'pp'
pp Deck.new.shuffle!.cut!