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

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

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

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

Q&A

1回答

1927閲覧

コマンドプロンプトで計算ゲームをしたいが、正解率の所でエラーになる件

garchomp

総合スコア128

Ruby

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

0グッド

1クリップ

投稿2017/05/10 08:58

ご覧いただきありがとうございます。

現在、コマンドプロンプト(ターミナル)で計算ゲームをするプログラムを作っています(おもに練習用です)

まだrubyの勉強初めて一週間もたっていないので知識がばがばで恐縮です(少しだけjavascriptは触れていました)

問題を出題し、結果をreturnするところまでは出来てます。
各問題の配列をlengthで取得したものを変数に代入し、%で出す場合はいったん100倍にする必要がある為

配列length*100/正解数
で出そうとしていますが、うまく実行できません。

また、正解数は、countで計算して出そうとしています。

意図したとおりに結果を出力するには、いったいどうしたらよろしいのでしょうか?

ruby

1# coding: utf-8 2 3x=rand(10) 4y=rand(5) 5z=(15) 6 7 8 9puts "ready?" 10 11def ques(a,b) 12 return puts "#{a}*#{b}は?" 13end 14def ans(a,b) 15 return a*b 16end 17 18 19def lops(a,b) 20 puts ques(a,b) 21 answer=gets.chomp.to_i 22 23 if answer==ans(a,b) 24 return puts "clear" 25 else 26 return puts "error!" 27 end 28end 29 30# 31# 32# 33 34def ques3(a,b,c) 35 return puts "#{a}*#{b}+#{c}は?" 36end 37def ans3(a,b,c) 38 return a*b+c 39end 40 41 42def lops3s(a,b,c) 43 puts ques3(a,b,c) 44 answer=gets.chomp.to_i 45 46 if answer==ans3(a,b,c) 47 puts "clear!" 48 else 49 puts "error!" 50 end 51end 52 53$count 54setready=gets.chomp 55 56if setready=="yes" 57 checks=1 58 lopsblock=[lops(x,y),lops(y,z),lops(z,x),lops3s(x,y,z)] 59 lopslength=lopsblock.length.to_f 60 puts 61 lopsblock.each do|a| 62 $count+=1 if a=="clear!" 63 end 64 end 65 66 if checks==1 67 total=lopslength*100/$count.to_f 68#変数と数字の掛算、割り算でエラーになる。 69#また、lopslengthのlength取得もできていないため、正確な計算ができない 70 71 72 puts "あなたの正解率は、#{total}%です。" 73 end 74

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

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

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

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

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

guest

回答1

0

Ruby

1# encoding: utf-8 2 3x = rand(10) 4y = rand(5) 5z = 15 6 7que_mode = [[x, y], [y, z], [z, x], [x, y, z]] 8 9def make_question(mode) 10 ans = [] 11 mode.each do |e| 12 if e.size == 2 13 ans << ["#{e[0]}*#{e[1]}は?", e[0] * e[1]] 14 else 15 ans << ["#{e[0]}*#{e[1]}+#{e[2]}は?", (e[0] * e[1]) + e[2]] 16 end 17 end 18 return ans 19end 20 21count = 0 22ques = make_question(que_mode) 23 24puts 'ready?' 25sel = gets.chomp 26exit if sel != 'yes' 27puts '' 28 29ques.each do |que| 30 puts que[0] 31 input = gets.chomp.to_i 32 if input == que[1] 33 puts 'clear!' 34 count += 1 35 else 36 puts 'error!' 37 end 38 puts '-' * 20 39 puts '' 40end 41 42puts "あなたの正解率は、#{(count / ques.size.to_f) * 100}%です。"

作ってみました。
質問者様のコードでは$countがnilになっていました。
return puts "clear!"では"clear!"は返ってきていないようです。

#補足

Ruby

1# coding: utf-8 2 3x=rand(10) 4y=rand(5) 5z=(15) 6 7 8 9puts "ready?" 10 11def ques(a,b) 12 return puts "#{a}*#{b}は?" 13end 14def ans(a,b) 15 return a*b 16end 17 18 19def lops(a,b) 20 puts ques(a,b) 21 answer=gets.chomp.to_i 22 23 if answer==ans(a,b) 24 puts "clear" 25 return "clear!" 26 else 27 return puts "error!" 28 end 29end 30 31# 32# 33# 34 35def ques3(a,b,c) 36 return puts "#{a}*#{b}+#{c}は?" 37end 38def ans3(a,b,c) 39 return a*b+c 40end 41 42 43def lops3s(a,b,c) 44 puts ques3(a,b,c) 45 answer=gets.chomp.to_i 46 47 if answer==ans3(a,b,c) 48 puts "clear!" 49 return "clear!" 50 else 51 puts "error!" 52 end 53end 54 55count = 0 56setready=gets.chomp 57 58if setready=="yes" 59 checks=1 60 lopsblock=[lops(x,y),lops(y,z),lops(z,x),lops3s(x,y,z)] 61 lopslength=lopsblock.length.to_f 62 puts 63 lopsblock.each do|a| 64 count+=1 if a=="clear!" 65 end 66 end 67 68 if checks==1 69 total = (count / lopslength.to_f) * 100 70 71 72 puts "あなたの正解率は、#{total}%です。" 73 end

これでいけると思います。
total=lopslength*100/$count.to_f
この計算式だと正解率が100%以外の場合に
「あなたの正解率は、133.33333333333334%です。」
みたいになります。(1問間違えの場合)
あとこの部分の

Ruby

1lopsblock.each do|a| 2 count+=1 if a=="clear!" 3 end 4 end

1つめのendはlopsblock.eachのendで
2つめのendはif setready=="yes"のendです。
count+=1 if a=="clear!"と書いた場合はendはいりません。

投稿2017/05/10 10:30

編集2017/05/11 07:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

garchomp

2017/05/11 00:01

解答ありがとうございます! def make...でifを使って実行される配列の内容によって形式を変えることですっきりできるんですね!勉強になりました! メソッドの使い方がまだまだ甘いと思いやられました^^; 正解率の処理の所でsize.to_f)*100することもできるんですね。。。 また、処理をイメージして、記述の無駄を減らして行けるように頑張ります。 ありがとうございました!
退会済みユーザー

退会済みユーザー

2017/05/11 05:51 編集

いえいえ。私も最近メソッドの勉強を始めたので、そこまでのものではないです。 参考にしてはいけませんよ。 正解率は恐らく (正解した数/全体) * 100 で求められると思ったのでそのようにしました。 Rubyのスタイルガイドによるとlengthよりもsizeの方が好ましい ということだったので私は最近sizeを使っています。
garchomp

2017/05/11 05:55

そうなんですね^^; まだ一週間もたっていない自分はすでに基本抑える所でいっぱいいっぱいです…^^; 自分も負けじと頑張っていきたいですw
garchomp

2017/05/11 06:42

補足ありがとうございます! なるほど…to_fは末尾に付けるだけでなく、必要な要素それぞれにつけることで対処できると…φ(..)メモメモ
退会済みユーザー

退会済みユーザー

2017/05/11 07:08

その部分はミスです。メモは消しておいてください(; ・`д・´)
garchomp

2017/05/11 07:11

おっと・・・了解しました! そういえば色々な省略記法もありましたね…慣れていないのでだらだらと書いてしまいました^^; とりあえず基本をしっかり押さえつつ、スマートに書けるように頑張りますw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問