2017-01-21 45 views
3

我试图抓住一个数组内的两个子数组 - 任何想法如何做到这一点?如何以增量迭代2d数组并以ruby增加增量?

例如:

deck = [[2,spades],[3,hearts],[6,diamonds],[10,clubs],[8,hearts],[9,clubs]] 

有没有办法在一个循环时间抢两张卡,所以该指数将增加每次从[0..1],然后去[1..0 ]等,一次抓两张牌。

我想提出:

播放器1卡:[2,spades],[3,hearts]

玩家两张牌:[6,diamonds],[10,clubs]

+0

注意这样一个事实,每个“甲板”的元素是一个数组无关紧要。如果'deck = [:card1,:card2,...,:card6]',同样的解决方案也适用。顺便说一下,你的意思是''黑桃''或':空格'。如前所述'spades'必须是一个变量或一个方法。 –

+0

@max paspa做了任何提供的答案为你工作?如果是这样,请选择一个答案,以便当用户搜索时显示为答案的问题。谢谢! – OneNeptune

回答

2

试试这个

hands = array.each_slice(hand_size).take(player_count) 

hands.each_with_index do |hand, n| 
    puts "player #{n + 1} cards are: #{hand}" 
end 

这是如何工作的?

  • each_slice(n)切割数组长度n
  • take(n)件采取第一n
0

你可以使用Enumerable::each_slice

deck = [[2,"spades"],[3,"hearts"],[6,"diamonds"],[10,"clubs"],[8,"hearts"],[9,"clubs"]] 

deck.each_slice(2) do |el| 
    puts el 
end 
3

我的建议也只是通过甲板数组放入方法并返回一个数组[player1,player2,deck]。如果您只从纸牌的“顶部”进行绘图,则只需使用shift即可将第一个元素从阵列中取出。

的长期解决方案

deck = [[2,"spades"],[3,"hearts"],[6,"diamonds"],[10,"clubs"],[8,"hearts"],[9,"clubs"]] 

def drawTwo(arr) 
    if arr.count >= 4 
    player_one = [deck.shift, deck.shift] 
    player_two = [deck.shift, deck.shift] 
    return [player_one, player_two, deck] 
    else 
    return "Not enough cards in deck, please provide a new deck" 
    end 
end 

round = drawTwo(deck) 
player_one = round[0] 
player_two = round[1] 
deck = round[2] 

puts "Player one: #{player_one}" 
puts "Player two: #{player_two}" 
puts "Deck: #{deck}" 

我想是非常详细并没有太多的混淆这个代码,以便它应该阅读漂亮解释。

你可以使它有点短重写它这样的,我只是想这是可以理解发生了什么事:

浓缩液

deck = [[2,"spades"],[3,"hearts"],[6,"diamonds"],[10,"clubs"],[8,"hearts"],[9,"clubs"]] 

def drawTwo(arr) 
    arr.count >= 4 ? [[arr.shift, arr.shift], [arr.shift, arr.shift]] : raise "Not enough cards..." 
end 

player_one, player_two = drawTwo(deck) 

puts "Player one: #{player_one}" 
puts "Player two: #{player_two}" 
puts "Deck: #{deck}" 

一定要包括deck.shuffle当你首先生成甲板。

而且,我不知道你正在使用生成甲板上的东西,但因为我是有它的乐趣:

产生打乱甲板

def newShuffledDeck 
    ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"] 
    suits = ["hearts", "spades", "clubs", "diamonds"] 
    deck = ranks.product(suits) 
    deck.shuffle 
end 
+0

一些Ruby技巧 - 你可以写'player_one,player_two,deck = drawTwo(deck)',Ruby为你解开包装。另外,不需要从函数中返回'deck',我假设你有一个语言背景,“有价值传递”。在Ruby中,一切都是“传递指针”。 – akuhn

+0

@akuhn好建议,谢谢!关于回归甲板,我认为这将在某种游戏中运行多次,那么他们是不是需要更新的甲板继续轮转2,3等,而不使用相同的牌? – OneNeptune

+0

您返回的“deck”指向与您传递给该函数的“deck”相同的对象。因此不需要返回它。 – akuhn