number.rb
001 require 'phi'
002 require 'rgui/ui'
003 require 'dialogs'
004
005 MAX = 5
006 $anwser = nil
007 srand
008
009 # control
010 form = RGUI::Form.new(:form1, '数当てゲーム')
011
012 form.width = 350
013 form.height = 90
014
015 start_btn = Phi::Button.new(form, :start_btn1, 'ゲーム開始')
016 stop_btn = Phi::Button.new(form, :stop_btn1, 'ゲーム終了')
017 stop_btn.enabled = false
018 hbox1 = UI::Hbox.new([start_btn, stop_btn], 5)
019
020 edit = Phi::Edit.new(form, :edit1, '')
021 answer_btn = Phi::Button.new(form, :answer_btn1, 'OK')
022 hbox2 = UI::Hbox.new([edit, answer_btn], 5)
023
024 vbox = UI::Vbox.new([hbox1, hbox2], 5)
025 form.add(vbox)
026
027
028 # method
029 def ok_msg(msg)
030 Phi::message_dlg(msg, Phi::MT_INFORMATION, [Phi::MB_OK], 0)
031 end
032
033 def error_msg(msg)
034 Phi::message_dlg(msg, Phi::MT_ERROR, [Phi::MB_OK], 0)
035 end
036
037 def start_game
038 Phi::SCREEN.form1.start_btn1.enabled = false
039 Phi::SCREEN.form1.stop_btn1.enabled = true
040 $answer = rand(MAX)
041 ok_msg("答えは 0〜#{MAX - 1} の数字です。")
042 end
043
044 def stop_game
045 Phi::SCREEN.form1.start_btn1.enabled = true
046 Phi::SCREEN.form1.stop_btn1.enabled = false
047 $answer = nil
048 Phi::SCREEN.form1.edit1.text = ''
049 end
050
051 # event
052 answer_btn.on_click = proc do
053 unless $answer.nil?
054 if edit.text == $answer.to_s
055 ok_msg('正解です。')
056 stop_game
057 else
058 error_msg("正解は #{edit.text} ではありません。")
059 end
060 else
061 error_msg("ゲームを開始してください。")
062 end
063 end
064
065 start_btn.on_click = proc do
066 if $answer.nil?
067 start_game
068 else
069 error_msg('BUG')
070 end
071 end
072
073 stop_btn.on_click = proc do
074 if $answer
075 stop_game
076 else
077 error_msg('BUG')
078 end
079 end
080
081 form.on_resize = proc do
082 form.layout
083 end
084
085 form.show
086 Phi.mainloop
このスクリプトを実行すると、このような ウィンドウがあらわれます。