HW不可能?:“在ruby中创建一个没有使用条件的岩石剪刀程序”

我正在进行一个介绍性的软件开发课程,我的作业是创建一个岩石剪刀程序,它带有两个参数(摇滚,纸张)等,并返回获胜的arg。

如果我可以使用条件语,现在我会快速解决这个问题,但是作业说我们需要知道的一切都在ruby教科书的前三章中,而这些章节不包括条件语! 没有它们可以创建这个程序吗? 或者他只是期望我们足智多谋并使用条件? 虽然这是一个非常简单的条件分配…我想我可能会在这里遗漏一些东西。

编辑:我正在考虑那个chmod数值系统,并认为通过该添加系统可以实现解决方案……

这是仅使用哈希的一个:

 RULES = { :rock => {:rock => :draw, :paper => :paper, :scissors => :rock}, :paper => {:rock => :paper, :paper => :draw, :scissors => :scissors}, :scissors => {:rock => :rock, :paper => :scissors, :scissors => :draw} } def play(p1, p2) RULES[p1][p2] end puts play(:rock, :paper) # :paper puts play(:scissors, :rock) # :rock puts play(:scissors, :scissors) # :draw 
 def winner(p1, p2) wins = {rock: :scissors, scissors: :paper, paper: :rock} {true => p1, false => p2}[wins[p1] == p2] end 

获胜者(:摇滚,摇滚)#=>:摇滚乐哦! – 托克兰

按@sarnold,留下这个作为学生的练习:)。

我非常怀疑你已经看过arrays/集合交叉点,所以只是为了好玩:

 def who_wins(p1, p2) win_moves = {"rock" => "paper", "paper" => "scissors", "scissors" => "rock"} ([p1, p2] & win_moves.values_at(p1, p2)).first end who_wins("rock", "paper") # "paper" who_wins("scissors", "rock") # "rock" who_wins("scissors", "scissors") # nil 

一个简单的哈希救援:

 def tell_me(a1, a2) input = [a1 , a2].sort.join('_').to_sym rules = { :paper_rock => "paper", :rock_scissor => "rock", :paper_scissor => "scissor"} rules[input] end 

我认为最简单的解决方案必须是这样的:

 @results = { 'rock/paper' => 'paper', 'rock/scissors' => 'rock', 'paper/scissors' => 'scissors', 'paper/rock' => 'paper', 'scissors/paper' => 'scissors', 'scissors/rock' => 'rock' } def winner p1, p2 @results["#{p1}/#{p2}"] end 
 WINNAHS = [[:rock, :scissors], [:scissors, :paper], [:paper, :rock]] def winner(p1, p2) (WINNAHS.include?([p1,p2]) && p1) || (WINNAHS.include?([p2,p1]) && p2) || :tie end winner(:rock, :paper) #=> :paper winner(:scissors, :paper) #=> :scissors winner(:scissors, :scissors) #=> :tie 

我对ruby知之甚少,但是我很久以前通过使用每个值来解决这个问题(例如,R = 1,P = 2,S = 3)。

实际上,我只是在考虑了这个问题之后用 google搜索,并且有人使用数组解决了python中的问题。

上面的pguardiario解决方案可以根据以下内容进行修改,以显示(1)哪个玩家获胜(与赢得的对象的选择相对)和(2)有平局时的结果:

 def rps(p1, p2) @results = { 'rock/paper' => "Player 2 won!", 'rock/scissors' => "Player 1 won!", 'paper/scissors' => "Player 2 won!", 'paper/rock' => "Player 1 won!", 'scissors/paper' => "Player 1 won!", 'scissors/rock' => "Player 2 won!", 'rock/rock' => "Draw!", 'scissors/scissors' => "Draw!", 'paper/paper' => "Draw!" } @results["#{p1}/#{p2}"] end rps("rock", "rock") => "Draw!" rps("rock", "scissors") => "Player 1 won!" rps("rock", "paper") => "Player 2 won!" 

…等等