2014-05-20 87 views
0

在一個搖滾紙剪刀遊戲中,每個玩家選擇玩Rock(R),Paper(P)或Scissors(S)。規則是:岩石破碎剪刀,剪刀剪紙,但紙覆蓋岩石。在一輪搖滾紙剪刀中,每個玩家的名字和策略都被編碼爲兩個元素的陣列。創建一個RockPaperScissors類,它有兩個2個元素的陣列類似上面那些類方法的贏家,並返回表示贏家的一個:岩石剪刀 - 作業

RockPaperScissors.winner(['Armando','P'], ['Dave','S']) # => ['Dave','S'] 

如果任一遊戲者的策略比「R」,「P」以外的或「S」(case-SENSITIVE)時,該方法應產生'RockPaperScissors::NoSuchStrategyError'例外並提供消息:「策略必須是R,P,S之一」

如果兩個玩家使用相同的策略,球員是贏家。

我有我的代碼如下。我的代碼沒有正確比較這兩行字符串

(@p1[1,1]==rules["#{p}"][email protected]:@p2). 

請幫我一把。

class RockPaperScissors 

def winner(p1,p2) 
     @p1 = p1 
     @p2 = p2 
     p = (@p1[1,1][email protected][1,1]).sort 
     rules = Hash.new(0) 
     rules = {"PR"=>"R","PS"=>"S", "RS"=>"R", "PP"=>"1","RR"=>"1","SS"=>"1"} 
     if rules["#{p}"].nil? 
      raise RockPaperScissors::NoSuchStrategyError,"Strategy must be one of R,P,S" 
     elseif rules["#{p}"]=="1" 
      return @p1 
     else 
      print @p1[1,1] 
      print rules["#{p}"] 
      @p1[1,1]==rules["#{p}"][email protected]:@p2 
     end 
end 

end 
t = RockPaperScissors.new 
print t.winner(['Armando','R'], ['Dave','S']) 

回答

1

的一般提示:你不需要[1,1][1].last會更好。也不需要將rules初始化爲新的散列,只能保留行rules = {"PR"=>"R"...putsprint更常用。你有點過度了。也許清理你的代碼,試着用上面貼出的提示簡化它,看看這是否會讓你失去知覺。

一旦完成,看看哪些慣用的Ruby的解決方案可能看起來像,但沒有提交它作爲您的解決方案:

module RockPaperScissors 
    VALID_STRATEGIES = %i(R P S) 
    RULES = { R: :S, P: :R, S: :P } 

    def self.winner(p1, p2) 
    choice1, choice2 = p1.last.intern, p2.last.intern 
    unless [choice1, choice2].all? { |s| VALID_STRATEGIES.include? s } 
     raise RockPaperScissors::NoSuchStrategyError, "Strategy must be one of R,P,S" 
    end 
    return p1 if choice1 == choice2 
    RULES[choice1] == choice2 ? p1 : p2 
    end 
end 
+0

感謝您的答覆。你的代碼看起來優雅。你還可以評論爲什麼我的代碼不在@ p1 [1,1] ==規則[「#{p}」]?@ p1:@ p2行。比較運算符不評估兩個字符串值。 – user3657518

+0

@tilthouse這是OP的答案我想? –

+0

我刪除了我的評論,因爲我誤解了你的代碼 – tilthouse

1

當您在陣列上使用[1,1],您會收到大小1的數組從指數1開始:

[1,2,3][1,1] 
# => [2] 
[1,2,3][1] 
# => 2 

因爲,當你把它比作規則,你永遠不會得到true,因爲沒有規則是一個數組...的

["S"] == "S" 
# => false 

所以解決您的代碼,而不是

p = (@p1[1,1][email protected][1,1]).sort 
# ... 
(@p1[1,1]==rules["#{p}"][email protected]:@p2) 

你應該嘗試:

p = (@p1[1][email protected][1]).sort 
# ... 
(@p1[1]==rules[p][email protected]:@p2