2014-01-28 2 views
0

Я прихожу в Ruby с Java и не очень комфортно с ним на второй день. Я делаю это, чтобы инициализировать колоды карт с заданным количеством колод. Скажем, я буду играть с 2 колодами карт, по 52 карты в каждой колоде и, следовательно, 104 карты в общей сложности (Jokers не используются). Моя программа выходит:Инициализировать массив с помощью цикла в Ruby

def initialize(num) 
    @num_of_decks = num 
    # initialize my cards here... 
end 

После инициализации, я хочу, чтобы мои карты, чтобы быть:

cards = {"Diamond A", "Diamond 2", ... "Diamond K", 
     "Club A", ... 
     ... 
     "Spade A", ... "Spade K", // end of the first deck 
     "Diamond A", ... 
     ... 
     "Spade A", ... "Spade K" // end of the second deck 
     } 

Я хочу, чтобы моя программа, чтобы иметь возможность адаптироваться к любой num_of_decks есть. На самом деле у меня нет четкого представления о том, как работают рубиновые петли, особенно когда кажется, что в Ruby не работают петли for. Надеюсь, кто-нибудь может привести здесь пример, чтобы я мог изучить, как он работает.

+3

Вы путаете свой синтаксис, это не действует рубин. Массивы используют '[]', хеши используют '{}'. – meagar

+0

Если вы исходите из фона Java, вы должны продумать свой путь через это. Это относительно прямолинейная проблема кодирования. Шаги, которые вы предпримете, будут идентичны, хотя синтаксис будет другим, и результаты могут быть не такими идиоматическими, какими они могут быть. – meagar

ответ

4
faces = %w(A 2 3 4 5 6 7 8 9 10 J Q K) 
suits = %w(Diamond Club Heart Spade) 
deck = suits.product(faces).map { |p| p.join ' ' } 

def initialize(num) 
    @num_of_decks = num 
    cards = deck * num 
end 
0

Вы можете использовать:

a = ['Spade', 'Diamond', 'Club', 'Heart'] 
b = ['A', *('2'..'10'), 'J', 'Q', 'K'] 
cards = a.product(b).collect { |a| a.join(' ') } 
total_cards = [*(cards * num_of_decks)] 
# => ["Spade A", "Spade 2", "Spade 3", "Spade 4", ..., "Diamond A", "Diamond 2", "Diamond 3", ..., "Spade A", "Spade 2", "Spade 3", "Spade 4", ...] 

И here, где вы можете играть с ним.

3

Хммм, я не совсем уверен, что вы просите, но, возможно, что-то подобное будет работать?

class DrawPile 
    CARD_SUITS = ["Diamond", "Heart", "Spade", "Club"] 
    CARD_FACES = ["A", *(2..10).map(&:to_s), "J", "Q", "K"] 
    A_DECK = CARD_SUITS.product(CARD_FACES).map{|x| x.join " "} 
    def initialize(num) 
    @num_of_decks = num 
    @cards = (A_DECK * num).shuffle 
    end 

    attr_reader :num_of_decks, :cards 
end 

Использование:

pile = DrawPile.new(2) 
pile.num_of_decks #=> 2 
pile.cards #=> ["Spade 2", "Spade K", "Heart 4", "Heart 7", ...] 
+1

+1 Хорошее предложение с 'shuffle' – Matt

0
suits = ['spades', 'diamonds', 'clubs', 'hearts'] 
values = ['Ace', '2', '3', '4', 'Jack', 'Queen'] 
cards = suits.product(values).map{|suit, value| "#{value} of #{suit}"} 

p cards #=> ["Ace of spades", "2 of spades", "3 of spades", "4 of spades", "Jack of spades" 
Смежные вопросы