Browse code

Ya encuentra palabras correctas, pero tiene un pequeño error cuando se reauna la partida en una palabra partida

NikaZhenya authored on 27/09/2018 18:05:25
Showing 3 changed files
... ...
@@ -16,12 +16,13 @@ function create() {
16 16
         on_win          :   function(){console.log('on_win')},
17 17
         on_new_time     :   on_new_time,
18 18
         on_new_score    :   on_new_score,
19
+        on_new_word     :   on_new_word,
19 20
         on_new_record   :   on_new_record
20 21
     })
21 22
 }
22 23
 
23 24
 function wipe () {
24
-    foo.wipe(type)
25
+    foo.wipe('all')
25 26
     foo.destroy()
26 27
     setTimeout(create, 300)
27 28
 }
... ...
@@ -29,7 +30,7 @@ function wipe () {
29 29
 function print (t) {
30 30
     var div_head = document.getElementById('foo-head-1')
31 31
 
32
-    if (t == 'on_line_completed' || t == 'on_new_record')
32
+    if (t == 'on_line_completed' || t == 'on_new_record' || t == 'on_new_word')
33 33
         console.log(t)
34 34
     else if (t == 'on_new_time')
35 35
         if (debug)
... ...
@@ -62,6 +63,7 @@ function print (t) {
62 62
 
63 63
 function on_new_time        () {print('on_new_time'      )}
64 64
 function on_new_score       () {print('on_new_score'     )}
65
+function on_new_word        () {print('on_new_word'      )}
65 66
 function on_new_record      () {print('on_new_record'    )}
66 67
 function on_line_completed  () {print('on_line_completed')}
67 68
 function on_line_correct    () {print('on_line_correct'  )}
... ...
@@ -62,8 +62,7 @@ El objeto `foo.data` contiene los siguientes elementos:
62 62
 * `lines_correct`. `Integer` que indica el total de líneas correctas.
63 63
 * `lines_incorrect`. `Integer` que indica el total de líneas incorrectas.
64 64
 * `letter`. `Object` que indica el elemento DOM de la letra más reciente en juego.
65
-* `words`. `Array` que indica las palabras encontradas en el juego actual, según orden de aparición y con repeticiones.
66
-* `new_words`. `Array` que indica las palabras nuevas encontradas en el juego actual, ordenadas alfabéticamente y sin repeticiones.
65
+* `new_words`. `Array` que indica las palabras nuevas encontradas en el juego actual según el orden de aparición.
67 66
 
68 67
 ### `foo.create()`
69 68
 
... ...
@@ -97,9 +96,10 @@ La función `foo.create()` tiene varios parámetros adicionales en cualquier mod
97 97
 * `on_win`. `Function || String` que indica la función a ejecutar cuando se gana el juego. Por defecto `''`.
98 98
 * `on_lose`. `Function || String` que indica la función a ejecutar cuando se pierde el juego. Por defecto `''`.
99 99
 * `on_error`. `Function || String` que indica la función a ejecutar cuando no se pueden cargar los datos del juego. Por defecto `''`.
100
-* `on_new_time`. `Function || String` que indica la funcón a ejecutar cuando el temporizador se actualiza.
101
-* `on_new_score`. `Function || String` que indica la funcón a ejecutar cuando el puntaje se actualiza.
102
-* `on_new_record`. `Function || String` que indica la funcón a ejecutar cuando se obtiene un puntaje de los más altos.
100
+* `on_new_time`. `Function || String` que indica la función a ejecutar cuando el temporizador se actualiza.
101
+* `on_new_score`. `Function || String` que indica la función a ejecutar cuando el puntaje se actualiza.
102
+* `on_new_word`. `Function || String` que indica la función a ejecutar cuando se encuentra una nueva palabra.
103
+* `on_new_record`. `Function || String` que indica la función a ejecutar cuando se obtiene un puntaje de los más altos.
103 104
 
104 105
 Para la modalidad `arcade`, existen estos parámetros adicionales:
105 106
 
... ...
@@ -9,7 +9,8 @@ var foo = (function() {
9 9
     var game_opt
10 10
 
11 11
     // Variables que van cambiando
12
-    var touch_old = null,
12
+    var incomplete_word = '',
13
+        touch_old = null,
13 14
         touch_timer,
14 15
         game_timer,
15 16
         bar_timer
... ...
@@ -19,38 +20,9 @@ var foo = (function() {
19 19
         return this[Math.floor(Math.random() * this.length)]
20 20
     }
21 21
 
22
-    // Une palabras separadas por guion
23
-    Array.prototype.unit = function () {
24
-        return this.join('¤').replace('-¤', '').split('¤').capitalize()
25
-    }
26
-
27
-    // Agrega versal inicial a todas las palabras
28
-    Array.prototype.capitalize = function () {
29
-        var fin = []
30
-
31
-        for (i = 0; i < this.length; i++) {
32
-            this[i] = this[i].toLowerCase()
33
-            fin.push(this[i].charAt(0).toUpperCase() + this[i].slice(1))
34
-        }
35
-
36
-        return fin
37
-    }
38
-
39
-    // Crea un conjunto a partir de la diferencia de dos conjuntos; viene de: https://stackoverflow.com/questions/18998767/remove-contents-of-an-array-from-another-array#18998911
40
-    Array.prototype.diff = function (a) {
41
-
42
-        function compute (a, b) {
43
-            return a.filter(function (v) {
44
-                return b.indexOf(v) == -1
45
-            })
46
-        }
47
-
48
-        if (this.length == 0)
49
-            return a
50
-        else if (this.length > a.length)
51
-            return compute(this, a)
52
-        else
53
-            return compute(a, this)
22
+    // Limpia un conjunto
23
+    Array.prototype.clear = function () {
24
+        return this.filter(function (e) {return e})
54 25
     }
55 26
 
56 27
     // Elimina duplicados; basado en: https://stackoverflow.com/questions/4833651/javascript-array-sort-and-unique#answer-7076202
... ...
@@ -94,6 +66,11 @@ var foo = (function() {
94 94
         return this
95 95
     }
96 96
 
97
+    // Capitaliza la línea de texto
98
+    String.prototype.capitalize = function () {
99
+        return this.charAt(0).toUpperCase() + this.toLowerCase().slice(1)
100
+    }
101
+
97 102
     // Elimina tildes a las letras; basado en: https://stackoverflow.com/questions/286921/efficiently-replace-all-accented-characters-in-a-string//6123591
98 103
     String.prototype.transliterate = function() {
99 104
         var translate_re = /[ÁÉÍÓÚÜÑáéíóúüñ]/g,
... ...
@@ -556,20 +533,13 @@ var foo = (function() {
556 556
             game_opt.line_correct = line_text_correct.trim()
557 557
             foo.data.line_correct = game_opt.line_correct
558 558
 
559
+            // Analiza las palabras en búsqueda de alguna nueva
560
+            compute_words(line_text, line_text_correct)
561
+
559 562
             // Corre función cuando se completa la línea correctamente
560 563
             if (correct) {
561 564
                 if (line_completed) {
562
-                    // Limpia las palabras
563
-                    line_text = line_text.trim().split(' ')
564
-/*
565
-                    // Se fijan las variables
566
-                    game_opt.words = (foo.data.words.join('¤') + '¤' + line_text.join('¤'))      // Une los elementos pasados con los nuevos
567
-                                                    .replace(/^¤/, '')                           // Elimina para evitar un elemento vacío
568
-                                                    .split('¤')                                  // Crea de nuevo un conjunto
569
-                                                    .unit()                                      // Junta palabras separadas por guion
570
-                    foo.data.words = new Array
571
-                    foo.data.words = game_opt.words.slice()
572
-*/
565
+
573 566
                     // Si se trata del modo arcade, además agrega unos segundos
574 567
                     if (game_opt.type == 'arcade')
575 568
                         new_time(score)
... ...
@@ -583,6 +553,7 @@ var foo = (function() {
583 583
             // Corre función cuando se completa incorrectamente
584 584
             } else {
585 585
                 if (line_completed) {
586
+
586 587
                     // Se suma una línea correcta
587 588
                     foo.data.lines_incorrect++
588 589
 
... ...
@@ -591,9 +562,6 @@ var foo = (function() {
591 591
                 }
592 592
             }
593 593
 
594
-            // Valida las palabras nuevas obtenidas
595
-            compute_words()
596
-
597 594
             // Habilita la siguiente línea o termina el juego
598 595
             if (e.nextSibling != null) {
599 596
                 if (e.nextSibling.childNodes.length == 1) {
... ...
@@ -624,53 +592,75 @@ var foo = (function() {
624 624
     }
625 625
 
626 626
     // Analiza todo lo relativo a las palabras
627
-    function compute_words (final = false) {
628
-        var sav_words = localStorage.getItem(game_opt.type + '_words_' + game_opt.lang) != null ? JSON.parse(localStorage.getItem(game_opt.type + '_words_' + game_opt.lang)) : {total: 0, current: 0, words: []},
629
-            lis_words = game_opt.data.words,
630
-            cur_words = game_opt.words,
631
-            cur_line  = game_opt.line_correct.split(' ').capitalize()
632
-
633
-console.log(cur_words, cur_line)
634
-
635
-/*
636
-        sav_words.total   = lis_words.length
637
-
638
-        if (final) {
639
-            var new_words = sav_words.words.diff(game_opt.words).uniq(),    // Palabras nuevas
640
-                fin_words = sav_words.words.concat(new_words).unit().uniq() // Palabras antiguas + nuevas
641
-console.log(sav_words.words.concat(new_words))
642
-console.log(sav_words.words.concat(new_words).unit())
643
-console.log(sav_words.words.concat(new_words).unit().uniq())
644
-            // Se fijan variables
645
-            game_opt.new_words = new_words.slice()
646
-            foo.data.new_words = new Array
647
-            foo.data.new_words = game_opt.new_words.slice()
627
+    function compute_words (line_text, line_text_correct) {
628
+        var sav_words = localStorage.getItem(game_opt.type + '_words_' + game_opt.lang) != null ? JSON.parse(localStorage.getItem(game_opt.type + '_words_' + game_opt.lang)) : {total: game_opt.data.words.length, current: 0, words: []},
629
+            current_w = line_text.replace(/[^(\s|A-zÀ-ÿ|\-)]/, '').split(/\s+/).clear(),
630
+            correct_w = line_text_correct.replace(/[^(\s|A-zÀ-ÿ|\-)]/, '').split(/\s+/).clear()
648 631
 
649
-            // Añade los nuevos valores
650
-            sav_words.current = fin_words.length
651
-            sav_words.words   = fin_words.slice()
652
-        } else {
653
-            if (typeof game_opt.words != undefined && game_opt.words != null)
654
-                sav_words.words   = sav_words.words.concat(game_opt.words)
632
+        // Añade la palabra al guardado local y a 'foo.data'
633
+        function add_word (w) {
634
+            w = w.capitalize()
635
+
636
+            // Si la palabra no está en el conjunto
637
+            if (sav_words.words.indexOf(w) == -1) {
638
+                sav_words.words   = sav_words.words.concat(w)
639
+                sav_words.current = sav_words.words.length
640
+
641
+                // Se fija variable
642
+                game_opt.new_words = sav_words.words.slice()
643
+                foo.data.new_words = game_opt.new_words.slice()
644
+
645
+                // Guarda los datos
646
+                localStorage.setItem(game_opt.type + '_words_' + game_opt.lang, JSON.stringify(sav_words))
647
+
648
+                // Corre función cuando se completa el juego satisfactoriamente
649
+                exec_fn(game_opt.on_new_word)
650
+            }
655 651
         }
656 652
 
657
-console.log('1:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang))
653
+        // Analiza la línea palabra por palabra
654
+        for (i = 0; i < current_w.length; i++) {
655
+            var word = ''
656
+
657
+            // Si la palabra es la correcta
658
+            if (current_w[i] == correct_w[i]) {
659
+                // Guarda la palabra si tiene separación silábica
660
+                if (correct_w[i].charAt(correct_w[i].length - 1) == '-') {
661
+                    incomplete_word = correct_w[i]
662
+                // Se completa una palabra si estaba separada
663
+                } else if (incomplete_word != null && incomplete_word != '') {
664
+                    word = (incomplete_word + correct_w[i]).replace('-', '')
665
+                    incomplete_word = ''
666
+                // Palabra no interrumpida por separación silábica
667
+                } else if (incomplete_word != null) {
668
+                    word = correct_w[i]
669
+                }
670
+
671
+                // Resetea
672
+                if (incomplete_word == null) incomplete_word = ''
658 673
 
659
-        // Guarda las palabras
660
-        localStorage.setItem(game_opt.type + '_words_' + game_opt.lang, JSON.stringify(sav_words))
674
+                // Añade la palabra
675
+                if (word != '') add_word(word)
661 676
 
662
-console.log('2:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang))
663
-*/
677
+            // Si no es correcta, limpia la palabra guardada
678
+            } else {
679
+                // Cuando era una palabra con separación silábica se marca nulo para detectarla y rechazar el resto de la palabra
680
+                if (correct_w[i].charAt(correct_w[i].length - 1) == '-')
681
+                    incomplete_word = null
682
+                // Resetea
683
+                else incomplete_word = ''
684
+            }
685
+        }
664 686
     }
665 687
 
666 688
     // Analiza si hay nuevos récords
667 689
     function highest_scores () {
668 690
         var hig_score  = localStorage.getItem(game_opt.type + '_highest_scores_' + game_opt.lang),
669 691
             new_score  = foo.data.score,
670
-            new_words  = foo.data.words
692
+            new_words  = game_opt.new_words
671 693
 
672 694
         // Con esta manera se evitan falsos positivos
673
-        if (new_words.length > 1) {
695
+        if (typeof new_words !== 'undefined') {
674 696
 
675 697
             // Verifica y guarda posibles nuevos récords
676 698
             if (hig_score != null)
... ...
@@ -733,9 +723,6 @@ console.log('2:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang
733 733
             foo.data.finished = game_opt.finished
734 734
             foo.disable()
735 735
 
736
-            // Valida las palabras nuevas obtenidas
737
-            compute_words(true)
738
-
739 736
             // Corre función cuando se completa el juego satisfactoriamente
740 737
             exec_fn(game_opt.on_win)
741 738
         }
... ...
@@ -768,7 +755,6 @@ console.log('2:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang
768 768
             lines_correct  : null,
769 769
             lines_incorrect: null,
770 770
             letter         : null,
771
-            words          : [],
772 771
             new_words      : []
773 772
         },
774 773
 
... ...
@@ -807,6 +793,7 @@ console.log('2:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang
807 807
             opt.on_error                = opt.on_error               || ''
808 808
             opt.on_new_time             = opt.on_new_time            || ''
809 809
             opt.on_new_score            = opt.on_new_score           || ''
810
+            opt.on_new_word             = opt.on_new_word            || ''
810 811
             opt.on_new_record           = opt.on_new_record          || ''
811 812
             opt.ar_chances              = opt.ar_chances             || 3
812 813
             opt.ar_min_answers          = opt.ar_min_answers         || 2
... ...
@@ -1551,7 +1538,6 @@ console.log('2:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang
1551 1551
                     type          : game_opt.type,
1552 1552
                     score         : parseInt(game_opt.score),
1553 1553
                     timer         : parseInt(game_opt.time),
1554
-                    words         : game_opt.data.words,
1555 1554
                     content       : []
1556 1555
                 }
1557 1556
 
... ...
@@ -1645,7 +1631,6 @@ console.log('2:', localStorage.getItem(game_opt.type + '_words_' + game_opt.lang
1645 1645
                     lines_correct  : null,
1646 1646
                     lines_incorrect: null,
1647 1647
                     letter         : null,
1648
-                    words          : [],
1649 1648
                     new_words      : []
1650 1649
                 }
1651 1650
             }