我正在尝试模拟一副被切割的牌。所以我提示玩家选择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
答案 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!