You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Ruby实现二十一点模拟:不同实例间的牌转移(面试需求)

嘿,这事儿不难,咱们一步步把发牌的逻辑给补全!

第一步:先补上玩家手牌的Hand类

咱们得有个Hand类来存玩家的牌对吧?这个类需要一个容器装牌,再加个接收牌的方法:

class Hand
  attr_accessor :cards

  def initialize
    @cards = []
  end

  # 接收从牌堆发来的牌,避免加空牌
  def add_card(card)
    @cards << card unless card.nil?
  end
end
第二步:完善Deck类的核心功能

现有的Deck类只有个playable_cards属性,咱们得先在初始化时生成完整一副牌,再实现发牌方法——从牌堆里移除一张牌并返回,这样才能传给Hand的add_card方法。

修改后的完整类代码:

class Card
  attr_accessor :suite, :name, :value
  def initialize(suite, name, value)
    @suite, @name, @value = suite, name, value
    # 补充一句:你觉得这行奇怪?这是Ruby的并行赋值,合法又简洁,完全没问题!
  end
end

class Deck
  attr_accessor :playable_cards
  SUITES = [:hearts, :diamonds, :spades, :clubs]
  # 定义牌面和对应数值,A这里先设为11,后续可以根据规则调整
  VALUES = {
    :two => 2, :three => 3, :four => 4, :five => 5,
    :six => 6, :seven => 7, :eight => 8, :nine => 9,
    :ten => 10, :jack => 10, :queen => 10, :king => 10, :ace => 11
  }

  def initialize
    @playable_cards = []
    # 生成一副完整的52张牌
    SUITES.each do |suite|
      VALUES.each do |name, value|
        @playable_cards << Card.new(suite, name, value)
      end
    end
    # 发牌前必须洗牌!
    shuffle!
  end

  # 洗牌方法,直接用Ruby数组的shuffle!方法
  def shuffle!
    playable_cards.shuffle!
  end

  # 核心发牌方法:移除牌堆最后一张(顶牌)并返回
  def deal_card
    playable_cards.pop
  end
end
第三步:串起来实现发牌流程

现在可以模拟发牌给玩家的过程了:

# 创建一副新牌
deck = Deck.new
# 创建玩家的手牌
player_hand = Hand.new

# 发一张牌给玩家
deal_card = deck.deal_card
player_hand.add_card(deal_card)

# 验证一下结果
puts "牌堆剩余牌数: #{deck.playable_cards.size}" # 应该是51
puts "玩家手牌: #{player_hand.cards.first.name} of #{player_hand.cards.first.suite}"

如果要发多张牌,直接整个循环就行:

# 给玩家发两张起始手牌
2.times do
  player_hand.add_card(deck.deal_card)
end

内容的提问来源于stack exchange,提问作者Warren Mui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:57:12