【问题标题】:Ruby elegant way to deal card array to player objectsRuby 优雅的方式来处理玩家对象的卡片数组
【发布时间】:2011-03-08 12:53:16
【问题描述】:

我很难找到一种优雅的 ruby​​ 方法来执行此操作。我有一个包含 52 个 Card 对象的 deck 数组,我想遍历它并循环遍历一组 Player 对象,一次将一张牌发给他们的手 数组。比如:

deck = Card.deck.shuffle!
deck.each do |card|
    @players.NEXTELEMENT.hand << card
end

NEXTELEMENT 将产生下一个元素并在遇到数组末尾时返回到数组的开头。我尝试将这样的方法添加到 Array,但出现 LocalJumpError。

谢谢。

【问题讨论】:

    标签: ruby arrays iterator


    【解决方案1】:

    只需根据玩家数量修改你在哪张牌上。

    num_players = @players.size
    
    deck.each_with_index do |card,index|
      @players[ index % num_players ].hand << card
    end
    

    【讨论】:

    • 谢谢,这种方式非常干净,与我最初的意图相似。
    【解决方案2】:

    怎么样

    deck.each_slice(@players.size) do |cardSet|
     @players.zip(cardSet).each {|player,card| player << card}
    end
    

    【讨论】:

    • 我刚刚意识到没有处理卡用完的方法。如果您检测到 cardSet 包含 nil 元素,您可以预先对牌组进行切片以获得偶数,或者提前从外循环中中断。
    • 如果你使用的是 1.9,你可以这样说:break if cardSet.any?(&:nil?)
    • 如果不需要一个一个,有没有更简单的方法?
    • cardCount = 7; @players.each {|玩家| player.push *deck.shift(cardCount)}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2015-04-10
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多