2013-10-27 40 views
0

這是我的代碼:在Ruby中的紙,剪刀,岩石遊戲。當一個數組變化的數據,它改變了另一個數組的數據(?¿)

class RockPaperScissors 

    # Exceptions this class can raise: 
    class NoSuchStrategyError < StandardError 
    end 

    def self.winner(player1, player2) 
    if ((player1[1] == 'R') && (player2[1] == 'S') || 
     (player1[1] == 'S') && (player2[1] == 'P') || 
     (player1[1] == 'P') && (player2[1] == 'R')) 
     return player1 
    elsif ((player1[1] == 'R') && (player2[1] == 'P') || 
     (player1[1] == 'S') && (player2[1] == 'R') || 
     (player1[1] == 'P') && (player2[1] == 'S')) 
     return player2 
    elsif ((player1[1] == 'R') && (player2[1] == 'R') || 
     (player1[1] == 'S') && (player2[1] == 'S') || 
     (player1[1] == 'P') && (player2[1] == 'P')) 
     return player1 
    end 

    end 

    def self.tournament_winner(tournament) 
    player1 = Array.new 
    player2 = Array.new 
    nextround = Array.new 

    while tournament.length != 1 do 

     tournament.each_with_index {|item, index| 
     if (index%2!=0) 
      player2[0] = item[0] 
      player2[1] = item[1] 
     elsif (index%2 ==0) 
      player1[0] = item[0] 
      player1[1] = item[1] 
     else 
      puts 'bananas' 
     end 

     if (index%2!=0) 
      nextround[(index-1)/2] = winner(player1, player2) 
     end 
     } 
     tournament=nextround 
    end 
    return tournament 

    end 
end 



RockPaperScissors.tournament_winner([["num1", "R"], ["num2", "P"], ["num3", "P"], ["num4", "R"]]) 

好了,最後一行是執行發射。這段代碼使岩石,剪刀的比賽。它將每個角色及其攻擊的陣列數組作爲輸入,並且必須返回數組中的冠軍及其攻擊。

比賽是num1 vs num2(num2 wins),而num3 vs num4(num3 wins)。然後決賽是Num2 vs Num3,並且在這個穩定的隊友中贏得陣列中的第一個人(Num2)。

它似乎過於複雜,因爲代碼必須使用任意數量的字符,只要它們的編號是base2(2,4,8,16個字符...等)。

我的問題是下一步(調試代碼,你會看到)。當它改變數組'Player1'或'Player2'的值時,它也會改變數組'nextround'中的值,即使它不在該行中!

這不是假定發生!

順便說一句,我正在學習Ruby,所以這可能是一個非常愚蠢的失敗。

+0

好的,它已經解決了。 看起來數組'nextround'包含[player1,player2]或類似的東西。 – pfernandez

+0

tournament_winner的第一個參數是'[「num1」,「R」]'。這是否意味着玩家1將始終播放「R」?如果是這樣,如果在比賽的某個時刻,玩家1遇到玩家4,而玩家「R」,會發生什麼?如果沒有,請澄清你對每個玩家使用策略的解釋。 –

回答

0

爲什麼這需要是真的?

「看起來過於複雜是因爲代碼必須使用任意數量的字符,只要它們的編號是base2(2,4,8,16個字符......等)。」

反而讓player1和player2成爲數組,我會將它們改寫爲類Player的實例。然後寫方法Player類,所以你可以調用player1.hand並返回'S' || 'R' || 'P'

這樣你可以存儲一個球員多少贏得了玩家對象,

的事情,我會考慮更多地瞭解

  • 殼體/當語句

  • 特殊initialize方法

  • attrs_accessor(用於進行跨類訪問數據)

  • 模塊

也是我見過做,我可能是錯的這一點,但一般你不把內部類的類。