0

我写了一个“石头、纸、剪刀”的游戏:

puts "Hello, this is a rock, papers, scissors game. Let's play."
puts "Player 1, plase enter your choice: \n"
puts "r for rock. \np for paper. \ns for scissors."
p1 = gets.chomp.downcase

puts "Player 2, please enter your choice: \n"
puts "r for rock. \np for paper. \ns for scissors."
p2 = gets.chomp.downcase

if p1 == 'r' && p2 == 's'
  puts "Player 1 wins."
elsif p1 == 'r' && p2 == 'p'
  puts "Player 2 wins."
elsif p1 == 'r' && p2 == 'r'
  puts "Tie."
elsif p1 == 'p' && p2 == 'r'
  puts "Player 1 wins."
elsif p1 == 'p' && p2 == 's'
  puts "Player 2 wins."
elsif p1 == 'p' && p2 == 'p'
  puts "Tie."
elsif p1 == 's' && p2 == 'r'
  puts "Player 2 wins."
elsif p1 == 's' && p2 == 'p'
  puts "Player 1 wins."
elsif p1 == 's' && p2 == 's'
  puts "Tie."
end

但是,它可以工作,这是很多elsifs,而且我知道这可以通过case...when语句来实现,问题是我无法弄清楚如何。

我试图return根据输入使用一个语句:“返回 0 表示石头,1 表示纸,2 表示剪刀”,然后使用条件语句说“嘿,如果玩家 1 返回 1 并且玩家 2 也返回 1 ,然后puts是 'tie'",其他可能的结果也是如此。

我试图将一个数字与结果相关联:return - 1当玩家一获胜时,return 0平局,以及return 2玩家二获胜。

我是这样做的,但又有点像,我觉得太糟糕了:

case p1
when p1 == 'r' && p2 == 'r'
  result = 0
when p1 == 'r' && p2 == 'p'
  result = 1
when p1 == 'r' && p2 == 's'
  result = -1
when p1 == 'p' && p2 == 'r'
  result = -1
when p1 == 'p' && p2 == 'p'
  result = 0
when p1 == 'p' && p2 == 's'
  result = 1
when p1 == 's' && p2 == 'r'
  result = 1
when p1 == 's' && p2 == 'p'
  result = -1
when p1 == 's' && p2 == 's'
  result = 0
end

if result == -1
  puts "P1 wins"
elsif result == 0
  puts "Tie"
elsif result == 1
  puts "P2 wins"
end

我将不胜感激任何帮助。

4

5 回答 5

1

数组可以用作一个环,每个项目在其右侧有一个较弱的项目,在其左侧有一个较强的项目。

weapons = ['paper', 'rock', 'scissors']

以您喜欢的方式选择武器

w1 = weapons[rand(weapons.length)]
w2 = weapons[rand(weapons.length)]

旋转数组直到 w1 位于中心

while weapons[1] != w1
    weapons.rotate! 1
end

现在结果由武器数组中 w2 的索引表示,方便。

verbs = ['is beat by', 'ties', 'beats']
puts "#{w1} #{verbs[weapons.index(w2)]} #{w2}"

几次运行的示例输出:

paper beats rock
paper ties paper
rock beats scissors
scissors beats paper
rock is beat by paper

您可以发挥创意并添加动词数组的哈希,每个武器一个,使用 w1 作为键,以便输出(例如)paper cover rock等。

于 2015-03-01T02:22:07.397 回答
0

你可以尝试这样的事情:

if (p1 == p2)
  puts "Tie"
elsif (p1 == 'r' && p2 == 'p') ||
      (p1 == 'p' && p2 == 's') ||
      (p1 == 's' && p2 == 'r')
  puts "P2 wins"
else
  puts "P1 wins"
end
于 2015-03-01T00:15:13.483 回答
0

你也可以做红宝石相当于说

  If p1 = 'r' then

goto R endif 如果 p1 = 'p' 然后 goto S endif

等等

然后稍后在您的转到位置

回复:

如果 p2 = 'r' 然后放 "tie"

等等

但是 p1 = p2 then ... 的想法很好。

于 2015-03-01T00:34:35.067 回答
0

这是另一种方式:

WINNERS = {s: :p, p: :r, r: :s}
  # => {:s=>:p, :p=>:r, :r=>:s} 

def win_lose_or_tie?(me, you)
  return "I win! :-)"   if WINNERS[me] == you 
  return "you win! :-(" if WINNERS[you] == me
  "it's a tie :-|"
end

keys = WINNERS.keys
keys.product(keys).each { |me, you|
  puts "If I play #{me} and you play #{you}, then #{win_lose_or_tie?(me, you)}" }
  # If I play s and you play s, then it's a tie :-|
  # If I play s and you play p, then I win! :-)
  # If I play s and you play r, then you win! :-(
  # If I play p and you play s, then you win! :-(
  # If I play p and you play p, then it's a tie :-|
  # If I play p and you play r, then I win! :-)
  # If I play r and you play s, then I win! :-)
  # If I play r and you play p, then you win! :-(
  # If I play r and you play r, then it's a tie :-|
于 2015-03-01T03:06:02.910 回答
-1

我会使用case/when声明,例如:

result = case [p1, p2]
         when %w[r r], %w[p p], %w[s s]
           0
         when %w[r p], %w[p s], %w[s r]
           1
         when %w[r s], %w[p r], %w[s p]
           -1
         end

puts case result
     when  0
      "Tie"
     when -1
      "P1 wins"
     when  1
      "P2 wins"
     end

但是,在写下这更有意义之后:

puts case [p1, p2]
        when %w[r r], %w[p p], %w[s s]
          'Tie'
        when %w[r p], %w[p s], %w[s r]
          'P1 wins'
        when %w[r s], %w[p r], %w[s p]
          'P2 wins'
        end

这是一个测试:

[
  %w[r r], %w[p p], %w[s s],
  %w[r p], %w[p s], %w[s r],
  %w[r s], %w[p r], %w[s p]
  ].each do |p1, p2|

    puts case [p1, p2]
         when %w[r r], %w[p p], %w[s s]
           'Tie'
         when %w[r p], %w[p s], %w[s r]
           'P1 wins'
         when %w[r s], %w[p r], %w[s p]
           'P2 wins'
         end

  end
# >> Tie
# >> Tie
# >> Tie
# >> P1 wins
# >> P1 wins
# >> P1 wins
# >> P2 wins
# >> P2 wins
# >> P2 wins
于 2015-03-01T01:05:14.053 回答