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

それは機能しますが、それは多くのs であり、これがステートメントでelsif可能であることを知っています。問題は、方法がわかりません。case...when

return入力に応じてステートメントを使用しようとしていました。 、次にputs'tie'"、および他の可能な結果についても同じです。

私は数字を結果に関連付けようとしていました:return - 1プレーヤー 1 が勝った場合return 0、引き分けの場合、return 2プレーヤー 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 をキーとして使用して、各武器に 1 つずつ動詞配列のハッシュを追加して、(たとえば) paper cover rockなどを出力するように工夫することができます。

于 2015-03-01T02:22:07.397 に答える
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 に答える
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 If p1 = 'p' then goto S endif

その後、後でgotoの場所に

R:

p2 = 'r' の場合、「引き分け」

しかし、p1 = p2 then ... という考えは良いものです。

于 2015-03-01T00:34:35.067 に答える
-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 に答える