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

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

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

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

Q&A

解決済

1回答

2265閲覧

ruby フリーズ

yusuke.

総合スコア66

Ruby

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

0グッド

0クリップ

投稿2016/07/14 05:06

この、プログラムを実行すると、いつも、フリーズしてしまいます。
なぜフリーズしてしまうのでしょうか。 エラーメッセージは出ていません。
使っているruby はruby 1.9.3p385です。
実行した画面
このような感じで止まってしまいます。
スコアも表示できませんし、数字を入力しようとすると動かなくなります。
10.times doあたりが、おかしいのだと思いますが、どのように直したらよいかわかりません。クイズを10問ほどといてスコアを稼いでいくというプログラムを作りたいです。
main.rb

ruby

1#!ruby -Ks 2require "./window.rb" 3require "./kuizu.rb" 4 5window = Window.new 6window.drawBack 7window.gamestart 8window.refresh 9 10while true do 11 while event = SDL::Event2.poll do 12 case event 13 when SDL::Event2::Quit 14 exit 15 when SDL::Event2::MouseButtonDown 16 x = event.x 17 y = event.y 18 if window.kuizuclicked?(x,y) 19 hajime 20 window.refresh 21 end 22 if window.zairyoclicked?(x,y) 23 require "./zairyo.rb" 24 end 25 end 26 end 27 28end

widndow.rb

ruby

1require "sdl" 2require "./color.rb" 3class Window 4 WINDOW_YOKO = 750 5 WINDOW_TATE = 550 6 BITPIKUSERU = 0 7 KUIZUX = 550 8 KUIZUY = 200 9 ZAIRYOX = 570 10 ZAIRYOY = 300 11def initialize 12 SDL.init(SDL::INIT_EVERYTHING) 13 @screen = SDL.set_video_mode(WINDOW_YOKO,WINDOW_TATE,BITPIKUSERU,SDL::SWSURFACE) 14 SDL::TTF.init 15 @font = SDL::Kanji.open("font/jiskan24.bdf",24) 16 @font.set_coding_system(SDL::Kanji::SJIS) 17end 18 19def drawBack 20 @screen.fill_rect(0,0,WINDOW_YOKO,WINDOW_TATE,Color::GREEN) 21 @font.put(@screen,"###",230,50,255,255,255) 22end 23 24def refresh 25 @screen.update_rect(0,0,0,0) 26end 27 28def gamestart 29 @font.put(@screen,"ああああ",KUIZUX,KUIZUY,255,255,255) 30 @font.put(@screen,"いいいい", ZAIRYOX,ZAIRYOY,255,255,255) 31end 32 33def kuizuclicked?(x,y) 34 if (KUIZUX <= x) and (x <= 690) and (KUIZUY <= y) and (y <= 230) 35 return true 36 else 37 return false 38 end 39end 40 41def zairyoclicked?(x,y) 42 if (ZAIRYOX <= x) and (x <= 600) and (ZAIRYOY <= y) and (y <= 330) 43 return true 44 else 45 return false 46 end 47end 48 49end

kuizu.rb

ruby

1#!ruby -Ks 2require "sdl" 3require "./color.rb" 4require 'io/console' 5 6 7$tisiki = open("./dat/score.dat","w") 8 9 10def yomikomi() 11 i = 0 12 j = 0 13 $moji =[] 14 f = open("./dat/mondai1.dat","r") 15 while text = f.gets do 16 $moji[i] = text.chomp 17 i += 1 18 end 19 f.close 20 $mondaisu = i/8 21 while j <= i/8 22 eval("$q#{j} = [ $moji[j*8+0],$moji[j*8+1],$moji[j*8+2], $moji[j*8+3],$moji[j*8+4],$moji[j*8+5],$moji[j*8+6],$moji[j*8+7 ] ]") 23 j += 1 24 end 25 q = [] 26 eval("q = $q#{rand($mondaisu)}.clone") 27 $mondai = q[0] 28 $sentakusi1 = q[1] 29 $sentakusi2 = q[2] 30 $sentakusi3 = q[3] 31 $sentakusi4 = q[4] 32 $sentakusi5 = q[5] 33 $kotae = q[6] 34 $score = q[7] 35end 36 37 38 39class Gmen 40 WINDOW_YOKO = 750 41 WINDOW_TATE = 550 42 BITPIKUSERU = 0 43 44 45 def initialize 46 SDL.init(SDL::INIT_EVERYTHING) 47 @screen2 = SDL.set_video_mode(WINDOW_YOKO,WINDOW_TATE,BITPIKUSERU,SDL::SWSURFACE) 48 SDL::TTF.init 49 @font = SDL::Kanji.open("font/jiskan24.bdf",24) 50 @font.set_coding_system(SDL::Kanji::SJIS) 51 @font2 = SDL::TTF.open("C:/WINDOWS/Fonts/TAHOMA.TTF",30) 52 end 53 54 def drawBack 55 @screen2.fill_rect(0,0,WINDOW_YOKO,WINDOW_TATE,Color::WHITE) 56 end 57 58 def refresh 59 @screen2.update_rect(0,0,0,0) 60 end 61 62 def kotaeawase 63 a = gets.chomp 64 @font.put(@screen2,"入力した数字#{a}",50,280,0,0,0) 65 if a == $kotae.to_i 66 $tisiki = $tisiki.to_i + $score.to_i 67 @font.put(@screen2,"正解です",50,250,0,0,0) 68 @font.put(@screen2,"正解は#{$kotae}です。",50,220,0,0,0) 69 else 70 @font.put(@screen2,"間違いです。",50,250,0,0,0) 71 @font.put(@screen2,"正解は#{$kotae}です。",50,220,0,0,0) 72 end 73 end 74 75 76 def start 77 @font.put(@screen2,"今###異なります。",50,30,0,0,0) 78 @font.put(@screen2,"正##解さい。",50,70,0,0,0) 79 @font.put(@screen2,"始め##い。",50,120,0,0,0) 80 refresh 81 while true do 82 while event = SDL::Event2.poll 83 case event 84 when SDL::Event2::Quit 85 exit 86 when SDL::Event2::KeyDown 87 if event.sym == SDL::Key::SPACE then 88 10.times do 89 yomikomi 90 drawBack 91 mondaihyouji 92 refresh 93 kotaeawase 94 end 95 end 96 end 97 end 98 end 99 end 100 101 def mondaihyouji 102 @font.put(@screen2,"#{$mondai}", 50,20,0,0,0) 103 @font.put(@screen2,"#{$sentakusi1}", 50,50,0,0,0) 104 @font.put(@screen2,"#{$sentakusi2}", 50,80,0,0,0) 105 @font.put(@screen2,"#{$sentakusi3}", 50,110,0,0,0) 106 @font.put(@screen2,"#{$sentakusi4}", 50,140,0,0,0) 107 @font.put(@screen2,"#{$sentakusi5}", 50,170,0,0,0) 108 @font2.draw_solid_utf8(@screen2," #{$tisiki}",100,500,0,0,0) 109 end 110end 111 112 113 114 115def hajime 116 g = Gmen.new 117 g.drawBack 118 g.refresh 119 g.start 120end 121

必要な部分があればコメントください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

mondaihyouji関数の次の行の前後で、デバッグメッセージを出力してみて下さい。

@font2.draw_solid_utf8(@screen2," #{$tisiki}",100,500,0,0,0)

refresh関数が何度も呼ばれてしまっている気がしますが、まずは上記を試して見てはいかがでしょう。
これが問題なく処理されていれば、refresh処理に問題があると思います。

投稿2016/07/14 05:34

shanxia

総合スコア1038

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

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

yusuke.

2016/07/14 06:00 編集

回答ありがとうございます。 デバッグメッセージとはどのようなものをいうのでしょうか。理解力なくてすいません。
shanxia

2016/07/14 06:47

@font.put(@screen2,"適当なメッセージ", 50,170,0,0,0) このような行を書けば、画面に"適当なメッセージ"が出力されますよね? これで今PGMがどの場所まで実行できているのかを確認してみて下さい。
yusuke.

2016/07/20 06:39

mondaihyoujiまではきちんと実行されていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問