【问题标题】:How do you iterate over a 2d array in increments and increase the increment with ruby?您如何以增量迭代二维数组并使用 ruby​​ 增加增量?
【发布时间】:2017-06-06 02:01:15
【问题描述】:

我试图在一个数组中一次抓取两个子数组 - 关于如何做到这一点的任何想法?

示例:

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

有没有办法一次抓两张牌循环,所以索引每次都会增加,从 [0..1] 然后 [1..0] 等等,一次抓两张牌时间。

我想说:

玩家 1 卡:[2,spades],[3,hearts]

玩家 2 牌:[6,diamonds],[10,clubs]

【问题讨论】:

  • 请注意,deck 的每个元素都是一个数组这一事实是无关紧要的。如果deck = [:card1, :card2,..., :card6] 将适用相同的解决方案。顺便说一句,您是指"spades" 还是:spaces。如前所述,spades 必须是变量或方法。
  • @max paspa 提供的任何答案对您有用吗?如果是这样,请选择一个答案,以便在用户搜索时显示为带有答案的问题。谢谢!

标签: ruby multidimensional-array iteration


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    我的建议是将deck数组传递给一个方法并返回一个带有[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
    

    【讨论】:

    • 一些 Ruby 技巧——你可以写 player_one, player_two, deck = drawTwo(deck),Ruby 会帮你解包。此外,无需从函数中返回 deck,我假设您具有“按值传递”的语言背景。在 Ruby 中,一切都是“通过指针传递”。
    • @akuhn 很好的建议,谢谢!关于返回套牌,我假设这将在某种游戏中运行多次,所以他们不需要更新的套牌继续进行第 2 轮、第 3 轮等而不使用相同的卡吗?
    • 您返回的deck 指向与您传递给函数的deck 相同的对象。因此无需退货。
    • 更多 Ruby 提示 — 不要返回错误消息,这会导致后续错误,只需使用会引发运行时异常的 raise "Not enough cards ..."
    • 你可以写deck.shift(2)而不是[deck.shift, deck.shift]
    【解决方案3】:

    你可以使用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
    

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2011-05-06
      • 1970-01-01
      • 2019-12-14
      • 2011-05-19
      • 1970-01-01
      • 2020-04-21
      • 2013-08-24
      • 2017-03-11
      相关资源
      最近更新 更多