2017-01-21 109 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