Ruby:战争卡片游戏,向玩家发牌

所以我不是要求任何人为我解决这个问题,但我确实需要一些帮助。 我是面向对象编程的新手,但它开始对我有意义。 以下是我目前为战争卡片游戏所做的代码。 我现在并不关心西装,虽然我知道如果需要的话可以添加它们。 基本上,我的下一步是弄清楚如何为每个玩家交出26张牌。

这段代码现在做的是使用Fisher-Yates算法对套牌进行洗牌,并输出一个包含现在洗牌的牌组的字符串。 我以为这会返回一个数组,因为我使用的是“to_a”方法,但我不认为是这种情况。

然后,我如何处理每个玩家的牌组? 我需要桌子或球员的等级吗? 任何正确方向的帮助都会很棒。 请再说一遍,请不要为我解决。 我想尽可能地为自己解决这个问题。 编辑:使用1.9.3,如果这是有用的。

class Card VALUE = %w(2 3 4 5 6 7 8 9 10 JQKA) attr_accessor :rank def initialize(id) self.rank = VALUE[id % 13] end end class Deck attr_accessor :cards def initialize self.cards = (0..51).to_a.shuffle.collect { |id| Card.new(id) } end end class Array def shuffle! each_index do |i| r = rand(length-i) + i self[r], self[i] = self[i], self[r] end end def shuffle dup.shuffle! end end d = Deck.new d.cards.each do |card| print "#{card.rank} " end 

有很多方法可以做到这一点。 我没有解决它,但开始了一些你可以添加到结构游戏中的基本类。 我会在你的Deck课程中添加一个方法,从甲板上取一张牌。 此外,“玩家”类对于代表每个玩家都很有用。 每个玩家对象都有一个持有牌的手牌属性:

 class Deck def remove_card self.cards.pop # removes a card from end of array end def empty? self.cards.count == 0 end end d = Deck.new d.cards.count #=> 52 cards p = Player.new p.hand << d.remove_card d.cards.count #=> 51 cards now that one has been removed 

你的牌组将牌固定在arrays中。 你的输出是一个字符串,因为你打印出了排名,但是card属性确实是一个包含卡片对象的数组。 你也可以有一个游戏类来处理游戏:

 class Game def initialize(player1, player2) @player1 = player1 @player2 = player2 end def play_poker @deck = Deck.new # give each player five cards 1.upto(5) do |num| @player1.hand << @deck.remove_card @player2.hand << @deck.remove_card end # each player has a five card hand at this point # omitted code, have a method to score the two hands and determine the winner end def play_war # omitted code, have players issued cards # omitted, instructions, game play code end end 

所以你可以让游戏玩不同的游戏。 评分和输出是您需要添加的其他方法。 我也省略了你要做的Player类。 但你可以玩这样的游戏:

 p1 = Player.new p2 = Player.new game = Game.new(p1, p2) game.play_poker #=> output could be text like: Player 1's hand: A, 4, 4, 2, Q, Player 2's hand:...... etc #=> winner is Player 1! 

评分可以通过游戏类中的方法完成。 它还会输出上面的文字,打印每个玩家获得的牌以及谁赢了。 如果使用相同的游戏对象进行许多游戏,则必须确保玩家​​清理双手,使用新的牌组(或进行重新洗牌)等等。

如果你真的想让两个人玩,你就会有按钮控制每一步。 H要打或留下等等。 希望这可以帮助。