基于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
相关产品推荐
相关产品推荐

