🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

438閲覧

Rubyでプログラムを終了するMethodが実行されない

konsai_gobo

総合スコア5

Ruby

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/09/06 06:41

編集2019/09/06 07:32

前提・実現したいこと

2日前からRubyを勉強しはじめ、今練習のためじゃんけんプログラムをつくっています。
作っている最中に出てきた疑問と実現できない部分があるので、ご教授いただけると幸いです。

実現したいこと
・あいこであれば、じゃんけんを繰り返す
・勝つか負けるかすると「もう一度ゲームをするか、やめるか」という分岐を出す

実現できない点
・勝つ/負けるの際、プログラムが終了してしまう(continue_orが作動しない)

疑問
・何故「puts "最初はグー、じゃんけん..." 」は、あいこの場合表示されず、最初だけ表示されるのか

Ruby

1def janken_play # じゃんけんのメソッド 2 puts "[0]:グー\n[1]:チョキ\n[2]:パー" 3 player = gets.to_i # ぐーちょきぱー選ばせる 4 program = rand(3) # 乱数処理 5 6 # じゃんけんの手(0−2)と対応した文字列が入ったオブジェクトを作成 7 janken = ["グー","チョキ","パー"] 8 9 # お互いの結果表示 10 puts "あなたの手は#{janken[player]}、わたしの手は#{janken[program]}" 11 12 if player == program # あいこ場合 13 puts "あいこで" 14 return true 15 elsif (program - player) % 3 == 1 16 puts "あなたのかちです" 17 return false 18 else # まけたの場合 19 puts "あなたのまけです" 20 return false 21 end 22 23def continue_or 24 puts "もう一度じゃんけんをする場合は[0]、ゲームをやめる場合は[1]" 25 player_conti = gets. to_i 26 27 if player_conti == 0 28 return true 29 elsif player_conti == 1 30 exit 31 else 32 return true 33 end 34 35end 36 37 38next_game = true # 1回目を実行するためにtrueを代入 39quit_game = false 40 41puts "最初はグー、じゃんけん..." # じゃんけん最初の表示 42 43# じゃんけんをくりかえす 44while next_game do 45 if next_game = janken_play 46 else quit_game = continue_or 47 end 48end 49

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

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

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

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

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

guest

回答2

0

ベストアンサー

呼び出されたメソッドの先で、(エラーでもないのに)プログラムを終了させるのはいまいちなので、

Ruby

1def continue_or 2 loop do 3 puts "もう一度じゃんけんをする場合は[0]、ゲームをやめる場合は[1]" 4 player_conti = gets. to_i 5 if player_conti == 0 6 return true 7 elsif player_conti == 1 8 return false 9 end 10 end 11end

にして、

Ruby

1while next_game do 2 if next_game = janken_play 3 else next_game = continue_or 4 end 5end

とかが、いいんじゃないでしょか。

投稿2019/09/07 01:45

otn

総合スコア85888

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

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

konsai_gobo

2019/09/07 15:14

なるほど!確かにエラーでもないのに終了させるのは?ですね。
guest

0

勝つ/負けるの際、プログラムが終了してしまう(continue_orが作動しない)

if文の使い方がおかしいです。
そもそも使う必要がなさそうだった。

rb

1loop do 2 janken_play 3 continue_or 4end

これで目的は果たせそうに見えます。

何故「puts "最初はグー、じゃんけん..." 」は、あいこの場合表示されず、最初だけ表示されるのか

ループの外にあるからです。

投稿2019/09/06 06:49

編集2019/09/06 06:59
Mugheart

総合スコア2349

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

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

konsai_gobo

2019/09/06 06:57

わかりました!ありがとうございます。 当初、勝ち/負けの場合プログラムを終了させていたとき while next_game do  next_game = janken_play end としていたので、それにひきずられていました。
Mugheart

2019/09/06 07:00 編集

ちょっと回答修正しましたが continue_or 内で exit されているのでif文を使う必要すらなさそうでした。
konsai_gobo

2019/09/06 07:26

なるほど!!quit_game = falseも不要なのですね。 loop他ループ系メソッドについてまだあまり理解できていないようなので、やってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問