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

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

ただいまの
回答率

88.93%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,232

garchomp

score 128

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

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

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

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

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

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

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

# coding: utf-8

x=rand(10)
y=rand(5)
z=(15)



puts "ready?"

def ques(a,b)
  return puts "#{a}*#{b}は?"
end
def ans(a,b)
  return a*b
end


def lops(a,b)
  puts ques(a,b)
  answer=gets.chomp.to_i

  if answer==ans(a,b)
    return puts "clear"
  else
    return puts "error!"
  end
end

#
#
#

def ques3(a,b,c)
  return puts "#{a}*#{b}+#{c}は?"
end
def ans3(a,b,c)
  return a*b+c
end


def lops3s(a,b,c)
  puts ques3(a,b,c)
  answer=gets.chomp.to_i

  if answer==ans3(a,b,c)
    puts "clear!"
  else
    puts "error!"
  end
end

$count
setready=gets.chomp

if setready=="yes"
  checks=1
  lopsblock=[lops(x,y),lops(y,z),lops(z,x),lops3s(x,y,z)]
  lopslength=lopsblock.length.to_f
  puts 
  lopsblock.each do|a|
    $count+=1 if a=="clear!"
    end
  end

  if checks==1
    total=lopslength*100/$count.to_f 
#変数と数字の掛算、割り算でエラーになる。
#また、lopslengthのlength取得もできていないため、正確な計算ができない


      puts "あなたの正解率は、#{total}%です。"
  end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+2

# encoding: utf-8

x = rand(10)
y = rand(5)
z = 15

que_mode = [[x, y], [y, z], [z, x], [x, y, z]]

def make_question(mode)
  ans = []
  mode.each do |e|
    if e.size == 2
      ans << ["#{e[0]}*#{e[1]}は?", e[0] * e[1]]
    else
      ans <<  ["#{e[0]}*#{e[1]}+#{e[2]}は?", (e[0] * e[1]) + e[2]]
    end
  end
  return ans
end

count = 0
ques = make_question(que_mode)

puts 'ready?'
sel = gets.chomp
exit if sel != 'yes'
puts ''

ques.each do |que|
  puts que[0]
  input = gets.chomp.to_i
  if input == que[1]
    puts 'clear!'
    count += 1
  else
    puts 'error!'
  end
  puts '-' * 20
  puts ''
end

puts "あなたの正解率は、#{(count / ques.size.to_f) * 100}%です。"

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

補足

# coding: utf-8

x=rand(10)
y=rand(5)
z=(15)



puts "ready?"

def ques(a,b)
  return puts "#{a}*#{b}は?"
end
def ans(a,b)
  return a*b
end


def lops(a,b)
  puts ques(a,b)
  answer=gets.chomp.to_i

  if answer==ans(a,b)
    puts "clear"
    return "clear!"
  else
    return puts "error!"
  end
end

#
#
#

def ques3(a,b,c)
  return puts "#{a}*#{b}+#{c}は?"
end
def ans3(a,b,c)
  return a*b+c
end


def lops3s(a,b,c)
  puts ques3(a,b,c)
  answer=gets.chomp.to_i

  if answer==ans3(a,b,c)
    puts "clear!"
    return "clear!"
  else
    puts "error!"
  end
end

count = 0
setready=gets.chomp

if setready=="yes"
  checks=1
  lopsblock=[lops(x,y),lops(y,z),lops(z,x),lops3s(x,y,z)]
  lopslength=lopsblock.length.to_f
  puts 
  lopsblock.each do|a|
    count+=1 if a=="clear!"
    end
  end

  if checks==1
    total = (count / lopslength.to_f) * 100


      puts "あなたの正解率は、#{total}%です。"
  end


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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 15:42

    補足ありがとうございます!

    なるほど…to_fは末尾に付けるだけでなく、必要な要素それぞれにつけることで対処できると…φ(..)メモメモ

    キャンセル

  • 2017/05/11 16:08

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

    キャンセル

  • 2017/05/11 16:11

    おっと・・・了解しました!
    そういえば色々な省略記法もありましたね…慣れていないのでだらだらと書いてしまいました^^;

    とりあえず基本をしっかり押さえつつ、スマートに書けるように頑張りますw

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る