language_cards 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/language_cards/controllers/game.rb +66 -0
- data/lib/language_cards/controllers/main_menu.rb +23 -0
- data/lib/language_cards/helpers/game_helper.rb +9 -0
- data/lib/language_cards/helpers/view_helper.rb +24 -0
- data/lib/language_cards/language_cards.rb +2 -1
- data/lib/language_cards/user_interface.rb +28 -104
- data/lib/language_cards/version.rb +1 -1
- data/lib/language_cards/view/game.erb +9 -0
- data/lib/language_cards/view/main_menu.erb +9 -0
- data/locales/en.yml +0 -1
- metadata +7 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f22e96585dc1b1e68ac22cdf4c2f3a4952e0c89b
|
4
|
+
data.tar.gz: ae89a8be6614e9707d4ac400bd1a87535718ae63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ff61fd64bf7e765c593e642799d2a869a47f40cc620fb3b71d27af34f722cbdc548b4861f24cf7b74c5cb7942c2fe374c2600f0a20a62c6f8cf47b17e9019b4
|
7
|
+
data.tar.gz: 8170a20139eeb403cb5b99b361e0edffb0a64e39788e90100a5f30f55fa6e709c08ed33dde30626e444a63e3b35d6541105acc7138d6ee243b229540197b42ee
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module LanguageCards
|
2
|
+
module Controllers
|
3
|
+
module Game
|
4
|
+
class << self
|
5
|
+
include Helpers::ViewHelper
|
6
|
+
include Helpers::GameHelper
|
7
|
+
|
8
|
+
def render(correct:, incorrect:, title:, timer:, last:)
|
9
|
+
_score = t('Game.ScoreMenu.Score') + ": %0.2d%" % calc_score(correct, incorrect)
|
10
|
+
_timer = [((t('Timer.Timer') + ": " + timer.ha) if timer.time?), nil, timer.h]
|
11
|
+
_mexit = t 'Menu.Exit'
|
12
|
+
|
13
|
+
view = ERB.new(IO.read(File.expand_path('../view/game.erb', __dir__)))
|
14
|
+
view.result(binding)
|
15
|
+
end
|
16
|
+
|
17
|
+
def process(card_collection, mode)
|
18
|
+
ic = struct_data.new(card_collection, mode.peek)
|
19
|
+
ic.get_input
|
20
|
+
{
|
21
|
+
correct: ic.valid?,
|
22
|
+
last: ic.valid? ? ic.correct_msg : ic.incorrect_msg
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def struct_data
|
27
|
+
Struct.new(:collection, :mode) do
|
28
|
+
def input
|
29
|
+
@input
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_input
|
33
|
+
@input ||= CLI.ask("#{I18n.t('Game.TypeThis')} #{collection.mapped_as}: #{display}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def comp_bitz
|
37
|
+
@comp_bitz ||= collection.rand
|
38
|
+
end
|
39
|
+
|
40
|
+
def display
|
41
|
+
comp_bitz.display
|
42
|
+
end
|
43
|
+
|
44
|
+
def expected
|
45
|
+
comp_bitz.expected
|
46
|
+
end
|
47
|
+
|
48
|
+
def correct_msg
|
49
|
+
"#{I18n.t('Game.Correct')} #{input} = #{display}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def incorrect_msg
|
53
|
+
output = "#{I18n.t('Game.Incorrect')} #{input} != #{display}"
|
54
|
+
output << " #{I18n.t('Game.Its')} #{expected}" if mode == :translate
|
55
|
+
output
|
56
|
+
end
|
57
|
+
|
58
|
+
def valid?
|
59
|
+
collection.correct?(input, comp_bitz)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module LanguageCards
|
2
|
+
module Controllers
|
3
|
+
module MainMenu
|
4
|
+
class << self
|
5
|
+
include Helpers::ViewHelper
|
6
|
+
|
7
|
+
def render(courses:, mode:)
|
8
|
+
_title = t 'Menu.Title'
|
9
|
+
_select = t 'Menu.Choose'
|
10
|
+
_mode = case mode.peek
|
11
|
+
when :translate then t 'Menu.ModeTranslate'
|
12
|
+
when :typing then t 'Menu.ModeTyping'
|
13
|
+
end
|
14
|
+
_courses = courses.each.with_index.map {|item,index| "#{index + 1}: #{item}" }
|
15
|
+
_mexit = t 'Menu.Exit'
|
16
|
+
|
17
|
+
view = ERB.new(IO.read(File.expand_path('../view/main_menu.erb', __dir__)))
|
18
|
+
view.result(binding)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module LanguageCards
|
2
|
+
module Helpers
|
3
|
+
module ViewHelper
|
4
|
+
def divider
|
5
|
+
'~' * SUBMENUWIDTH
|
6
|
+
end
|
7
|
+
|
8
|
+
def t str
|
9
|
+
I18n.t str
|
10
|
+
end
|
11
|
+
|
12
|
+
def draw left=nil, center=nil, right=nil
|
13
|
+
width = SUBMENUWIDTH
|
14
|
+
str = left.to_s
|
15
|
+
str = str + center.to_s.rjust(width/2 - str.length + center.to_s.length/2)
|
16
|
+
str + right.to_s.rjust(width - str.length)
|
17
|
+
end
|
18
|
+
|
19
|
+
def clear
|
20
|
+
printf ::LanguageCards::ESC::CLEAR
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,55 +1,21 @@
|
|
1
1
|
require_relative 'timer'
|
2
|
+
require_relative 'helpers/view_helper'
|
3
|
+
require_relative 'helpers/game_helper'
|
4
|
+
require_relative 'controllers/main_menu'
|
5
|
+
require_relative 'controllers/game'
|
6
|
+
require 'erb'
|
2
7
|
|
3
8
|
module LanguageCards
|
4
9
|
class UserInterface
|
5
|
-
|
6
|
-
|
10
|
+
include Helpers::ViewHelper
|
11
|
+
include Controllers
|
12
|
+
def initialize cards
|
13
|
+
@cards = cards
|
14
|
+
@courses = cards.classes
|
7
15
|
@mode = [:translate, :typing].cycle
|
8
|
-
@title = ""
|
9
|
-
end
|
10
|
-
|
11
|
-
def main_menu(courses:)
|
12
|
-
title = I18n.t 'Menu.Title'
|
13
|
-
select = I18n.t 'Menu.Choose'
|
14
|
-
mode = case @mode.peek
|
15
|
-
when :translate then I18n.t('Menu.ModeTranslate')
|
16
|
-
when :typing then I18n.t('Menu.ModeTyping')
|
17
|
-
end
|
18
|
-
mexit = I18n.t 'Menu.Exit'
|
19
|
-
|
20
|
-
<<-MAINMENU
|
21
|
-
#{'~' * SUBMENUWIDTH}
|
22
|
-
#{title}#{('v' + VERSION).rjust(SUBMENUWIDTH - title.length)}
|
23
|
-
#{'~' * SUBMENUWIDTH}
|
24
|
-
#{select}#{(I18n.t('Menu.GameMode') + mode).rjust(SUBMENUWIDTH - select.length)}
|
25
|
-
|
26
|
-
#{ courses.each.with_index.map {|item,index| "#{index + 1}: #{item}\n" }.join.chop }
|
27
|
-
|
28
|
-
#{mexit}#{("m: " + I18n.t('Menu.ToggleGameMode')).rjust(SUBMENUWIDTH - mexit.length)}
|
29
|
-
#{'~' * SUBMENUWIDTH}
|
30
|
-
MAINMENU
|
31
|
-
end
|
32
|
-
|
33
|
-
def score_menu(correct:, incorrect:)
|
34
|
-
score = "#{I18n.t 'Game.ScoreMenu.Score'}: #{correct.to_i} #{I18n.t 'Game.ScoreMenu.OutOf'} #{correct.to_i + incorrect.to_i}"
|
35
|
-
timer = @timer.time? ? (I18n.t('Timer.Timer') + ": " + @timer.ha) : ""
|
36
|
-
timer = timer + @timer.h.rjust(SUBMENUWIDTH - timer.length)
|
37
|
-
title = @title.to_s
|
38
|
-
<<-SCOREMENU
|
39
|
-
#{'~' * SUBMENUWIDTH}
|
40
|
-
#{title.rjust(SUBMENUWIDTH/2+title.length/2)}
|
41
|
-
#{'~' * SUBMENUWIDTH}
|
42
|
-
#{timer}
|
43
|
-
#{'~' * SUBMENUWIDTH}
|
44
|
-
#{score + I18n.t('Menu.Exit').rjust(SUBMENUWIDTH - score.length)}
|
45
|
-
|
46
|
-
#{@last}
|
47
|
-
#{'~' * SUBMENUWIDTH}
|
48
|
-
SCOREMENU
|
49
16
|
end
|
50
17
|
|
51
|
-
def start
|
52
|
-
@courses = cards.classes
|
18
|
+
def start
|
53
19
|
clear
|
54
20
|
|
55
21
|
CLI.say SPLASH_SCREEN
|
@@ -59,24 +25,29 @@ SCOREMENU
|
|
59
25
|
loop do
|
60
26
|
clear
|
61
27
|
|
62
|
-
CLI.say
|
28
|
+
CLI.say MainMenu.render courses: courses, mode: mode
|
63
29
|
|
64
30
|
value = CLI.ask("")
|
65
31
|
|
66
|
-
next
|
32
|
+
next mode.next if value =~ /\Am\z/i
|
67
33
|
value = value.to_i - 1 rescue next
|
68
34
|
|
69
|
-
|
35
|
+
last = nil
|
70
36
|
if (0..courses.length-1).include? value
|
71
37
|
collection = cards.select_collection(courses(value))
|
72
|
-
|
73
|
-
@timer = Timer.new
|
38
|
+
timer = Timer.new
|
74
39
|
begin
|
75
40
|
loop do
|
76
41
|
clear
|
77
|
-
|
78
|
-
CLI.say
|
79
|
-
|
42
|
+
timer.mark
|
43
|
+
CLI.say Game.render correct: @correct,
|
44
|
+
incorrect: @incorrect,
|
45
|
+
title: collection.name,
|
46
|
+
timer: timer,
|
47
|
+
last: last
|
48
|
+
result = Game.process(collection, mode)
|
49
|
+
result[:correct] ? correct : incorrect
|
50
|
+
last = result[:last]
|
80
51
|
end
|
81
52
|
rescue SystemExit, Interrupt
|
82
53
|
end
|
@@ -88,64 +59,17 @@ SCOREMENU
|
|
88
59
|
end
|
89
60
|
|
90
61
|
private
|
91
|
-
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
IC=Struct.new(:collection, :mode) do
|
96
|
-
def input
|
97
|
-
@input
|
98
|
-
end
|
99
|
-
|
100
|
-
def get_input
|
101
|
-
@input ||= CLI.ask("#{I18n.t('Game.TypeThis')} #{collection.mapped_as}: #{display}")
|
102
|
-
end
|
103
|
-
|
104
|
-
def comp_bitz
|
105
|
-
@comp_bitz ||= collection.rand
|
106
|
-
end
|
107
|
-
|
108
|
-
def display
|
109
|
-
comp_bitz.display
|
110
|
-
end
|
111
|
-
|
112
|
-
def expected
|
113
|
-
comp_bitz.expected
|
114
|
-
end
|
115
|
-
|
116
|
-
def correct_msg
|
117
|
-
"#{I18n.t('Game.Correct')} #{input} = #{display}"
|
118
|
-
end
|
119
|
-
|
120
|
-
def incorrect_msg
|
121
|
-
output = "#{I18n.t('Game.Incorrect')} #{input} != #{display}"
|
122
|
-
output << " #{I18n.t('Game.Its')} #{expected}" if mode == :translate
|
123
|
-
output
|
124
|
-
end
|
125
|
-
|
126
|
-
def valid?
|
127
|
-
collection.correct?(input, comp_bitz)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def game_logic(c)
|
132
|
-
ic = IC.new(c, @mode.peek)
|
133
|
-
ic.get_input
|
134
|
-
ic.valid? ? last_was_correct(ic) : last_was_incorrect(ic)
|
135
|
-
end
|
136
|
-
|
137
|
-
def last_was_correct(ic)
|
62
|
+
attr_reader :mode, :cards
|
63
|
+
def correct
|
138
64
|
@correct = @correct.to_i + 1
|
139
|
-
@last = ic.correct_msg
|
140
65
|
end
|
141
66
|
|
142
|
-
def
|
67
|
+
def incorrect
|
143
68
|
@incorrect = @incorrect.to_i + 1
|
144
|
-
@last = ic.incorrect_msg
|
145
69
|
end
|
146
70
|
|
147
71
|
def courses(value = nil)
|
148
|
-
courses = @courses.select {|c| detect_course_mode(c) ==
|
72
|
+
courses = @courses.select {|c| detect_course_mode(c) == mode.peek }
|
149
73
|
value ? courses[value] : courses
|
150
74
|
end
|
151
75
|
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= divider %>
|
2
|
+
<%= draw(_title, nil, 'v' + VERSION) %>
|
3
|
+
<%= divider %>
|
4
|
+
<%= draw(_select, nil, I18n.t('Menu.GameMode') + _mode) %>
|
5
|
+
<% _courses.each do |course| %>
|
6
|
+
<%= course.chomp %><% end %>
|
7
|
+
|
8
|
+
<%= draw(_mexit, nil, ("m: " + I18n.t('Menu.ToggleGameMode'))) %>
|
9
|
+
<%= divider %>
|
data/locales/en.yml
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: language_cards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel P. Clark
|
@@ -106,11 +106,17 @@ files:
|
|
106
106
|
- lib/language_cards/card_collection.rb
|
107
107
|
- lib/language_cards/comp_bitz.rb
|
108
108
|
- lib/language_cards/comparator.rb
|
109
|
+
- lib/language_cards/controllers/game.rb
|
110
|
+
- lib/language_cards/controllers/main_menu.rb
|
111
|
+
- lib/language_cards/helpers/game_helper.rb
|
112
|
+
- lib/language_cards/helpers/view_helper.rb
|
109
113
|
- lib/language_cards/language_cards.rb
|
110
114
|
- lib/language_cards/mappings.rb
|
111
115
|
- lib/language_cards/timer.rb
|
112
116
|
- lib/language_cards/user_interface.rb
|
113
117
|
- lib/language_cards/version.rb
|
118
|
+
- lib/language_cards/view/game.erb
|
119
|
+
- lib/language_cards/view/main_menu.erb
|
114
120
|
- locales/en.yml
|
115
121
|
homepage: http://github.com/danielpclark/language_cards
|
116
122
|
licenses:
|