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

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

ただいまの
回答率

90.51%

  • Ruby

    9437questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 667

yusuke.

score 56

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

#...省略

def yomikomi() #外部ファイルから問題データを読み込む
    i = 0
    j = 0
    mondai = "mondai1.dat" #外部データファイル名(7行で1問題セットになっている)
    moji = []
    $mondaisu = 0 #問題数-1の値
    f = open("./dat/#{mondai}") 
    while text = f.gets do
      moji[i] = text.chomp #データに含まれる改行コードの削除
      i += 1
    end
    f.close
    #問題データの行数 iを7で割ったもの
    $mondaisu = i/7
    while j <= i/7
      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] ]")
      j += 1
    end
end

#...省略
def teki #敵の質問の場面
  q = [];spc = "                                 "
  oto2(60)
  win3 = Curses::Window.new(10, 78, 14, 1)
  win3.box(?|,?-,?*)
  win3.setpos(1, 1); win3.addstr("敵が質問を仕掛けてきた。どうする?")
  win3.setpos(2, 1); win3.addstr("1:無視してそのまま進む 2:質問を受ける")
  win3.setpos(3, 1)
  win3.refresh
  ans = win3.getch.to_i
     if ans == 1 then
       $fighter["kougeki"] -= 20
       win3.setpos(3, 3); win3.addstr("攻撃力20ポイント減!")
       win3.refresh
       sleep 2
       win3.setpos(1, 1); win3.addstr(spc)
       win3.setpos(2, 1); win3.addstr(spc)
       win3.refresh
     end
     if ans == 2 then
       eval("q = $q#{rand($mondaisu)}.clone")
       win3.setpos(1, 1); win3.addstr("それでは質問を始める!                                        ")
       win3.setpos(2, 1); win3.addstr(spc)
       win3.refresh
       sleep 1
       win3.setpos(2, 1); win3.addstr(q[0]) #質問を表示する場面
       win3.setpos(3, 1); win3.addstr(q[1])
       win3.setpos(4, 1); win3.addstr(q[2])
       win3.setpos(5, 1); win3.addstr(q[3])
       win3.setpos(6, 1); win3.addstr(q[4])
       win3.setpos(7, 1); win3.addstr(q[5])
       win3.setpos(8, 5)
       ans = win3.getch
       if ans == q[6] then
         $fighter["kougeki"] += 20
         win3.setpos(8, 10)
         sleep 1
         win3.addstr("正解だ! 攻撃力20ポイント回復!")
       else
         $fighter["kougeki"] -= 25
         win3.setpos(8, 10)
         sleep 1
         win3.addstr("間違い! 攻撃力25ポイント減!")
       end 
    end
    win3.refresh
    sleep 2
       win3.setpos(1, 1); win3.addstr(spc) #画面をクリア
       win3.setpos(2, 1); win3.addstr(spc)
       win3.setpos(3, 1); win3.addstr(spc)
       win3.setpos(4, 1); win3.addstr(spc)
       win3.setpos(5, 1); win3.addstr(spc)
       win3.setpos(6, 1); win3.addstr(spc)
       win3.setpos(7, 1); win3.addstr(spc)
       win3.setpos(8, 5); win3.refresh
end

#...省略
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

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/25 09:47

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

    キャンセル

  • 2016/06/25 09: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

    キャンセル

  • 2016/06/27 19:59

    質問をランダムに取り出す部分が抜けて正しくなかったので修正しました。

    @q = @q_set[rand($mondaisu)] #質問セットからランダムに取り出す
    win3.setpos(2, 1); win3.addstr(@q[0]) #質問を表示する場面

    問題は@q[0]の中に入っています。@q[1]..@q[5]には選択肢が入っています。
    win3.addstrで画面に表示しているかと思います。

    キャンセル

  • 2016/06/28 17: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|
    これで表示することも可能ですよね。

    キャンセル

  • 2016/06/28 17:40

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

    キャンセル

  • 2016/06/28 19:06

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

    キャンセル

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

  • Ruby

    9437questions

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