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

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

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

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

Q&A

解決済

2回答

585閲覧

ジャンケンがループしない

diego

総合スコア4

Ruby

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

0グッド

0クリップ

投稿2022/06/30 07:47

ruby

1コード 2``puts "あっち向いてホイを始めます" 3puts "ジャンケン・・・" 4class JankenAcchimuite 5 def initialize (draw ="あいこ",lose ="負け",win ="勝ち") 6 @draw = draw 7 @lose = lose 8 @win = win 9 end 10 11 def janken 12 #実装する 13 puts "[0]グー,[1]チョキ,[2]パー" 14 player_hand = gets.to_i 15 program_hand = rand(3) 16 17 jankens = ["グー","チョキ","パー"] 18 puts "あなたの手:#{jankens[player_hand]},相手の手:#{jankens[program_hand]}" 19 20 if player_hand == program_hand 21 puts "#{@draw}" 22 return true 23 elsif (player_hand == 0 && program_hand == 2 ) ||( player_hand == 1 && program_hand == 0 )||( player_hand == 2 && program_hand == 1) 24 puts "#{@lose}" 25 return false 26 elsif (player_hand == 0 && program_hand == 1 ) ||( player_hand == 1 && program_hand == 2 )||( player_hand == 2 && program_hand == 0) 27 puts "#{@win}" 28 return false 29 end 30 31 next_game = true 32 33 while next_game 34 next_game = janken 35 end 36 37 end 38 39 def acchimuite_hoi 40 puts "0(上)1(下)2(左)3(右)" 41 player_direction = gets.to_i 42 program_direction = rand(4) 43 directions = ["上","下","左","右"] 44 puts "あなた:#{directions[player_direction]} 相手:#{directions[program_direction]}" 45 46 if player_direction == program_direction 47 if @lose 48 puts "#{@lose}" 49 elsif @win 50 puts "#{@win}" 51 end 52 else 53 puts "#{@draw}" 54 55 end 56 end 57 58 result1 = JankenAcchimuite.new("あいこ","あっち向いて","あっち向いて") 59 puts result1.janken 60 result2 = JankenAcchimuite.new("もう一度ジャンケンを行います","負けました","勝ちました") 61 puts result2.acchimuite_hoi 62end 63 64 65、、、 66whileを使用しtrue,falseで戻しているつもりなのですが、ジャンケンがループせずにそのままあっち向いてホイに行ってしまいます。お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそもwhile next_gameループに行く前に結果に関わらすreturnしてるからループしません。
またそれを修正したとしてもwhile内でjankenメソッドを呼び出していないのでやはり意図通りループしません。
なおかつ適切にフラグ変数を設定していないので無限ループになっています。

投稿2022/06/30 16:38

編集2022/06/30 16:48
RiaFeed

総合スコア2701

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

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

diego

2022/07/01 12:47

returnはtrue,falseを返しているだけではないのでしょうか?
RiaFeed

2022/07/01 15:59

返すと同時に実行場所もjankenメソッドを呼び出した場所に戻ってしまうので、 現在提示のコードではwhile next_gameと書いている行が実行されることはありません。
diego

2022/07/02 15:11

申し訳ありません知識不足で上手く理解できているのかが分かりません。 returnよりも先にwhile next_gameが読み込まれれば大丈夫ということでしょうか?
RiaFeed

2022/07/04 10:34 編集

そもそも意図を推測する(あいこの時は決着つくまでじゃんけんを繰り返す?)感じではそもそもループの位置が間違っていると思います。 jankenメソッドの中でjankenメソッドを呼び出すなら再帰呼び出しすればいいのでwhileでループする必要がありません (とはいえ個人的に再帰は非推奨なのでよくわからなかったらスルーして) ループするならresult1.jankenの結果をputsせずに変数に入れてその変数を基にループさせる感じがいいのかな。 (本当はloop doにしたほうがいいけど更なる混乱を招きそうなのでこんな感じで) result1 = JankenAcchimuite.new("あいこ","あっち向いて","あっち向いて") next_game = result1.janken while next_game next_game = result1.janken end
diego

2022/07/09 08:46

すいません遅くなりました。 呼び出し位置が下にあるのに先にループしていたということですね… 分かりやすくありがとうございます。
guest

0

ジャンケンがループしない、んではなくて、ループはしてるんだけどその中で実行していない、ってことですね

next_game = janken

投稿2022/06/30 07:55

y_waiwai

総合スコア87774

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

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

diego

2022/07/01 12:54

実行してしてないとはどういったことでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問