2017-01-21 3 views
3

Ich versuche, zwei Sub-Arrays gleichzeitig in einem Array zu fangen - irgendwelche Ideen, wie man das macht?Wie iteriert man über ein 2D-Array in Inkrementen und erhöht das Inkrement mit Ruby?

Beispiel:

deck = [[2,spades],[3,hearts],[6,diamonds],[10,clubs],[8,hearts],[9,clubs]] 

Gibt es eine Möglichkeit zwei Karten zu einem Zeitpunkt mit einer Schleife zu greifen, so dass der Index jedes Mal, und gehen Sie erhöhen würde von [0..1] und dann [1..0 ] und so weiter, um zwei Karten gleichzeitig zu greifen.

würde ich setzen mag:

Spieler 1 Karten: [2,spades],[3,hearts]

Spieler 2 Karten: [6,diamonds],[10,clubs]

+0

Beachten Sie, dass die Tatsache, dass jeder Element von "Deck" ist ein Array ist irrelevant. Dieselbe Lösung würde gelten, wenn "deck = [: card1,: card2, ...,: card6]". Meinst du übrigens "Spaten" oder "Leerzeichen"? Wie gesagt, 'Spaten' müssen eine Variable oder eine Methode sein. –

+0

@max paspa hat eine der angegebenen Antworten für Sie funktioniert? Wenn dies der Fall ist, wählen Sie bitte eine Antwort aus, damit diese als eine Frage mit einer Antwort angezeigt wird, wenn Benutzer suchen. Vielen Dank! – OneNeptune

Antwort

2

Versuchen Sie, diese

hands = array.each_slice(hand_size).take(player_count) 

hands.each_with_index do |hand, n| 
    puts "player #{n + 1} cards are: #{hand}" 
end 

Wie funktionierts?

  • each_slice(n) schneidet das Array in Stücke einer Länge n
  • take(n) nimmt die ersten n Stücke
0

Sie Enumerable::each_slice

deck = [[2,"spades"],[3,"hearts"],[6,"diamonds"],[10,"clubs"],[8,"hearts"],[9,"clubs"]] 

deck.each_slice(2) do |el| 
    puts el 
end 
3
verwenden könnte

würde meine Empfehlung nur das Deck passieren zu In eine Methode einreihen und ein Array mit [player1, player2, deck] zurückgeben. Wenn Sie nur von der "Oberseite" des Decks zeichnen, können Sie einfach shift verwenden, um das erste Element aus dem Array zu entfernen.

The Long Lösung

deck = [[2,"spades"],[3,"hearts"],[6,"diamonds"],[10,"clubs"],[8,"hearts"],[9,"clubs"]] 

def drawTwo(arr) 
    if arr.count >= 4 
    player_one = [deck.shift, deck.shift] 
    player_two = [deck.shift, deck.shift] 
    return [player_one, player_two, deck] 
    else 
    return "Not enough cards in deck, please provide a new deck" 
    end 
end 

round = drawTwo(deck) 
player_one = round[0] 
player_two = round[1] 
deck = round[2] 

puts "Player one: #{player_one}" 
puts "Player two: #{player_two}" 
puts "Deck: #{deck}" 

Ich versuchte ziemlich detailliert und diesen Code nicht viel zu verschleiern, so dass es ziemlich erklärend lesen sollte.

Man könnte es ein bisschen kürzer machen, indem es so umschreiben, wollte ich es nur verständlich sein, was passiert war:

Die kondensierte Lösung

deck = [[2,"spades"],[3,"hearts"],[6,"diamonds"],[10,"clubs"],[8,"hearts"],[9,"clubs"]] 

def drawTwo(arr) 
    arr.count >= 4 ? [[arr.shift, arr.shift], [arr.shift, arr.shift]] : raise "Not enough cards..." 
end 

player_one, player_two = drawTwo(deck) 

puts "Player one: #{player_one}" 
puts "Player two: #{player_two}" 
puts "Deck: #{deck}" 

sicher sein, ein deck.shuffle enthalten, wenn Sie Erzeuge zuerst das Deck.

Auch ich weiß nicht, was Sie mit dem Deck zu erzeugen, aber da ich hatte Spaß mit ihm:

Erzeugung eines Shuffled Deck

def newShuffledDeck 
    ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"] 
    suits = ["hearts", "spades", "clubs", "diamonds"] 
    deck = ranks.product(suits) 
    deck.shuffle 
end 
+0

Einige Ruby-Tipps - Sie können 'player_one, player_zwei, deck = drawTwo (deck)' schreiben, Ruby erledigt das Auspacken für Sie.Es ist auch nicht nötig, das "Deck" von der Funktion zurückzugeben. Ich nehme an, dass Sie einen Hintergrund in Sprachen haben, die "nach Wert" gehen. In Ruby ist alles "pass by pointer". – akuhn

+0

@akuhn gute Vorschläge, danke! In Bezug auf das zurückkehrende Deck ging ich davon aus, dass es in einer Art Spiel mehrmals laufen würde, also würden sie das aktualisierte Deck nicht brauchen, um weiter zu Runde 2, 3 usw. ohne die gleichen Karten zu spielen? – OneNeptune

+0

Das "Deck", das Sie zurückgeben, zeigt auf das gleiche Objekt wie das "Deck", das Sie an die Funktion übergeben. Daher keine Notwendigkeit, es zurückzugeben. – akuhn

Verwandte Themen