ruby フリーズ
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,262
この、プログラムを実行すると、いつも、フリーズしてしまいます。
なぜフリーズしてしまうのでしょうか。 エラーメッセージは出ていません。
使っているruby はruby 1.9.3p385です。
このような感じで止まってしまいます。
スコアも表示できませんし、数字を入力しようとすると動かなくなります。
10.times doあたりが、おかしいのだと思いますが、どのように直したらよいかわかりません。クイズを10問ほどといてスコアを稼いでいくというプログラムを作りたいです。
main.rb
#!ruby -Ks
require "./window.rb"
require "./kuizu.rb"
window = Window.new
window.drawBack
window.gamestart
window.refresh
while true do
while event = SDL::Event2.poll do
case event
when SDL::Event2::Quit
exit
when SDL::Event2::MouseButtonDown
x = event.x
y = event.y
if window.kuizuclicked?(x,y)
hajime
window.refresh
end
if window.zairyoclicked?(x,y)
require "./zairyo.rb"
end
end
end
end
widndow.rb
require "sdl"
require "./color.rb"
class Window
WINDOW_YOKO = 750
WINDOW_TATE = 550
BITPIKUSERU = 0
KUIZUX = 550
KUIZUY = 200
ZAIRYOX = 570
ZAIRYOY = 300
def initialize
SDL.init(SDL::INIT_EVERYTHING)
@screen = SDL.set_video_mode(WINDOW_YOKO,WINDOW_TATE,BITPIKUSERU,SDL::SWSURFACE)
SDL::TTF.init
@font = SDL::Kanji.open("font/jiskan24.bdf",24)
@font.set_coding_system(SDL::Kanji::SJIS)
end
def drawBack
@screen.fill_rect(0,0,WINDOW_YOKO,WINDOW_TATE,Color::GREEN)
@font.put(@screen,"###",230,50,255,255,255)
end
def refresh
@screen.update_rect(0,0,0,0)
end
def gamestart
@font.put(@screen,"ああああ",KUIZUX,KUIZUY,255,255,255)
@font.put(@screen,"いいいい", ZAIRYOX,ZAIRYOY,255,255,255)
end
def kuizuclicked?(x,y)
if (KUIZUX <= x) and (x <= 690) and (KUIZUY <= y) and (y <= 230)
return true
else
return false
end
end
def zairyoclicked?(x,y)
if (ZAIRYOX <= x) and (x <= 600) and (ZAIRYOY <= y) and (y <= 330)
return true
else
return false
end
end
end
kuizu.rb
#!ruby -Ks
require "sdl"
require "./color.rb"
require 'io/console'
$tisiki = open("./dat/score.dat","w")
def yomikomi()
i = 0
j = 0
$moji =[]
f = open("./dat/mondai1.dat","r")
while text = f.gets do
$moji[i] = text.chomp
i += 1
end
f.close
$mondaisu = i/8
while j <= i/8
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 ] ]")
j += 1
end
q = []
eval("q = $q#{rand($mondaisu)}.clone")
$mondai = q[0]
$sentakusi1 = q[1]
$sentakusi2 = q[2]
$sentakusi3 = q[3]
$sentakusi4 = q[4]
$sentakusi5 = q[5]
$kotae = q[6]
$score = q[7]
end
class Gmen
WINDOW_YOKO = 750
WINDOW_TATE = 550
BITPIKUSERU = 0
def initialize
SDL.init(SDL::INIT_EVERYTHING)
@screen2 = SDL.set_video_mode(WINDOW_YOKO,WINDOW_TATE,BITPIKUSERU,SDL::SWSURFACE)
SDL::TTF.init
@font = SDL::Kanji.open("font/jiskan24.bdf",24)
@font.set_coding_system(SDL::Kanji::SJIS)
@font2 = SDL::TTF.open("C:/WINDOWS/Fonts/TAHOMA.TTF",30)
end
def drawBack
@screen2.fill_rect(0,0,WINDOW_YOKO,WINDOW_TATE,Color::WHITE)
end
def refresh
@screen2.update_rect(0,0,0,0)
end
def kotaeawase
a = gets.chomp
@font.put(@screen2,"入力した数字#{a}",50,280,0,0,0)
if a == $kotae.to_i
$tisiki = $tisiki.to_i + $score.to_i
@font.put(@screen2,"正解です",50,250,0,0,0)
@font.put(@screen2,"正解は#{$kotae}です。",50,220,0,0,0)
else
@font.put(@screen2,"間違いです。",50,250,0,0,0)
@font.put(@screen2,"正解は#{$kotae}です。",50,220,0,0,0)
end
end
def start
@font.put(@screen2,"今###異なります。",50,30,0,0,0)
@font.put(@screen2,"正##解さい。",50,70,0,0,0)
@font.put(@screen2,"始め##い。",50,120,0,0,0)
refresh
while true do
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
exit
when SDL::Event2::KeyDown
if event.sym == SDL::Key::SPACE then
10.times do
yomikomi
drawBack
mondaihyouji
refresh
kotaeawase
end
end
end
end
end
end
def mondaihyouji
@font.put(@screen2,"#{$mondai}", 50,20,0,0,0)
@font.put(@screen2,"#{$sentakusi1}", 50,50,0,0,0)
@font.put(@screen2,"#{$sentakusi2}", 50,80,0,0,0)
@font.put(@screen2,"#{$sentakusi3}", 50,110,0,0,0)
@font.put(@screen2,"#{$sentakusi4}", 50,140,0,0,0)
@font.put(@screen2,"#{$sentakusi5}", 50,170,0,0,0)
@font2.draw_solid_utf8(@screen2," #{$tisiki}",100,500,0,0,0)
end
end
def hajime
g = Gmen.new
g.drawBack
g.refresh
g.start
end
必要な部分があればコメントください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
mondaihyouji関数の次の行の前後で、デバッグメッセージを出力してみて下さい。
@font2.draw_solid_utf8(@screen2," #{$tisiki}",100,500,0,0,0)
refresh関数が何度も呼ばれてしまっている気がしますが、まずは上記を試して見てはいかがでしょう。
これが問題なく処理されていれば、refresh処理に問題があると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/07/14 14:58 編集
2016/07/14 15:47
このような行を書けば、画面に"適当なメッセージ"が出力されますよね?
これで今PGMがどの場所まで実行できているのかを確認してみて下さい。
2016/07/20 15:39