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

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

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

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

Q&A

解決済

1回答

2174閲覧

引数の渡し方が間違っているのでしょうか?

Dach

総合スコア17

Ruby

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

0グッド

0クリップ

投稿2016/01/23 06:39

rubyでじゃんけんプログラムを作っているのですが、勝率・敗率等を出そうとしてもうまく動きません。

条件として、
・Rubyファイル、入力ファイル、出力ファイルの3つを用意
・入力ファイルには任意の数字を1文字づつ改行して記入
・出力ファイルには勝ち、負け、あいこを1行づつ記入
・じゃんけんのメソッドと勝敗の判定メソッドは別
というものです。

学びたてのため拙いプログラムですが、ぜひ解決策をご教示いただけると幸いです。


def judge(input,number,file,count,win,lose,draw)
if input == number
file.puts("#{count}回戦目はあいこです")
draw += 1
elsif (input == 0 && number == 1) || (input == 1 && number ==2) || (input == 2 && number == 0)
file.puts("#{count}回戦目はあなたの勝ちです")
win += 1
else
file.puts("#{count}回戦目はあなたの負けです")
lose += 1
end
end

def janken()
in_filename = ARGV[0] #入力ファイル
out_filename = ARGV[1] #出力ファイル
count = 1
win,lose,draw,probability = 0,0,0,0

in_file = open(in_filename)
out_file = open(out_filename,"w")
while number = in_file.gets()
puts "\n#{count}回戦目\n[0]:グー\n[1]:チョキ\n[2]:パー"
input = STDIN.gets #じゃんけんの手を入力
if input.to_i == 0 || input.to_i == 1 || input.to_i == 2
judge(input.to_i , number.to_i , out_file,count , win , lose , draw)
else
puts "入力ミスにより不戦敗です"
out_file.puts("#{count}回戦目はあなたの負けです")
end
count += 1
end

puts "\n勝率、敗率、引き分け率のどれが知りたいですか?\n[0]勝率\n[1]敗率\n[2]引き分け率\n[3]別にいい\n"
number = STDIN.gets
if number.to_i == 0
probability = win / count * 100
elsif number.to_i == 1
probability = lose / count * 100
elsif number.to_i == 2
probability = draw / count * 100
else
exit
end

puts "#{probability}%です"

in_file.close
out_file.close
end

janken()

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1$ irb 2irb(main):001:0> 1 / 3 * 100 3=> 0 4irb(main):002:0> 100 * 1 / 3 5=> 33

↑は、整数の割り算の結果は小数点以下がきりすてられことで計算結果が異なる様子を示したものです。

この点と、すこし気になる点を変更したコードを以下に示します。

ruby

1def judge(input, number, file, count, win, lose, draw) 2 input = input.to_i 3 number = number.to_i 4 if (input < 0) || (2 < input) 5 puts '入力ミスにより不戦敗です' 6 file.puts("#{count}回戦目はあなたの負けです (#{input} #{number})") 7 lose += 1 8 else 9 if input == number 10 file.puts("#{count}回戦目はあいこです (#{input} #{number})") 11 draw += 1 12 elsif (input == 0 && number == 1) || (input == 1 && number == 2) || (input == 2 && number == 0) 13 file.puts("#{count}回戦目はあなたの勝ちです (#{input} #{number})") 14 win += 1 15 else 16 file.puts("#{count}回戦目はあなたの負けです (#{input} #{number})") 17 lose += 1 18 end 19 end 20 [win, lose, draw] 21end 22 23def janken 24 in_filename = ARGV[0] #入力ファイル 25 out_filename = ARGV[1] #出力ファイル 26 count = 0 27 win, lose, draw = 0, 0, 0 28 29 in_file = open(in_filename) 30 out_file = open(out_filename, 'w') 31 while number = in_file.gets() 32 count += 1 33 puts "\n#{count}回戦目\n[0]:グー\n[1]:チョキ\n[2]:パー" 34 input = STDIN.gets # じゃんけんの手を入力 35 win, lose, draw = judge(input, number, out_file, count, win, lose, draw) 36 end 37 in_file.close 38 out_file.close 39 40 puts "\n勝率、敗率、引き分け率のどれが知りたいですか?\n[0]勝率\n[1]敗率\n[2]引き分け率\n[3]別にいい\n" 41 number = STDIN.gets.to_i 42 43 probability = nil 44 if number == 0 45 probability = 100 * win / count 46 elsif number == 1 47 probability = 100 * lose / count 48 elsif number == 2 49 probability = 100 * draw / count 50 end 51 52 puts "#{probability}%です" if probability 53 # puts "win=#{win}, lose=#{lose}, draw=#{draw}, count=#{count}" 54end 55 56janken

実行例

$ cat in.txt 1 2 $ ruby 2.rb in.txt out.txt 1回戦目 [0]:グー [1]:チョキ [2]:パー 1 2回戦目 [0]:グー [1]:チョキ [2]:パー 1 勝率、敗率、引き分け率のどれが知りたいですか? [0]勝率 [1]敗率 [2]引き分け率 [3]別にいい 0 50%です $ cat out.txt 1回戦目はあいこです (1 1) 2回戦目はあなたの勝ちです (1 2)

投稿2016/01/23 16:12

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問