質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2234閲覧

rubyじゃんけんプログラム

simp

総合スコア18

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/11/24 13:42

編集2018/11/24 13:47

rubyでじゃんけんプログラムを作りたいと考えています。

ある程度完成はしていますが、少し悩んでいるところがあります。
標準入力でgを入力すればグーを出し、cを入力すればチョキ、pを入力すればパーを
出すといった感じにしたいのですがやり方がいまいちよくわかりません。
引き分けの場合は引き分けで終わらせます。

puts "最初はグーじゃんけん・・・・" def janken puts "[g]グー\n[c]チョキ\n[p]パー" player_hand = gets jankens = ["g","c","p"] program_hand = jankens[rand(3)] puts "あなたの手:#{jankens[player_hand]}, 相手の手:#{jankens[program_hand]}" if player_hand == program_hand puts "引き分けです" return false elsif(player_hand == "g" && program_hand == "c")||(player_hand == "c" && program_hand == "p")||(player_hand == "p" && program_hand == "g") puts "あなたの勝ちです" return false else puts "あなたの負けです" return false end end puts janken

これではエラーが出てしまいます。
解決できる方よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

rubocop というチェックプログラムで警告が出ないように書き直してみました。
メソッドも行数を少なくするために、if .. else .. end の条件分岐の代わりに、
ハッシュデータを使って処理をするようにしています。

a.rb

ruby

1HANDS = { 'g' => 'グー', 'c' => 'チョキ', 'p' => 'パー' }.freeze 2 3HANTEI = { 4 'gg' => :draw, 'gc' => :win, 'gp' => :lose, 5 'cg' => :lose, 'cc' => :draw, 'cp' => :win, 6 'pg' => :win, 'pc' => :lose, 'pp' => :draw 7}.freeze 8 9MESSAGES = { 10 win: 'あなたの勝ちです', 11 lose: 'あなたの負けです', 12 draw: '引き分けです', 13 nil => '無効です' 14}.freeze 15 16def janken 17 puts '[g]グー, [c]チョキ, [p]パー' 18 19 player_hand = gets.chomp 20 program_hand = HANDS.keys.sample 21 puts "あなたの手:#{HANDS[player_hand]}, 相手の手:#{HANDS[program_hand]}" 22 23 hantei = HANTEI["#{player_hand}#{program_hand}"] 24 puts MESSAGES[hantei] 25 hantei 26end 27 28puts '最初はグー じゃんけん・・・・' 29janken

実行例
イメージ説明

投稿2018/11/24 19:27

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

puts "あなたの手:#{player_hand}, 相手の手:#{program_hand}"
ですね。

あと、getsの値は改行文字も含むので、"g\n"とかになってしまいます。
そのため、勝敗判定の時に、どの条件も成立せず、必ずelseの負けになります。
player_hand = gets.chompと改行を取り除きましょう。

あとは、変な部分はありますが、一応動くと思います。

改善としては、player_handが、"g"でも"c"でも"p"でも無い場合には、再入力させた方が良いでしょう。今はどれでもないものを入力すると負けます。

投稿2018/11/24 15:10

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

simp

2018/11/24 15:14

回答ありがとうございます!できました! 再入力させる方法をできたらおしえていただけませんか?
otn

2018/11/24 15:22

jankens = ["g","c","p"] while true puts "[g]グー\n[c]チョキ\n[p]パー" player_hand = gets.chomp break if jankens.include?(player_hand) end program_hand = jankens[rand(3)]
simp

2018/11/25 00:56

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問