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

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

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

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

Q&A

解決済

1回答

1361閲覧

外部ファイルの読み込み、それの表示

yusuke.

総合スコア66

Ruby

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

0グッド

0クリップ

投稿2016/06/23 09:20

昔友達と一緒に作った文なんですが、今作っているプログラムに使えないかと思い質問させていただきます。下記のような文なのですが今回も、外部ファイルから問題データを読み込んで、画面に表示したいのですが、この読み込んだものはどの部分でどのように表示されるようになっているのでしょうか。
この読み込んだものを変数に当てはめて表示するにはどうしたらいいでしょうか。
コメントを付けているもののほとんどが理解できません。詳しく教えていただければ嬉しく思います。
だいたい大事だとおもったところだけ載せています。すべての文が必要であれば、コメントいただけるとありがたいです。どうかよろしくお願いします。

ruby

1#...省略 2 3def yomikomi() #外部ファイルから問題データを読み込む 4 i = 0 5 j = 0 6 mondai = "mondai1.dat" #外部データファイル名(7行で1問題セットになっている) 7 moji = [] 8 $mondaisu = 0 #問題数-1の値 9 f = open("./dat/#{mondai}") 10 while text = f.gets do 11 moji[i] = text.chomp #データに含まれる改行コードの削除 12 i += 1 13 end 14 f.close 15 #問題データの行数 iを7で割ったもの 16 $mondaisu = i/7 17 while j <= i/7 18 eval("$q#{j} = [ moji[j*7+0],moji[j*7+1],moji[j*7+2],moji[j*7+3],moji[j*7+4],moji[j*7+5],moji[j*7+6] ]") 19 j += 1 20 end 21end 22 23#...省略 24def teki #敵の質問の場面 25 q = [];spc = " " 26 oto2(60) 27 win3 = Curses::Window.new(10, 78, 14, 1) 28 win3.box(?|,?-,?*) 29 win3.setpos(1, 1); win3.addstr("敵が質問を仕掛けてきた。どうする?") 30 win3.setpos(2, 1); win3.addstr("1:無視してそのまま進む 2:質問を受ける") 31 win3.setpos(3, 1) 32 win3.refresh 33 ans = win3.getch.to_i 34 if ans == 1 then 35 $fighter["kougeki"] -= 20 36 win3.setpos(3, 3); win3.addstr("攻撃力20ポイント減!") 37 win3.refresh 38 sleep 2 39 win3.setpos(1, 1); win3.addstr(spc) 40 win3.setpos(2, 1); win3.addstr(spc) 41 win3.refresh 42 end 43 if ans == 2 then 44 eval("q = $q#{rand($mondaisu)}.clone") 45 win3.setpos(1, 1); win3.addstr("それでは質問を始める! ") 46 win3.setpos(2, 1); win3.addstr(spc) 47 win3.refresh 48 sleep 1 49 win3.setpos(2, 1); win3.addstr(q[0]) #質問を表示する場面 50 win3.setpos(3, 1); win3.addstr(q[1]) 51 win3.setpos(4, 1); win3.addstr(q[2]) 52 win3.setpos(5, 1); win3.addstr(q[3]) 53 win3.setpos(6, 1); win3.addstr(q[4]) 54 win3.setpos(7, 1); win3.addstr(q[5]) 55 win3.setpos(8, 5) 56 ans = win3.getch 57 if ans == q[6] then 58 $fighter["kougeki"] += 20 59 win3.setpos(8, 10) 60 sleep 1 61 win3.addstr("正解だ! 攻撃力20ポイント回復!") 62 else 63 $fighter["kougeki"] -= 25 64 win3.setpos(8, 10) 65 sleep 1 66 win3.addstr("間違い! 攻撃力25ポイント減!") 67 end 68 end 69 win3.refresh 70 sleep 2 71 win3.setpos(1, 1); win3.addstr(spc) #画面をクリア 72 win3.setpos(2, 1); win3.addstr(spc) 73 win3.setpos(3, 1); win3.addstr(spc) 74 win3.setpos(4, 1); win3.addstr(spc) 75 win3.setpos(5, 1); win3.addstr(spc) 76 win3.setpos(6, 1); win3.addstr(spc) 77 win3.setpos(7, 1); win3.addstr(spc) 78 win3.setpos(8, 5); win3.refresh 79end 80 81#...省略 82 83 84 85

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題データの流れを見ると、だいたい5つに変化して表示されています。

#1. mondai = "mondai1.dat" #外部データファイル名(7行で1問題セットになっている) #2 moji[i] = text.chomp #データに含まれる改行コードの削除 #3. eval("$q#{j} = [ moji[j*7+0],moji[j*7+1],moji[j*7+2],moji[j*7+3],moji[j*7+4],moji[j*7+5],moji[j*7+6] ]") #4. eval("q = $q#{rand($mondaisu)}.clone") #5. win3.setpos(2, 1); win3.addstr(q[0]) #質問を表示する場面

#1 はファイル名
#2はmojiに格納
#3は$qに7問ごとにまとめて格納
#4はqに問題セットを一つ取り出し
#5は7問それぞれ表示

eval()は後から読むのが困難になるので、コメントがあっても読めないのは無理ないです。

7行を一つにまとめる部分に苦労しているように見えますが、each_slice()を使うと便利です。
moji に問題がきれいに入っているので、問題セットにまとめればそのまま使えそうです。

@q_set = moji.each_slice(7).to_a #@q_setに7個ごとにまとめて格納 @q = @q_set[rand($mondaisu)] win3.setpos(2, 1); win3.addstr(@q[0]) #質問を表示する場面

参考

投稿2016/06/23 10:37

編集2016/06/27 10:55
miyamiya

総合スコア691

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

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

yusuke.

2016/06/25 00:47

もう一度質問すいません。 その読みこんだ問題はどのようにして表示すればいいでしょうか
yusuke.

2016/06/25 00:54

ちなみに問題は下のような感じで保存されているのですが、ランダムに問題を選ぶようにしているはずなのですが、どうやったらいいですか。 質問ばかりで申しわけございません。 問1 現在学校のパソコン部の一年生は何人いるでしょう? 1 三人 2 六人 3 十人 4 二人 5 人 2 問2 現在中学校の校長先生は何というでしょう? 1 先生 2 長先生 3 先生 4 校長先生 5 校長先生 1 問3 閏年は何年に一回でしょう? 1 1年 2 10年 3 4年 4 100年 5 2年 3 問4 事務室は何をするところでしょう 1 遊ぶところ 2 授業をするところ 3 運動するところ 4 処刑するところ 5 事務するところ 5 問5 干支にいない動物を選びなさい。 1 ねずみ男 2 とら 3 ウサギ 4 イノシシ 5 蛇   1 問1 校訓は敬愛・英知もう一つはなんでしょう? 1  2  3  4  5  1
miyamiya

2016/06/27 10:59

質問をランダムに取り出す部分が抜けて正しくなかったので修正しました。 @q = @q_set[rand($mondaisu)] #質問セットからランダムに取り出す win3.setpos(2, 1); win3.addstr(@q[0]) #質問を表示する場面 問題は@q[0]の中に入っています。@q[1]..@q[5]には選択肢が入っています。 win3.addstrで画面に表示しているかと思います。
yusuke.

2016/06/28 08:39

わかりました。 ありがとうございます。 ちなみに n = ["校訓はなんでしょう","...","...","...",] t = ["1...2...3...4...."] #選択肢 u = ["3","..","..."] #答え f = 0 e = 0 puts "#{n.size}の問題があります" puts "何問解きますか 数を入力してください" a = gets.to_i - 1 (0..a).each do |a| これで表示することも可能ですよね。
yusuke.

2016/06/28 08:40

最後に、win3というのはどういう意味なのでしょうか。 質問ばかりしてしまい大変申し訳ありません。
miyamiya

2016/06/28 10:06

そうですね。putsだと簡単に表示できます。 win3という名前はそう付けてあっただけで意味はありませんが、 win3の中には、文字表示用のCursesというライブラリが格納されています。 Cursesは好きな場所に文字を出すことができます。 win3.setpos(2, 1)#横2、縦1の場所にカーソルを移動 win3.addstr(q[0]) #そこに文字を書き込む
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問