對于記憶游戲,我正在嘗試用字母隨機填充二維陣列。
網格是size× size,每個字母出現兩次。
到目前為止,這是我的代碼。我不明白為什么它會出錯
alpha = ("A".."Z").to_a
letters_range = alpha[0...size*size/2]
chosen_letters = (letters_range letters_range).shuffle
(0...size).each do |row|
(0...size).each do |col|
letter = chosen_letters.select
@grid[row][col] = Card.new(letter)
letter_idx = chosen_letters.index(letter)
chosen_letters.delete_at(letter_idx) #error line
end
end
uj5u.com熱心網友回復:
chosen_letters是一個包含單個字串的陣列。
運行時letter = chosen_letters.select,您可能會假設Array#select回傳一個隨機元素。但是,當不向它傳遞一個塊時,它會回傳一個Enumerator. 因此,您的letter變數不包含chosen_letter陣列中的元素,因此無法找到該物件的索引,從而letter_idx導致nil.
要解決此問題,您可能需要使用更合適的陳述句來獲取元素,例如Array#pop回傳并洗掉陣列中的最后一個元素。
uj5u.com熱心網友回復:
由于chosen_letters已經洗牌,您不必選擇隨機元素。相反,您可以只使用陣列中pop的最后一個或shift第一個元素,這使您的回圈更加簡單:
(0...size).each do |row|
(0...size).each do |col|
letter = chosen_letters.shift
@grid[row][col] = Card.new(letter)
end
end
從一組卡片開始可能會更簡潔一些,例如為每個字母創建一對兩張卡片:
cards = letters_range.flat_map { |letter| [Card.new(letter), Card.new(letter)] }
cards.shuffle!
然后,您可以通過以下方式將卡片分配給網格:
(0...size).each do |row|
(0...size).each do |col|
@grid[row][col] = cards.shift
end
end
或者您可以通過以下方式從陣列中構建@grid權利each_slice:
@grid = cards.each_slice(size).to_a
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/495306.html
上一篇:帶有水豚的地圖元素
下一篇:洗掉帶括號的子運算式
