2013-01-17 133 views
2

我需要實現一個搖滾,紙張,剪刀比賽模擬器,它將發揮所有回合並返回錦標賽。紅寶石 - 岩石,紙。剪刀比賽

這是我的比賽數組:

tournament = [ 
    [ 
     [ 
      ["Armando", "P"], ["Dave", "S"] 
     ], 
     [ 
      ["Richard", "R"], ["Michael", "S"] 

     ], 
    ], 
    [ 
     [ ["Allen", "S"], ["Omer", "P"] ], 
     [ ["David E.", "R"], ["Richard X.", "P"] ] 
    ] 
] 

其中例如[ 「理查德」, 「R」],[ 「邁克爾」, 「S」]表示一個遊戲,理查德播放搖滾和Michael剪刀。理查德應該是贏家,並且會進入下一輪。

我想實現這個遞歸函數,但我遇到麻煩陣列權

這裏是我的方法:

def rps_tournament_winner(tournament) 

    qualifying_round_winners = [] 
    round_winners = [] 
    # last round 

    if tournament.length < 1 
    return 
    end 

    tournament.each_with_index do |round,i| 
puts round.inspect 
    qualifying_round_winners[i] = [] 
    round_winners = [] 
    round.each_with_index do |game,j| 
     winner = rps_game_winner(game) 
     round_winners.push winner 
    end 
    qualifying_round_winners[i] = round_winners 

    end 

    rps_tournament_winner(qualifying_round_winners) 
end 

我已經發明瞭很多與陣列符合條件的獲獎者但不能找出解決方案。 希望你能幫助我。 謝謝。

編輯:

這是我應該在方法

的每一次迭代得到弗里斯特輪

tournament = [ 
    [ 
     [ 
      ["Dave", "S"], ["Richard", "R"] 
     ], 
     [ 
      ["Allen", "S"], ["Richard X.", "P"] 

     ] 
    ] 
] 

經過第二輪後:

tournament = [ 
    [ 
     [ 
      ["Richard", "R"] , ["Allen", "S"] 
     ] 
    ] 
] 

得主

["Richard", "R"] 

編輯:2

這裏是全碼: http://pastebin.com/gjKfiWLD

+1

請澄清什麼樣的結果,你與你的代碼獲得,你想,而不是什麼樣的結果結束。 – PinnyM

+0

數組未正確傳遞給遞歸方法。它會在rps_game_winner函數中引發異常,因爲遊戲變量不正確。我將添加一個編輯到我的文章與應該的結果 – brpaz

+0

爲什麼你只需要使用數組呢?有什麼特別的原因嗎?這僅僅使用數組很麻煩。你可以使用散列,這將有助於更好地組織它(如果你必須使用盡可能少的東西,出於某種原因,像挑戰?)。然而,最好的方法是使用OOP設計一些東西。請給我們一些背景知道爲什麼你開始這樣做,你對這段代碼的想法是什麼,爲什麼只有數組等。 –

回答

6

有兩種情況下,我們不得不考慮,因爲我們遞歸:

要麼rps_tournament_winner的說法是遊戲或rps_tournament_winner的論點是一個比賽。請注意,錦標賽的一個子部分本身就是一個錦標賽(只需少一輪)。如果這是一場比賽,我們將返回贏家。如果這是一個分部/比賽,我們會考慮找到兩個孩子的獲勝者。

def rps_tournament_winner(tournament) 
    # Check if we're at a game 
    if tournament[0][0].is_a? String 
     return rps_game_winner(tournament) 
    end 
    # Otherwise keep going down the rabbit hole 
    return rps_game_winner([rps_tournament_winner(tournament[0]),rps_tournament_winner(tournament[1])]) 
end 

這是否幫助您理解?

+0

非常感謝。有用。我新開發它會讓我在做什麼更簡單。 – brpaz

+0

@ Bruno-P有些人發現它有助於如果他們在紙上繪製遞歸調用。只要把它放在那裏,就可以用來做遞歸的任何未來工作。 – mikemxm

0

它爲我工作。以下是具體步驟:

  1. 檢查,如果比賽[0] [0]是一個數組
    1.1返回遊戲優勝者
  2. 如果不是
    2.1遞歸調用賽事功能檢查,直到誰贏得參觀結束[0]
    2.2遞歸調用錦標賽功能檢查直到最後誰贏得巡迴賽[0]
    2。3遞歸調用賽事功能檢查,直到誰贏得巡迴[0] [1]
  3. 列表項