2017-01-21 6 views
3

Я пытаюсь захватить два подмассива за один раз в массиве - любые идеи о том, как это сделать?Как вы выполняете итерацию по 2-мерному массиву с шагом и увеличиваете приращение рубином?

пример:

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

Есть ли способ, чтобы захватить две карты одновременно с петлей, так что индекс будет увеличиваться каждый раз, и перейти от [0..1], то [1..0 ] и т. д., чтобы одновременно захватить две карты.

Я хотел бы поставить:

игрок 1 карты: [2,spades],[3,hearts]

игрок 2 карты: [6,diamonds],[10,clubs]

+0

Заметьте, что тот факт, что каждый Элемент 'deck' - массив не имеет значения. Это же решение применимо, если 'deck = [: card1,: card2, ...,: card6]'. Кстати, вы имеете в виду '' spades ''или': spaces'. Как указано, 'spades' должен быть переменной или методом. –

+0

@max paspa выполнил любой из предоставленных ответов для вас? Если да, пожалуйста, выберите ответ, чтобы это отображалось как вопрос с ответом при поиске пользователей. Благодаря! – OneNeptune

ответ

2

Попробуйте

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

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

Как это работает?

  • each_slice(n) разрезает массив на куски длиной n
  • take(n) занимает первые n части
0

Вы можете использовать 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

Моя рекомендация будет просто пройти по палубе массива в метод и вернуть массив с [player1, player2, deck]. Если вы просто рисуете «верх» колоды, вы можете просто использовать shift, чтобы вывести первый элемент из массива.

Долгого Решение

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}" 

Я пытался быть довольно подробными и не запутать этот код так, он должен прочитать довольно толковым.

Вы могли бы сделать его немного короче, переписав его, как это, я просто хотел, чтобы это было понятно, что происходит:

конденсированного решения

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}" 

Обязательно включать deck.shuffle, когда вам сначала создайте колоду.

Кроме того, я не знаю, что вы используете для создания колоды, но так как я с удовольствием с ним:

генерируя перетасовал колоду

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

Некоторые подсказки Ruby - вы можете написать 'player_one, player_two, deck = drawTwo (deck)', Ruby делает распаковку для вас.Кроме того, нет необходимости возвращать «колоду» из функции, я предполагаю, что у вас есть фон на языках, которые «переходят по значению». В Ruby все «проходит по указателю». – akuhn

+0

@akuhn хорошие предложения, спасибо! Что касается возвращения колоды, я предположил, что это будет работать несколько раз в какой-то игре, так что им не понадобится обновленная колода, чтобы продолжить раунд 2, 3 и т. д., не используя одни и те же карты? – OneNeptune

+0

«Дека», на которую вы возвращаете, указывает на тот же объект, что и «колода», которую вы передаете функции. Поэтому нет необходимости возвращать его. – akuhn