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

时间:2014-03-09 04:37:09

标签: ruby war

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

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

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

class Card
    VALUE = %w(2 3 4 5 6 7 8 9 10 J Q K A)

    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

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。我没有解决它,但开始了一些你可以添加到结构游戏中的基本类。我会在你的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

你的牌组将牌固定在阵列中。你的输出是一个字符串,因为你打印出了排名,但是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要打或留下等等。希望这会有所帮助。