2017-01-21 4 views
3

私はアレイ内で一度に2つのサブアレイを取得しようとしています - これを行う方法に関するアイデアはありますか?2dの配列に対してインクリメントでどのように反復処理を行い、ルビのインクリメントを増やしますか?

例:

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

がループして一度に2枚のカードをつかむためにどのような方法がありますので、インデックスはすべての時間を増やして、[0..1]から行くでしょう[1..0 ]など、一度に2枚のカードをつかむことができます。

私が入れたいのですが:

プレイヤー1枚のカード:[2,spades],[3,hearts]

プレーヤー2枚のカード:[6,diamonds],[10,clubs]

+0

注各いるという事実'deck'の要素は配列ではありません。 'deck = [:card1、:card2、...、:card6]'と同じ解決策が適用されます。ちなみに、あなたは '' spades ''や':spaces'を意味しますか?前述のように、「スペード」は変数または方法でなければならない。 –

+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
0

を取り長さn

  • take(n)の断片に配列をカット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時にあなたを必ず含めてください最初にデッキを生成します。

    また、私はあなたがデッキを生成するために使用しているかわからないが、私はそれを楽しんで持っていたので、:

    生成AたShuffledデッキ

    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

    関連する問題