简单的剪刀石头布游戏

Simple rock, paper, scissors game

我写了一个"Rock, paper, scissors"游戏:

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

它有效,但是,有很多 elsif,而且我知道这可以通过 case...when 语句实现,但我不知道如何实现。

我试图根据输入使用 return 语句:"return 0 for rock, 1 for paper and 2 for scissors",然后使用条件语句来表达类似 "hey, if player one returns 1 and player 2 also returns 1, then 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

如有任何帮助,我将不胜感激。

您可以尝试这样的操作:

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

你也可以做 ruby 相当于说

  If p1 = 'r' then

转到R 万一 如果 p1 = 'p' 那么 转到 S 结尾

然后稍后在您的转到位置

回复:

如果 p2 = 'r' 那么 放 "tie"

然而 p1 = p2 then ... 的想法是个好主意。

我会使用 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

一个数组可以作为一个环,每一项都有 右边是较弱的项目,左边是较强的项目。

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

select 武器以你最喜欢的方式

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

旋转数组直到w1在中心

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

现在结果由 weapons 数组中 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 covers rock

这是另一种方式:

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 :-|