glimmer_wordle 1.0.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/VERSION +1 -1
- data/app/wordle/view/app_view.rb +197 -42
- data/app/wordle.rb +1 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5315f737af82dff39d911a59688cefcbf9f4b1d2aaca7c5efcc3c44df01d1ca
|
4
|
+
data.tar.gz: 65499b9acdfb6e21b9aafe4df8825e2d082c2ef2cbc20d48c526eb3216a74eb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b589f94aac13a96e7b9cdef7865b13c472f5976ee28ea754d44fff61056f35fe91c27a30c0b1e7a49cd81aed03cebd506655ace00c4067ceb163d30f800dc52f
|
7
|
+
data.tar.gz: 2c08a7f262aa07d5c3053546f8da56ed75a2631d6d6811ffcba1a76322ec17f492c6691da2b1427843bcd679162b4b0e9ed7e4384eaaf134b8a4bf88d4dc5659
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=85 /> Wordle
|
2
|
-
##
|
1
|
+
# <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=85 /> Glimmer Wordle 1.1.2
|
2
|
+
## Play Wordle Endlessly with No Limit!
|
3
3
|
[](http://badge.fury.io/rb/glimmer_wordle)
|
4
4
|
|
5
5
|
[Wordle](https://en.wikipedia.org/wiki/Wordle) word game desktop GUI app written [test-first](https://github.com/AndyObtiva/wordle/blob/master/spec/app/model/five_letter_word_spec.rb) using [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Framework) as inspiration by [Kevin Newton's blog post](https://kddnewton.com/2022/01/29/solving-wordle-in-ruby.html).
|
@@ -14,9 +14,9 @@
|
|
14
14
|
|
15
15
|
### Download
|
16
16
|
|
17
|
-
[<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle DMG for Mac ARM64 Monterey and Older](https://www.dropbox.com/s/
|
17
|
+
[<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle 1.1.2 DMG for Mac ARM64 Monterey and Older](https://www.dropbox.com/s/rmanrz81qfrpqq5/Glimmer%20Wordle-arm64-1.1.2.dmg?dl=1)
|
18
18
|
|
19
|
-
[<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle DMG for Mac x86_64 Catalina and Older](https://www.dropbox.com/s/
|
19
|
+
[<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle 1.1.2 DMG for Mac x86_64 Catalina and Older](https://www.dropbox.com/s/ysureb9o1dky7w0/Glimmer%20Wordle-1.1.2.dmg?dl=1)
|
20
20
|
|
21
21
|
### Install Ruby Gem
|
22
22
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.2
|
data/app/wordle/view/app_view.rb
CHANGED
@@ -4,9 +4,9 @@ class Wordle
|
|
4
4
|
include Glimmer::UI::CustomShell
|
5
5
|
|
6
6
|
COLOR_TO_BACKGROUND_COLOR_MAP = {
|
7
|
-
green:
|
8
|
-
yellow:
|
9
|
-
gray:
|
7
|
+
green: rgb(106, 170, 100),
|
8
|
+
yellow: rgb(201, 180, 88),
|
9
|
+
gray: rgb(120, 124, 126),
|
10
10
|
}
|
11
11
|
|
12
12
|
COLOR_TO_TEXT_COLOR_MAP = {
|
@@ -15,10 +15,20 @@ class Wordle
|
|
15
15
|
gray: :white,
|
16
16
|
}
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
ALPHABET_LAYOUTS = {
|
19
|
+
alphabetical: [
|
20
|
+
%w[A B C D E F G H I J],
|
21
|
+
%w[K L M N O P Q R S],
|
22
|
+
%w[T U V W X Y Z],
|
23
|
+
],
|
24
|
+
qwerty: [
|
25
|
+
%w[Q W E R T Y U I O P],
|
26
|
+
%w[A S D F G H J K L],
|
27
|
+
%w[Z X C V B N M],
|
28
|
+
],
|
29
|
+
}
|
30
|
+
|
31
|
+
CONFIG_FILE = File.join(Dir.home, '.glimmer_wordle')
|
22
32
|
|
23
33
|
before_body do
|
24
34
|
@display = display {
|
@@ -31,6 +41,10 @@ class Wordle
|
|
31
41
|
on_swt_keydown do |key_event|
|
32
42
|
if key_event.keyCode == 8
|
33
43
|
do_backspace
|
44
|
+
elsif key_event.keyCode == swt(:arrow_left)
|
45
|
+
do_left
|
46
|
+
elsif key_event.keyCode == swt(:arrow_right)
|
47
|
+
do_right
|
34
48
|
elsif key_event.keyCode == swt(:cr)
|
35
49
|
if @five_letter_word.status == :in_progress
|
36
50
|
do_guess
|
@@ -43,6 +57,8 @@ class Wordle
|
|
43
57
|
end
|
44
58
|
}
|
45
59
|
@five_letter_word = Model::FiveLetterWord.new
|
60
|
+
config = load_config
|
61
|
+
@alphabet_layout = config[:alphabet_layout] || :alphabetical
|
46
62
|
end
|
47
63
|
|
48
64
|
## Add widget content inside custom shell body
|
@@ -65,7 +81,7 @@ class Wordle
|
|
65
81
|
|
66
82
|
app_menu_bar
|
67
83
|
|
68
|
-
|
84
|
+
alphabet_container
|
69
85
|
|
70
86
|
label {
|
71
87
|
layout_data :center, :center, true, false
|
@@ -100,11 +116,47 @@ class Wordle
|
|
100
116
|
}
|
101
117
|
}
|
102
118
|
|
119
|
+
menu {
|
120
|
+
text '&View'
|
121
|
+
|
122
|
+
menu {
|
123
|
+
text 'Alphabet &Layout'
|
124
|
+
|
125
|
+
menu_item(:radio) {
|
126
|
+
text '&Alphabetical'
|
127
|
+
selection @alphabet_layout == :alphabetical
|
128
|
+
|
129
|
+
on_widget_selected {
|
130
|
+
self.alphabet_layout = :alphabetical
|
131
|
+
rebuild_alphabet_container
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
menu_item(:radio) {
|
136
|
+
text '&Qwerty'
|
137
|
+
selection @alphabet_layout == :qwerty
|
138
|
+
|
139
|
+
on_widget_selected {
|
140
|
+
self.alphabet_layout = :qwerty
|
141
|
+
rebuild_alphabet_container
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
103
147
|
menu {
|
104
148
|
text '&Help'
|
105
149
|
|
106
150
|
menu_item {
|
107
|
-
text '&
|
151
|
+
text '&Instructions'
|
152
|
+
|
153
|
+
on_widget_selected {
|
154
|
+
display_instructions_dialog
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
menu_item {
|
159
|
+
text '&About'
|
108
160
|
|
109
161
|
on_widget_selected {
|
110
162
|
display_about_dialog
|
@@ -114,6 +166,21 @@ class Wordle
|
|
114
166
|
}
|
115
167
|
end
|
116
168
|
|
169
|
+
def display_instructions_dialog
|
170
|
+
message_box(body_root) {
|
171
|
+
text 'Instructions'
|
172
|
+
message <<~MULTI_LINE_STRING
|
173
|
+
Make 6 guesses for a 5-letter word.
|
174
|
+
|
175
|
+
If you enter a letter that is part of the word, and at the right location, it becomes green,
|
176
|
+
|
177
|
+
If you enter a letter that is part of the word, but at the wrong location, it becomes yellow.
|
178
|
+
|
179
|
+
If you enter a letter that is not part of the word, it become red.
|
180
|
+
MULTI_LINE_STRING
|
181
|
+
}.open
|
182
|
+
end
|
183
|
+
|
117
184
|
def display_about_dialog
|
118
185
|
message_box(body_root) {
|
119
186
|
text 'About'
|
@@ -121,22 +188,38 @@ class Wordle
|
|
121
188
|
}.open
|
122
189
|
end
|
123
190
|
|
191
|
+
def alphabet_container
|
192
|
+
@alphabet_container = composite {
|
193
|
+
layout_data(:center, :center, true, false)
|
194
|
+
|
195
|
+
grid_layout {
|
196
|
+
margin_width 0
|
197
|
+
margin_height 0
|
198
|
+
vertical_spacing 0
|
199
|
+
}
|
200
|
+
|
201
|
+
background :white
|
202
|
+
|
203
|
+
alphabets
|
204
|
+
}
|
205
|
+
end
|
206
|
+
|
124
207
|
def alphabets
|
125
|
-
alphabet_row(
|
208
|
+
alphabet_row(ALPHABET_LAYOUTS[@alphabet_layout][0]) {
|
126
209
|
layout_data(:center, :center, true, false) {
|
127
210
|
width_hint 318
|
128
211
|
height_hint 50
|
129
212
|
}
|
130
213
|
}
|
131
214
|
|
132
|
-
alphabet_row(
|
215
|
+
alphabet_row(ALPHABET_LAYOUTS[@alphabet_layout][1]) {
|
133
216
|
layout_data(:center, :center, true, false) {
|
134
217
|
width_hint 288
|
135
218
|
height_hint 50
|
136
219
|
}
|
137
220
|
}
|
138
221
|
|
139
|
-
alphabet_row(
|
222
|
+
alphabet_row(ALPHABET_LAYOUTS[@alphabet_layout][2]) {
|
140
223
|
layout_data(:center, :center, true, false) {
|
141
224
|
width_hint 222
|
142
225
|
height_hint 50
|
@@ -169,6 +252,10 @@ class Wordle
|
|
169
252
|
}
|
170
253
|
end
|
171
254
|
|
255
|
+
def alphabet_layout_alphabets
|
256
|
+
ALPHABET_LAYOUTS[@alphabet_layout].reduce(:+)
|
257
|
+
end
|
258
|
+
|
172
259
|
def word_guesser
|
173
260
|
@canvasses ||= []
|
174
261
|
margin_x = 5
|
@@ -214,13 +301,11 @@ class Wordle
|
|
214
301
|
|
215
302
|
def do_backspace
|
216
303
|
@letter = @letters.find {|letter| letter.string == ''}
|
217
|
-
index = @letter ? @letters.index(@letter) - 1 : 4
|
304
|
+
index = @letter ? [@letters.index(@letter) - 1, 0].max : 4
|
218
305
|
@letter = @letters[index]
|
219
306
|
@letter.string = ''
|
220
|
-
|
221
|
-
|
222
|
-
@borders[index - 1].foreground = :title_background
|
223
|
-
end
|
307
|
+
@borders.each { |caret| caret.foreground = :gray}
|
308
|
+
@borders[index].foreground = :title_background
|
224
309
|
end
|
225
310
|
|
226
311
|
def do_guess
|
@@ -261,26 +346,47 @@ class Wordle
|
|
261
346
|
body_root.pack(true)
|
262
347
|
end
|
263
348
|
|
349
|
+
def highlighted_letter_index
|
350
|
+
@borders.each_with_index.find {|border, i| border.foreground.first == color(:title_background).swt_color }.last
|
351
|
+
end
|
352
|
+
|
264
353
|
def do_type(character)
|
265
|
-
|
266
|
-
|
267
|
-
|
354
|
+
index = highlighted_letter_index
|
355
|
+
@letter = @letters[index]
|
356
|
+
@letter.string = character.upcase
|
357
|
+
if @letters.any? {|letter| letter.string == ''}
|
268
358
|
@borders.each { |caret| caret.foreground = :gray}
|
269
359
|
@borders[index == 4 ? 4 : index + 1].foreground = :title_background
|
270
|
-
@letter.string = character.upcase
|
271
360
|
end
|
272
361
|
end
|
273
362
|
|
363
|
+
def do_left
|
364
|
+
index = [highlighted_letter_index - 1, 0].max
|
365
|
+
@borders.each { |caret| caret.foreground = :gray}
|
366
|
+
@borders[index].foreground = :title_background
|
367
|
+
end
|
368
|
+
|
369
|
+
def do_right
|
370
|
+
index = [highlighted_letter_index + 1, @letters.count - 1].min
|
371
|
+
@borders.each { |caret| caret.foreground = :gray}
|
372
|
+
@borders[index].foreground = :title_background
|
373
|
+
end
|
374
|
+
|
274
375
|
def do_restart
|
275
|
-
|
376
|
+
@share_text_dialog&.close
|
377
|
+
alphabet_layout_alphabets.each_with_index do |alphabet_character, i|
|
276
378
|
@alphabet_borders[i].foreground = :gray
|
277
379
|
@alphabet_rectangles[i].background = :white
|
278
380
|
@alphabet_letters[i].foreground = :black
|
279
381
|
end
|
280
|
-
@restart_button
|
382
|
+
@restart_button&.dispose
|
281
383
|
@canvasses.dup.each(&:dispose)
|
282
384
|
@canvasses.clear
|
283
|
-
|
385
|
+
@guess_button&.dispose
|
386
|
+
body_root.content {
|
387
|
+
word_guesser
|
388
|
+
guess_button
|
389
|
+
}
|
284
390
|
body_root.layout(true, true)
|
285
391
|
body_root.pack(true)
|
286
392
|
@five_letter_word.refresh
|
@@ -297,7 +403,7 @@ class Wordle
|
|
297
403
|
end
|
298
404
|
|
299
405
|
def update_alphabet_background_colors
|
300
|
-
|
406
|
+
alphabet_layout_alphabets.each_with_index do |alphabet_character, i|
|
301
407
|
result_color = @five_letter_word.colored_alphabets[alphabet_character.downcase]
|
302
408
|
if result_color
|
303
409
|
background_color = COLOR_TO_BACKGROUND_COLOR_MAP[result_color]
|
@@ -321,27 +427,16 @@ class Wordle
|
|
321
427
|
end
|
322
428
|
|
323
429
|
def display_share_text_dialog
|
324
|
-
result =
|
325
|
-
|
326
|
-
row.each do |result_color|
|
327
|
-
case result_color
|
328
|
-
when :green
|
329
|
-
result << "🟩"
|
330
|
-
when :yellow
|
331
|
-
result << "🟨"
|
332
|
-
when :gray
|
333
|
-
result << "⬜"
|
334
|
-
end
|
335
|
-
end
|
336
|
-
result << "\n"
|
337
|
-
end
|
338
|
-
|
430
|
+
result = "#{@five_letter_word.answer.upcase}\n\n#{emoji_result}"
|
431
|
+
|
339
432
|
Clipboard.copy(result)
|
340
433
|
|
341
|
-
dialog(body_root) {
|
434
|
+
@share_text_dialog = dialog(body_root) {
|
342
435
|
grid_layout
|
343
436
|
text 'Share Result'
|
344
437
|
|
438
|
+
app_menu_bar
|
439
|
+
|
345
440
|
label {
|
346
441
|
layout_data :center, :center, true, false
|
347
442
|
text 'Result is copied to clipboard!'
|
@@ -354,7 +449,67 @@ class Wordle
|
|
354
449
|
alignment :center
|
355
450
|
text result
|
356
451
|
}
|
357
|
-
}
|
452
|
+
}
|
453
|
+
@share_text_dialog.open
|
454
|
+
end
|
455
|
+
|
456
|
+
def dispose_alphabet_container_children
|
457
|
+
@alphabet_rectangles.clear
|
458
|
+
@alphabet_borders.clear
|
459
|
+
@alphabet_letters.clear
|
460
|
+
@alphabet_container.children.each(&:dispose)
|
461
|
+
end
|
462
|
+
|
463
|
+
def rebuild_alphabet_container
|
464
|
+
dispose_alphabet_container_children
|
465
|
+
@alphabet_container.content {
|
466
|
+
alphabets
|
467
|
+
}
|
468
|
+
@alphabet_container.layout(true, true)
|
469
|
+
@alphabet_container.pack(true)
|
470
|
+
update_alphabet_background_colors
|
471
|
+
end
|
472
|
+
|
473
|
+
def alphabet_layout=(value)
|
474
|
+
@alphabet_layout = value
|
475
|
+
save_config
|
476
|
+
end
|
477
|
+
|
478
|
+
def new_config
|
479
|
+
{
|
480
|
+
alphabet_layout: @alphabet_layout
|
481
|
+
}
|
482
|
+
end
|
483
|
+
|
484
|
+
def save_config
|
485
|
+
File.write(CONFIG_FILE, YAML.dump(new_config))
|
486
|
+
rescue => e
|
487
|
+
puts e.full_message
|
488
|
+
end
|
489
|
+
|
490
|
+
def load_config
|
491
|
+
File.exist?(CONFIG_FILE) ? YAML.load(File.read(CONFIG_FILE)) : {}
|
492
|
+
rescue => e
|
493
|
+
puts e.full_message
|
494
|
+
{}
|
495
|
+
end
|
496
|
+
|
497
|
+
def emoji_result
|
498
|
+
result = ''
|
499
|
+
@five_letter_word.guess_results.each do |row|
|
500
|
+
row.each do |result_color|
|
501
|
+
case result_color
|
502
|
+
when :green
|
503
|
+
result << "🟩"
|
504
|
+
when :yellow
|
505
|
+
result << "🟨"
|
506
|
+
when :gray
|
507
|
+
result << "⬜"
|
508
|
+
end
|
509
|
+
end
|
510
|
+
result << "\n"
|
511
|
+
end
|
512
|
+
result
|
358
513
|
end
|
359
514
|
end
|
360
515
|
end
|
data/app/wordle.rb
CHANGED
metadata
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer_wordle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
16
|
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: 4.22.2.
|
18
|
+
version: 4.22.2.6
|
19
19
|
name: glimmer-dsl-swt
|
20
20
|
prerelease: false
|
21
21
|
type: :runtime
|
@@ -23,7 +23,7 @@ dependencies:
|
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 4.22.2.
|
26
|
+
version: 4.22.2.6
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
29
29
|
requirements:
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
description: Glimmer Wordle - Word Game Desktop GUI App Written in Glimmer DSL for
|
98
|
-
SWT (requires JRuby)
|
98
|
+
SWT (requires JRuby) - Play Wordle Endlessly with No Limit!
|
99
99
|
email: andy.am@gmail.com
|
100
100
|
executables:
|
101
101
|
- glimmer_wordle
|