quizgame 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,16 +1,26 @@
1
1
  = quizgame Changelog
2
2
 
3
3
  == Master (for 0.0.4)
4
+ - Adjust to builtinextension-0.1.0.
5
+ - Show histgram of weight file after run quizgame.
6
+ - Change default filename extensions;
7
+ for problems from ".yaml" to ".quiz",
8
+ and weights from "_wts.yaml" to ".wts".
9
+ - Problem to QuizGame::Problem
10
+ - History style is changed;
11
+ from "[1 correct / 2 problems / 3 norma]" to "ox-"
4
12
 
5
13
  == Version 0.0.3
6
- Adjust to WeightedPicker-0.1.0.
14
+ - Adjust to weightedpicker-0.1.0.
7
15
 
8
16
  == Version 0.0.2
9
- bin/quizgame raise error when _wts.yaml includes a float weight.
10
- fix the bug when NaN occur with quit when no problem is answered.
17
+ - bin/quizgame raise error when _wts.yaml includes
18
+ a float weight.
19
+ - fix the bug when NaN occur with quit when no problem
20
+ is answered.
11
21
 
12
22
  == Version 0.0.1
13
- bugfix
23
+ - bugfix
14
24
 
15
25
  == Version 0.0.0
16
- initiali release.
26
+ - initiali release.
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ group :development do
10
10
  gem "bundler", "~> 1.3.4"
11
11
  gem "jeweler", "~> 1.8.3"
12
12
  gem "simplecov", ">= 0"
13
- gem "builtinextension", ">= 0.0.0"
13
+ gem "builtinextension", ">= 0.1.0"
14
14
  gem "weightedpicker", ">= 0.1.0"
15
15
  #gem "psych", ">= 0"
16
16
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -33,9 +33,7 @@ require "pp"
33
33
  require "optparse"
34
34
 
35
35
  require "rubygems"
36
- gem "quizgame"
37
- require "quizgame/quizgame.rb"
38
- require "quizgame/problem.rb"
36
+ require "quizgame"
39
37
 
40
38
  # option analysis
41
39
  #default value
@@ -54,9 +52,10 @@ data = YAML.load_file(ARGV[0])
54
52
  requirement = data["requirement"]
55
53
  problems = {}
56
54
  data["problems"].each do |id, ary|
57
- problems[id] = Problem.new(*ary)
55
+ problems[id] = QuizGame::Problem.new(*ary)
58
56
  end
59
- weight_yaml = ARGV[0].sub(/\.yaml$/, "_wts.yaml")
57
+ #weight_yaml = ARGV[0].sub(/\.yaml$/, "_wts.yaml")
58
+ weight_yaml = ARGV[0].sub(/\.quiz$/, ".wts")
60
59
 
61
60
  game = QuizGame.new(requirement, problems, weight_yaml)
62
61
  game.run(OPTIONS[:norma])
@@ -0,0 +1,163 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ class QuizGame; end
5
+
6
+ require "yaml"
7
+ require "rubygems"
8
+ require "weightedpicker"
9
+ require "quizgame/problem"
10
+
11
+ gem "builtinextension"
12
+ require "string/color.rb"
13
+ require "string/mismatch.rb"
14
+
15
+ include Math
16
+
17
+ # クイズゲームを管理・実行するクラス。
18
+ class QuizGame
19
+ QUIT_STR = "q"
20
+ #NEXT_STR = ""
21
+ NUM_EMPTY_LINE = 1
22
+ #MINIMUM_INTERVAL = 10 #同じ問題を再出題する最短の interval
23
+
24
+ class QuizGame::NoQuizError < Exception; end
25
+
26
+ # クイズデータを読み込む。
27
+ def initialize(requirement, problems, picker_file)
28
+ @requirement = requirement
29
+ @problems = problems
30
+ @weight_file = picker_file
31
+ end
32
+
33
+ # 条件を満たすまでクイズを実行。
34
+ # norma は終了条件の数
35
+ def run(norma)
36
+ begin
37
+ picker = WeightedPicker.load_file @weight_file
38
+ picker.merge @problems.keys
39
+ rescue WeightedPicker::InvalidWeightError
40
+ puts "Error!"
41
+ puts "#{@weight_file} contains float weight. Use integers as weights."
42
+ exit
43
+ rescue Errno::ENOENT
44
+ #puts "TEST"
45
+ picker = WeightedPicker.new({})
46
+ picker.merge @problems.keys
47
+ end
48
+
49
+ history = Array.new(norma)
50
+ problem_count = 0
51
+ show_statement(norma)
52
+ puts "Requirement: ", @requirement
53
+
54
+ start_time = Time.new
55
+
56
+ while (problem_count < norma )
57
+ id = picker.pick
58
+ problem = @problems[id]
59
+
60
+ puts "-"*60
61
+ print "[Q.#{problem_count+1}, #{id}] "
62
+ problem.exhibit_question
63
+
64
+ input_str = user_input
65
+ (puts "-- Interrupted --"; break) if (input_str == QUIT_STR)
66
+ #(puts "-- Next --"; next) if (input_str == NEXT_STR)
67
+
68
+ problem_count += 1
69
+ result = problem.correct?(input_str)
70
+ history[problem_count -1] = result
71
+ if result
72
+ picker.lighten(id)
73
+ else
74
+ picker.weigh(id)
75
+ end
76
+
77
+ puts show_result(problem, input_str)
78
+ puts problem.show_supplement
79
+ print "History: "
80
+ show_history(history)
81
+ end
82
+
83
+ File.open(@weight_file, "w"){|io| picker.dump(io) }
84
+
85
+ puts "="*60
86
+ sleep(0.35) #Visual effect. A little stop before showing results.
87
+ if ((history.count(true) == norma) && norma > 0)
88
+ show_great
89
+ end
90
+
91
+ printf("result: [%d correct / %d problems]",
92
+ history.count(true), problem_count)
93
+
94
+ begin
95
+ printf(" %2d\%\n", ( (history.count(true).to_f)/ problem_count*100).to_i)
96
+ rescue FloatDomainError
97
+ puts " No problem is answered."
98
+ end
99
+
100
+ print "Time: ", Time.now - start_time, "\n"
101
+
102
+ puts
103
+ picker.dump_histgram($stdout)
104
+ end
105
+
106
+ private
107
+
108
+ def show_history(results, io = $stdout)
109
+ str = results.map do |result|
110
+ if result == true
111
+ "o"
112
+ elsif result == false
113
+ "x"
114
+ elsif result == nil
115
+ "-"
116
+ else
117
+ raise "Must not happen!"
118
+ end
119
+ end . join("")
120
+ io.puts str
121
+ end
122
+
123
+ #ゲーム開始前に情報を提示。
124
+ def show_statement(norma, io = $stdout)
125
+ io.puts "#{QUIT_STR}[Enter] for immediately quit."
126
+ io.puts
127
+ io.puts "This program has #{@problems.size} problems."
128
+ io.print "Norma: " + norma.to_s.color(:green) + " "
129
+ io.puts "problems."
130
+ end
131
+
132
+ def user_input(input = STDIN, output = $stdout)
133
+ output.print "\n" * NUM_EMPTY_LINE
134
+ output.print "input: "
135
+ return input.gets.chomp!
136
+ end
137
+
138
+ #
139
+ def show_result(problem, str, io = $stdout)
140
+ if (problem.correct?(str) == false)
141
+ io.puts "×: ".color(:red) + problem.emphasize_wrong(str)
142
+ end
143
+ io.puts "○: #{problem.answer}"
144
+ end
145
+
146
+ def show_great
147
+ print "\n"
148
+ great = Array.new
149
+ puts "■■■■■□■■■■■□■■■■■□■■■■■□■■■■■□■□■".color(:red )
150
+ puts "■□□□□□■□□□■□■□□□□□■□□□■□□□■□□□■□■".color(:yellow)
151
+ puts "■□■■■□■■■■■□■■■■■□■■■■■□□□■□□□■□■".color(:green )
152
+ puts "■□□□■□■□□■□□■□□□□□■□□□■□□□■□□□□□□".color(:cyan )
153
+ puts "■■■■■□■□□□■□■■■■■□■□□□■□□□■□□□■□■".color(:blue )
154
+ puts
155
+ puts "All answers are correct!"
156
+ puts
157
+ end
158
+
159
+ end
160
+
161
+
162
+
163
+
@@ -3,8 +3,8 @@
3
3
 
4
4
  require "rubygems"
5
5
  gem "builtinextension"
6
- require "string_color.rb"
7
- require "string_mismatch.rb"
6
+ require "string/color.rb"
7
+ require "string/mismatch.rb"
8
8
 
9
9
  #Class for one item of quizes.
10
10
  #This class does not print to stdout.
@@ -27,9 +27,9 @@ require "string_mismatch.rb"
27
27
  # 正否に関わらない補足情報が supplement
28
28
  #この用語を使う。
29
29
  #
30
- #requirement を Problem 内では保持しない。
30
+ #requirement を QuizGame::Problem 内では保持しない。
31
31
  #多くの場合、上位の構造で保持して同種の問題を繰り返すものだから。
32
- class Problem
32
+ class QuizGame::Problem
33
33
  attr_reader :question, :answer, :supplement
34
34
 
35
35
  def initialize( question, answer, supplement = nil )
@@ -39,10 +39,10 @@ class Problem
39
39
  end
40
40
 
41
41
  #問題文を表示。
42
- #Problem 側がこのメソッドを持つことについて。
42
+ #QuizGame::Problem 側がこのメソッドを持つことについて。
43
43
  #問題が必ずしも文でないことがあるため。
44
44
  #たとえばヒアリングの問題なんかでは、
45
- #Problem クラスインスタンスがその再生方法などを持っているべきだ。
45
+ #QuizGame::Problem クラスインスタンスがその再生方法などを持っているべきだ。
46
46
  def exhibit_question( io = STDOUT )
47
47
  io.puts @question
48
48
  end
@@ -57,8 +57,8 @@ class Problem
57
57
  end
58
58
 
59
59
  #正誤判定。
60
- #正誤判定は Problem 内で行う。
61
- #Problem のサブクラスで正誤判定条件を変更できる。
60
+ #正誤判定は QuizGame::Problem 内で行う。
61
+ #QuizGame::Problem のサブクラスで正誤判定条件を変更できる。
62
62
  #MEMO: 今のところ ignorecase しているが、本来は厳密に一致せんとあかん。
63
63
  def correct?( data )
64
64
  return true if /^#{@answer}$/i =~ data
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "quizgame"
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["ippei94da"]
12
- s.date = "2013-04-10"
12
+ s.date = "2013-04-18"
13
13
  s.description = "This gem privide framework for quiz game. This gem can be used for spaced repetition study. The more frequently mistaken problems are given more frequently."
14
14
  s.email = "ippei94da@gmail.com"
15
15
  s.executables = ["quizgame"]
@@ -33,7 +33,6 @@ Gem::Specification.new do |s|
33
33
  "example/hyakuninIsshuShort.yaml",
34
34
  "lib/quizgame.rb",
35
35
  "lib/quizgame/problem.rb",
36
- "lib/quizgame/quizgame.rb",
37
36
  "quizgame.gemspec",
38
37
  "test/helper.rb",
39
38
  "test/test_problem.rb",
@@ -42,7 +41,7 @@ Gem::Specification.new do |s|
42
41
  s.homepage = "http://github.com/ippei94da/quizgame"
43
42
  s.licenses = ["MIT"]
44
43
  s.require_paths = ["lib"]
45
- s.rubygems_version = "1.8.23"
44
+ s.rubygems_version = "1.8.11"
46
45
  s.summary = "Framework for game with quiz format."
47
46
 
48
47
  if s.respond_to? :specification_version then
@@ -53,14 +52,14 @@ Gem::Specification.new do |s|
53
52
  s.add_development_dependency(%q<bundler>, ["~> 1.3.4"])
54
53
  s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
55
54
  s.add_development_dependency(%q<simplecov>, [">= 0"])
56
- s.add_development_dependency(%q<builtinextension>, [">= 0.0.0"])
55
+ s.add_development_dependency(%q<builtinextension>, [">= 0.1.0"])
57
56
  s.add_development_dependency(%q<weightedpicker>, [">= 0.1.0"])
58
57
  else
59
58
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
60
59
  s.add_dependency(%q<bundler>, ["~> 1.3.4"])
61
60
  s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
62
61
  s.add_dependency(%q<simplecov>, [">= 0"])
63
- s.add_dependency(%q<builtinextension>, [">= 0.0.0"])
62
+ s.add_dependency(%q<builtinextension>, [">= 0.1.0"])
64
63
  s.add_dependency(%q<weightedpicker>, [">= 0.1.0"])
65
64
  end
66
65
  else
@@ -68,7 +67,7 @@ Gem::Specification.new do |s|
68
67
  s.add_dependency(%q<bundler>, ["~> 1.3.4"])
69
68
  s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
70
69
  s.add_dependency(%q<simplecov>, [">= 0"])
71
- s.add_dependency(%q<builtinextension>, [">= 0.0.0"])
70
+ s.add_dependency(%q<builtinextension>, [">= 0.1.0"])
72
71
  s.add_dependency(%q<weightedpicker>, [">= 0.1.0"])
73
72
  end
74
73
  end
@@ -5,14 +5,12 @@ require 'helper'
5
5
  require "stringio"
6
6
  require "test/unit"
7
7
 
8
- require "quizgame/problem.rb"
9
-
10
8
  class TC_Problem < Test::Unit::TestCase
11
9
  def setup
12
- @p00 = Problem.new( "vortex", "vortices", "ラテン系語尾" )
13
- @p01 = Problem.new( "これはペンです。", "This is a pen.", "かんたん" )
14
- @p02 = Problem.new( "ふ", "むべ", "第22")
15
- @p03 = Problem.new( "4 underscore after abc", "abc____" )
10
+ @p00 = QuizGame::Problem.new( "vortex", "vortices", "ラテン系語尾" )
11
+ @p01 = QuizGame::Problem.new( "これはペンです。", "This is a pen.", "かんたん" )
12
+ @p02 = QuizGame::Problem.new( "ふ", "むべ", "第22")
13
+ @p03 = QuizGame::Problem.new( "4 underscore after abc", "abc____" )
16
14
  end
17
15
 
18
16
  def test_exhibit_question
@@ -5,11 +5,10 @@ require 'helper'
5
5
  require "test/unit"
6
6
  require "stringio"
7
7
  require "fileutils"
8
- require "quizgame/quizgame.rb"
9
8
 
10
9
  class QuizGame
11
10
  attr_accessor :problem_selector, :requirement, :yaml_mtime, :norma
12
- public :user_input, :show_result, :show_statement
11
+ public :user_input, :show_result, :show_statement, :show_history
13
12
  end
14
13
 
15
14
  class TC_QuizGame < Test::Unit::TestCase
@@ -20,8 +19,8 @@ class TC_QuizGame < Test::Unit::TestCase
20
19
 
21
20
  requirement = "Answer English spell."
22
21
  problems = {
23
- "p1" => Problem.new( "1", "one", "いち" ),
24
- "p2" => Problem.new( "2", "two", "に" )
22
+ "p1" => QuizGame::Problem.new( "1", "one", "いち" ),
23
+ "p2" => QuizGame::Problem.new( "2", "two", "に" )
25
24
  }
26
25
  @qg00 = QuizGame.new(requirement, problems, QUIZ_FILE)
27
26
  end
@@ -37,7 +36,7 @@ class TC_QuizGame < Test::Unit::TestCase
37
36
  def test_run
38
37
  #run には WeightedPicker 経由の乱数要素が含まれるので、
39
38
  #妥当なテストが書けない。
40
- #1問だけにするとか、両方同じ答えにするとか手はあるが。
39
+ #srand セットすればいけそうか。
41
40
  end
42
41
 
43
42
  def test_show_statement
@@ -62,14 +61,14 @@ class TC_QuizGame < Test::Unit::TestCase
62
61
 
63
62
  def test_show_result
64
63
  io = StringIO.new
65
- @qg00.show_result( Problem.new( "1", "one" , "supplement1" ), "one", io )
64
+ @qg00.show_result( QuizGame::Problem.new( "1", "one" , "supplement1" ), "one", io )
66
65
  io.rewind
67
66
  assert_equal( "○: one\n", io.readline )
68
67
  assert_raise( EOFError ){ io.readline }
69
68
  io.close
70
69
 
71
70
  io = StringIO.new
72
- @qg00.show_result( Problem.new( "1", "one" , "supplement1" ), "oo", io )
71
+ @qg00.show_result( QuizGame::Problem.new( "1", "one" , "supplement1" ), "oo", io )
73
72
  io.rewind
74
73
  assert_equal( "\e[31;49m×: \e[39;49mo\e[31;49mo_\e[39;49m\n", io.readline )
75
74
  assert_equal( "○: one\n", io.readline )
@@ -77,5 +76,13 @@ class TC_QuizGame < Test::Unit::TestCase
77
76
  io.close
78
77
  end
79
78
 
79
+ def test_show_history
80
+ history = [true, false, true, nil]
81
+ io = StringIO.new
82
+ @qg00.show_history(history, io)
83
+ io.rewind
84
+ assert_equal("oxo-\n", io.read)
85
+ end
86
+
80
87
  end
81
88
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quizgame
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-10 00:00:00.000000000 Z
12
+ date: 2013-04-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &78640980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: '3.12'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: '3.12'
24
+ version_requirements: *78640980
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: bundler
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &78640740 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ~>
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: 1.3.4
38
33
  type: :development
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 1.3.4
35
+ version_requirements: *78640740
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: jeweler
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &78640430 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ~>
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: 1.8.3
54
44
  type: :development
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 1.8.3
46
+ version_requirements: *78640430
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: simplecov
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &78639890 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ! '>='
@@ -69,31 +54,21 @@ dependencies:
69
54
  version: '0'
70
55
  type: :development
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
57
+ version_requirements: *78639890
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: builtinextension
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &78639610 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ! '>='
84
64
  - !ruby/object:Gem::Version
85
- version: 0.0.0
65
+ version: 0.1.0
86
66
  type: :development
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: 0.0.0
68
+ version_requirements: *78639610
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: weightedpicker
96
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &78639330 !ruby/object:Gem::Requirement
97
72
  none: false
98
73
  requirements:
99
74
  - - ! '>='
@@ -101,12 +76,7 @@ dependencies:
101
76
  version: 0.1.0
102
77
  type: :development
103
78
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: 0.1.0
79
+ version_requirements: *78639330
110
80
  description: This gem privide framework for quiz game. This gem can be used for spaced
111
81
  repetition study. The more frequently mistaken problems are given more frequently.
112
82
  email: ippei94da@gmail.com
@@ -132,7 +102,6 @@ files:
132
102
  - example/hyakuninIsshuShort.yaml
133
103
  - lib/quizgame.rb
134
104
  - lib/quizgame/problem.rb
135
- - lib/quizgame/quizgame.rb
136
105
  - quizgame.gemspec
137
106
  - test/helper.rb
138
107
  - test/test_problem.rb
@@ -152,7 +121,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
121
  version: '0'
153
122
  segments:
154
123
  - 0
155
- hash: -593133475
124
+ hash: -638697139
156
125
  required_rubygems_version: !ruby/object:Gem::Requirement
157
126
  none: false
158
127
  requirements:
@@ -161,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
130
  version: '0'
162
131
  requirements: []
163
132
  rubyforge_project:
164
- rubygems_version: 1.8.23
133
+ rubygems_version: 1.8.11
165
134
  signing_key:
166
135
  specification_version: 3
167
136
  summary: Framework for game with quiz format.
@@ -1,144 +0,0 @@
1
- #! /usr/bin/env ruby
2
- # coding: utf-8
3
-
4
- require "rubygems"
5
- gem "builtinextension"
6
- require "string_color.rb"
7
- require "string_mismatch.rb"
8
-
9
- gem "weightedpicker"
10
- require "weightedpicker.rb"
11
-
12
- require "quizgame/problem.rb"
13
- require "yaml"
14
-
15
- include Math
16
-
17
- # クイズゲームを管理・実行するクラス。
18
- class QuizGame
19
- QUIT_STR = "q"
20
- #NEXT_STR = ""
21
- NUM_EMPTY_LINE = 8
22
- #MINIMUM_INTERVAL = 10 #同じ問題を再出題する最短の interval
23
-
24
- class QuizGame::NoQuizError < Exception; end
25
-
26
- # クイズデータを読み込む。
27
- def initialize(requirement, problems, picker_file)
28
- @requirement = requirement
29
- @problems = problems
30
- @weight_file = picker_file
31
- end
32
-
33
- # 条件を満たすまでクイズを実行。
34
- # norma は終了条件の数
35
- def run(norma)
36
- begin
37
- picker = WeightedPicker.load_file @weight_file
38
- picker.merge @problems.keys
39
- rescue WeightedPicker::InvalidWeightError
40
- puts "Error!"
41
- puts "#{@weight_file} contains float weight. Use integers as weights."
42
- exit
43
- rescue Errno::ENOENT
44
- #puts "TEST"
45
- picker = WeightedPicker.new({})
46
- picker.merge @problems.keys
47
- end
48
-
49
- correct_count = 0
50
- problem_count = 0
51
- show_statement(norma)
52
- puts "Requirement: ", @requirement
53
-
54
- start_time = Time.new
55
-
56
- while (problem_count < norma )
57
- id = picker.pick
58
- problem = @problems[id]
59
-
60
- puts "-"*60
61
- print "[Q.#{problem_count+1}, #{id}] "
62
- problem.exhibit_question
63
-
64
- input_str = user_input
65
- (puts "-- Interrupted --"; break) if (input_str == QUIT_STR)
66
- #(puts "-- Next --"; next) if (input_str == NEXT_STR)
67
-
68
- problem_count += 1
69
- if problem.correct?(input_str)
70
- correct_count += 1
71
- picker.lighten(id)
72
- else
73
- picker.weigh(id)
74
- end
75
-
76
- puts show_result(problem, input_str)
77
- puts problem.show_supplement
78
- #pp correct_count
79
- #pp problem_count
80
- #pp @norma
81
- printf( "[%d correct / %d problems / %d norma]\n",
82
- correct_count, problem_count, norma)
83
- end
84
-
85
- File.open(@weight_file, "w"){|io| picker.dump(io) }
86
-
87
- puts "="*60
88
- sleep(0.35) #Visual effect. A little stop before showing results.
89
- if (correct_count == norma)
90
- show_great
91
- end
92
-
93
- printf("result: [%d correct / %d problems]",
94
- correct_count, problem_count)
95
-
96
- begin
97
- printf(" %2d\%\n", (correct_count.to_f/ problem_count*100).to_i)
98
- rescue FloatDomainError
99
- puts " No problem is answered."
100
- end
101
-
102
- print "Time: ", Time.now - start_time, "\n"
103
- end
104
-
105
- private
106
-
107
- #ゲーム開始前に情報を提示。
108
- def show_statement(norma, io = $stdout)
109
- io.puts "#{QUIT_STR}[Enter] for immediately quit."
110
- io.puts
111
- io.puts "This program has #{@problems.size} problems."
112
- io.print "Norma: " + norma.to_s.color(:green) + " "
113
- io.puts "problems."
114
- end
115
-
116
- def user_input(input = STDIN, output = $stdout)
117
- output.print "\n" * NUM_EMPTY_LINE
118
- output.print "input: "
119
- return input.gets.chomp!
120
- end
121
-
122
- #
123
- def show_result(problem, str, io = $stdout)
124
- if (problem.correct?(str) == false)
125
- io.puts "×: ".color(:red) + problem.emphasize_wrong(str)
126
- end
127
- io.puts "○: #{problem.answer}"
128
- end
129
-
130
-
131
- def show_great
132
- print "\n"
133
- great = Array.new
134
- puts "■■■■■□■■■■■□■■■■■□■■■■■□■■■■■□■□■".color(:red )
135
- puts "■□□□□□■□□□■□■□□□□□■□□□■□□□■□□□■□■".color(:yellow)
136
- puts "■□■■■□■■■■■□■■■■■□■■■■■□□□■□□□■□■".color(:green )
137
- puts "■□□□■□■□□■□□■□□□□□■□□□■□□□■□□□□□□".color(:cyan )
138
- puts "■■■■■□■□□□■□■■■■■□■□□□■□□□■□□□■□■".color(:blue )
139
- puts
140
- puts "All answers are correct!"
141
- puts
142
- end
143
-
144
- end