简单的剪刀石头布游戏
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 :-|
我写了一个"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 :-|