Newer
Older
ournorth2021 / views / crucigrama.php
LuisOlaya on 21 Apr 2021 13 KB cambios
<?php
$id = $pagina[1];
$dia = 1;

$queryValidate = mysqli_query($connect, "SELECT * FROM Retos WHERE id_asistente = '" . $_SESSION['id_user'] . "' AND reto = '" . $id . "' AND tipo_juego = 1 ");
if ($queryValidate->num_rows > 0) {
  echo '<script> window.location = "' . $url . '/concursos/1"; </script>';
}


?>

<style>
  body {
    background-size: cover;
    background-position: center;
    background-attachment: fixed;
    /* background-image: url(<?php echo $url; ?>/img/bg_juegos.jpg); */
    background-color: #939597;
  }
</style>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.min.js"></script>

<style>
  /*Downloaded from https://www.codeseek.co/arandaschimpf/crucigrama-vRgKZP */
  .container {
    margin-top: 3vh;
  }

  .table-container {
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  table {
    border-collapse: collapse;
    font-size: 18px;
  }

  td {
    width: 36px;
    height: 36px;
    border: 2px solid #ffffff;
    text-align: center;
    position: relative;
    text-transform: uppercase;
    font-family: arial;
  }

  td.empty {
    background: #ff9f55;
    background: rgba(0, 0, 0, 0);
    border: 0;
  }

  td.selected {
    background: rgb(0 0 0 / 57%);
  }

  td.start {
    cursor: pointer;
  }

  td.start label {
    position: absolute;
    top: 0;
    left: 2px;
    text-align: left;
    font-size: 15px;
    color: #ffea00;
    font-weight: bold;
  }

  td.start:hover {
    background: #204d67;
  }

  td.start.selected:hover {
    background: #ddf;
  }

  .mensaje {
    position: absolute;
    color: white;
    text-align: center;
    border-radius: 8px;
    padding: 10px;
    width: 50vw;
    z-index: 1000;
    background: #007eba;
  }

  .mensaje button {
    margin-top: 10px;
  }
  
</style>

<div class="col-md-12">

  <div class="container">

    <?php echo $rersp; ?>

    <div class="row">

      <div class="col-md-12" align="center">
        <h1 style="color: #ffffff;">CRUCIGRAMA</h1>

      </div>

      <div class="col-md-7" align="center" style="color: #ffffff;">


        <div id="app" class="container" @keyup.escape="selected = undefined">
          <div class="table-container" style="display:none;" v-show="true">
            <div class="timer">{{cronometro}}</div>
            <div class="mensaje" v-if="mensaje !== undefined">
              <div class="content">{{mensaje}}</div>
              <button @click="mensaje = undefined" class="btn btn-primary">OK</button>
            </div>
            <table>
              <tr v-for="(row, y) in matrix" :key="y">
                <td v-for="(cell, x) in row" :class="{empty: cell.empty, start: !!cell.start, selected: cell.words.includes(selected)}" @click="selectWord(cell.start)">
                  <label v-if="!!cell.start">{{cell.start}}</label>
                  {{cell.words.some(i => completed[i]) ? cell.letter : ' '}}
                </td>
              </tr>
            </table>
            <div v-if="selected !== undefined" style="text-align: center;">
              <p class="pista" v-if="pista">
                {{pista}}
              </p>
              <input v-model="answer" ref="input" @keyup.enter="corregir" />
              <button @click="corregir" class="btn btn_juegos">Colocar</button>
              <button @click="solucion" class="btn btn-danger" style="display:none">Pista</button>
            </div>
            <hr>
            <button class="btn btn_juegos" @click="finalizar" style="display: none">Finalizar</button>
          </div>
          <h3 v-show="false">Cargando....</h3>
        </div>
        <script src='https://unpkg.com/vue'></script>

        <div align="center" style="display: block" id="boton_volver">
          <a href="<?php echo $url; ?>/concursos/1">
            <button class="btn btn_juegos btn-block" style="margin-top: 35px;">
              Volver
            </button>
          </a>
        </div>
        <div style="margin-bottom: 100px;"></div>

      </div>


      <div class="col-md-5" align="left" style="color: #fff;">

        <p>Para completar el desafio solo debe dar click en el número y completar la palabras. Debe completar todas las palabra en el menor tiempo posible.</p>

        <h3>Horizontales</h3>
        <hr>

        <ul>
          <li>1. Nunca estaremos satisfechos y siempre buscaremos _________ para generar más valor.</li>
          <li>2. Astellas buscará mejorar el valor de la empresa de una manera ___________</li>
          <li>3. En nuestra filosofia, _________ es maximizar la creatividad a travez de la diversidad y comunicación  </li>
          <li>4. Foco y vision externa  es estar un paso adelante del mercado atentos al __________ cambiante del sector salud</li>
          <li>5. Un elemento importante de nuestra filofofía es… apoyar un estilo de vida ___________ en la gente de todo el mundo. </li>
          <li>7. Uno de nuestras principios es… ____________</li>
       </ul>




        <h3>Verticales</h3>
        <hr>
        <ul>
          <li>6.  En nuestra creencias… Nunca estaremos satisfechos y siempre buscaremos innovar para generar más valor… esta relacionada con la.. ___________ </li>
          <li>8. ¿Qué significa la abreviatura Trx utilizada en Astellas?</li>
        </ul>

      </div>

    </div>

  </div>

</div>

<script>
  /*Downloaded from https://www.codeseek.co/arandaschimpf/crucigrama-vRgKZP */
  // Arreglo de palabras indicando la posición de su inicio, su sentido (vertical u horizontal),
  // la palabra en cuestión y la pista que se presenta al usuario
  var correctas = 0;
  var total_segundos = 0;

  const palabras = [{
      pos: [6, 7],
      sentido: 0,
      palabra: 'innovar',
      pista: '1. Nunca estaremos satisfechos y siempre buscaremos _________ para generar más valor.'
    },
    {
      pos: [10, 16],
      sentido: 0,
      palabra: 'sostenible',
      pista: '2. Astellas buscará mejorar el valor de la empresa de una manera ___________'
    },
    {
      pos: [0, 1],
      sentido: 0,
      palabra: 'apertura',
      pista: '3. En nuestra filosofia, _________ es maximizar la creatividad a travez de la diversidad y comunicación '
    },
    {
      pos: [5, 3],
      sentido: 0,
      palabra: 'panorama',
      pista: '4. Foco y vision externa  es estar un paso adelante del mercado atentos al __________ cambiante del sector salud'
    },



    {
      pos: [2, 10],
      sentido: 0,
      palabra: 'saludable',
      pista: '5. Un elemento importante de nuestra filofofía es… apoyar un estilo de vida ___________ en la gente de todo el mundo.'
    },
    {
      pos: [6, 0],
      sentido: 1,
      palabra: 'creatividad',
      pista: '6.  En nuestra creencias… Nunca estaremos satisfechos y siempre buscaremos innovar para generar más valor… esta relacionada con la.. ___________ '
    },
    {
      pos: [11, 13],
      sentido: 0,
      palabra: 'integridad',
      pista: '7. Uno de nuestras principios es… ____________'
    },
    {
      pos: [12, 6],
      sentido: 1,
      palabra: 'trasplantes',
      pista: '8. ¿Qué significa la abreviatura Trx utilizada en Astellas?'
    },

  ]

  // Objeto default para celdas vacías de la grilla
  const empty = {
    start: false,
    letter: '',
    words: [],
    empty: true
  }

  new Vue({
    el: '#app',
    data() {
      return {
        // Arreglo de booleanos indicando si una palabra fue completada
        completed: Array(palabras.length).fill(false),
        // Entero indicando la palabra que fue seleccionada para completar
        selected: undefined,
        // String donde se guarda lo que ingresa el usuario
        answer: '',
        // Cantidad de veces que se solicitó una pista
        penalties: 0,
        // Temporizador en segundos desde el comienzo de la partida. Comienza en 5 minutos.
        timer: 60 * 5,
        // La tabla que será armada al inicio, conteniendo todas las celdas
        matrix: [],
        // Mensaje final a mostrar
        mensaje: undefined
      }
    },
    created() {
      // Creación de la tabla que contiene las celdas.
      const width = palabras.reduce((max, cur) =>
        Math.max(max, cur.pos[0] + (cur.sentido === 0 ? cur.palabra.length : 1)), 0)
      const height = palabras.reduce((max, cur) =>
        Math.max(max, cur.pos[1] + (cur.sentido === 1 ? cur.palabra.length : 1)), 0)
      let matrix = Array(height).fill(0).map(() => Array(width).fill(null).map(() => empty))
      palabras.forEach((palabra, index) => {
        const [x, y] = palabra.pos
        palabra.palabra.split('').forEach((l, i) => {
          let cell = matrix[y + (palabra.sentido ? i : 0)][x + (palabra.sentido ? 0 : i)]
          if (cell === empty) {
            cell = matrix[y + (palabra.sentido ? i : 0)][x + (palabra.sentido ? 0 : i)] = {
              words: []
            }
          }
          cell.empty = false
          cell.words.push(index)
          if (i === 0) {
            cell.start = index + 1
          }
          cell.letter = l
        })
      })
      this.matrix = matrix

      // Control del temporizador y disparador del evento final cuando éste se acabe
      this.$options.interval = setInterval(() => {

        this.timer--;
        total_segundos++;

        if (this.timer <= 0) {
          //clearInterval(this.$options.interval)
          this.finalizar();

          $("#modal_general").modal("show");
          $("#modal_body").html("El tiempo ha finalizado.");
        }

      }, 1000)
    },
    computed: {
      // Contiene la pista de la palabra seleccionada
      pista() {
        if (this.selected === undefined) return undefined
        return `${palabras[this.selected].sentido ? 'Vertical' : 'Horizontal'}: ${palabras[this.selected].pista}`
      },
      // Formato a mostrar del cronómetro
      cronometro() {
        const minutes = Math.floor(this.timer / 60).toString().padStart(2, '0')
        const seconds = Math.floor(this.timer % 60).toString().padStart(2, '0')
        return `${minutes}:${seconds}`
      }
    },
    methods: {
      selectWord(index) {
        if (index > 0) {
          this.selected = index - 1
          this.answer = ''
          setTimeout(() => this.$refs.input.focus(), 50)
        }
      },
      // Se fija si la palabra ingresada es correcta y de ser así, modifica el arreglo de palabras completas
      corregir() {
        const solucion = palabras[this.selected].palabra
        const answer = this.answer.toLowerCase()
        if (answer === solucion) {
          this.completed[this.selected] = true
          this.selected = undefined;
          correctas++;

          if (correctas >= palabras.length) {
            $("#modal_general").modal("show");
            $("#modal_body").html("¡Felicitaciones!, ha completado el juego.");
            this.finalizar();
          }

        } else {
          $("#modal_general").modal("show");
          $("#modal_body").html("¡Respuesta Incorrecta!<br>Intente de nuevo");
        }
      },
      // Agrega una letra correcta más a la respuesta actual
      solucion() {
        const solucion = palabras[this.selected].palabra
        const answer = this.answer.toLowerCase()
        if (answer === solucion) {
          return
        }
        if (answer !== solucion.slice(0, answer.length)) {
          this.penalties++
          this.answer = ''
        }
        this.answer = solucion.slice(0, this.answer.length + 1)
        this.penalties++
      },
      // Calcula el puntaje final del jugador en base a las respuestas correctas y las penalidades por pistas
      finalizar() {
        const total = this.completed.reduce((total, current, i) => total + palabras[i].palabra.length, 0)
        const completo = this.completed.reduce((total, current, i) => current ? total + palabras[i].palabra.length : total, 0)
        const tempScore = Math.ceil(100 * completo / total)
        const finalScore = Math.max(tempScore - this.penalties, 0)
        if (tempScore < 100) {
          this.penalties++
        }
        /*this.mensaje = `
          Tu puntuación es ${finalScore}%.
        `*/
        clearInterval(this.$options.interval);
        $("#boton_volver").show();
        Guardar_Puntaje(0, 0, finalScore);


        console.log(total);
      }
    }
  })
</script>

<script>
  var api = '<?php echo $url; ?>/api/';

  function Guardar_Puntaje(acierto, numIntentos, porcentaje) {
    data = {
      id_user: <?php echo $_SESSION['id_user']; ?>,
      tiempo: total_segundos,
      porcentaje: porcentaje,
      reto: <?php echo $id; ?>,
      tipo_juego: 1,
      dia: <?php echo $dia; ?>
    };

    jQuery.ajax({
        url: api + "guardar_puntaje.php",
        type: 'post',
        data: data,
      }).done(function(resp) {
        $("#xscript").html(resp);
      })
      .fail(function(resp) {
        console.log(resp);
      })
      .always(function(resp) {});

  }
</script>