1

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

然后我需要以某种方式将卡片(从那个数字到卡片组的末端)移动到卡片组的前面。

这段代码有些工作,但不好,因为它创建了一个二维数组,当我只需要一个列表时。

我需要 $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
4

3 回答 3

2

就个人而言,我会使用类来表示牌组和卡片……</p>

卡片可能是:

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

甲板可能看起来像:

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!
于 2013-12-17T22:31:17.770 回答
2

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

deck = ["a", "b", "c", "d", "e"]
cut = 2
deck += deck.slice!(0, cut)
p deck #=> ["c", "d", "e", "a", "b"]
于 2013-12-17T22:13:09.607 回答
2

只需将两半加在一起即可:

$deck = bottomcut + topcut

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

irb(main):001:0> [1, 2, 3] + [3, 4, 5]
=> [1, 2, 3, 3, 4, 5]
于 2013-12-17T22:01:38.047 回答