glimmer_wordle 1.0.0 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18a1772cb458e49ced9e103096f736c307ae5b4e100457ea5e19ba04e4f4d28a
4
- data.tar.gz: 9e341e855c03fb9a587f0b537988b60fe8771e9e4d3ba19d38a9678f98bee849
3
+ metadata.gz: b5315f737af82dff39d911a59688cefcbf9f4b1d2aaca7c5efcc3c44df01d1ca
4
+ data.tar.gz: 65499b9acdfb6e21b9aafe4df8825e2d082c2ef2cbc20d48c526eb3216a74eb2
5
5
  SHA512:
6
- metadata.gz: 370bc2a11daa444256e6dcd7fb43129d3f09fe17fdd0f6db4b972ce2455e1437ad3473682ac54c71cbf208c81f6490a93a6d1978d3b0fe4ede55b6ab7ae39e3d
7
- data.tar.gz: 53ee100edcbacaa594ed6adf5b97a8041d44f1a25f281722093c1c9159df445c8bb4deb5b292186dfa5910e22e70665668378a4a514e8a3e587ba92f820cc564
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
- ## Word Game
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
  [![Gem Version](https://badge.fury.io/rb/glimmer_wordle.svg)](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/t77si617tsaxe0c/Glimmer%20Wordle-arm64-1.0.0.dmg?dl=1)
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/amlrm4nufdlzlb1/Glimmer%20Wordle-1.0.0.dmg?dl=1)
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.0.0
1
+ 1.1.2
@@ -4,9 +4,9 @@ class Wordle
4
4
  include Glimmer::UI::CustomShell
5
5
 
6
6
  COLOR_TO_BACKGROUND_COLOR_MAP = {
7
- green: :dark_green,
8
- yellow: :dark_yellow,
9
- gray: :dark_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
- ALPHABET_ROW1 = %w[Q W E R T Y U I O P]
19
- ALPHABET_ROW2 = %w[A S D F G H J K L]
20
- ALPHABET_ROW3 = %w[Z X C V B N M]
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
- alphabets
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 '&About...'
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(ALPHABET_ROW1) {
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(ALPHABET_ROW2) {
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(ALPHABET_ROW3) {
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
- if index > 0
221
- @borders.each { |caret| caret.foreground = :gray}
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
- @letter = @letters.find {|letter| letter.string == ''}
266
- index = @letters.index(@letter)
267
- if @letter
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
- (ALPHABET_ROW1 + ALPHABET_ROW2 + ALPHABET_ROW3).each_with_index do |alphabet_character, i|
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.dispose
382
+ @restart_button&.dispose
281
383
  @canvasses.dup.each(&:dispose)
282
384
  @canvasses.clear
283
- body_root.content { word_guesser }
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
- (ALPHABET_ROW1 + ALPHABET_ROW2 + ALPHABET_ROW3).each_with_index do |alphabet_character, i|
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
- @five_letter_word.guess_results.each do |row|
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
- }.open
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
@@ -7,6 +7,7 @@ rescue
7
7
  # this runs when packaged as a gem (no bundler)
8
8
  require 'glimmer-dsl-swt'
9
9
  # add more gems if needed
10
+ require 'clipboard'
10
11
  end
11
12
 
12
13
  Clipboard.implementation = Clipboard::Java
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.0.0
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-02-07 00:00:00.000000000 Z
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.3
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.3
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