Vemos las etiquetas básicas de HTML:
Hacemos este ejemplo en clase:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>sin título</title> <meta name="generator" content="Geany 1.27" /> </head> <body> <h3>Menú</h3> <ul> <li> <a href="#otrascosas"> Enlace a otras cosas </a> </li> <li> <a href="comollegar.html"> Cómo llegar </a> </li> <li>Presentación</li> <li> <a href="http://google.es"> Buscar en Google </a> </li> <li> <a href="https://www.iesvirgendelcarmen.com/moodle/course/view.php?id=190#TEMA2"> Enlace al tema </a> </li> </ul> <br/> <br/> <br/> <br/> <br/> <br/> <br/> <h3 id="otrascosas">Otras cosas</h3> </body> </html>
Vemos:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css"> <title>estructura HTML5</title>
<style>
@import url('https://fonts.googleapis.com/css?family=Lobster');
h1 {
font-size: small;
text-shadow: #000000 10px 10px 10px;
}
p {
font-family: 'Lobster', cursive;
}
body {
text-align: left;
background: url("https://static.pexels.com/photos/9574/pexels-photo.jpeg") black;
opacity: 0.7;
background-repeat: no-repeat;
background-attachment: fixed;
background-size: 100%;
}
</style> </head> <body> <div class="container"> <header class="jumbotron"> <h1>Cabecera: header</h1> </header> <nav class="navbar navbar-default"> <ul class="nav navbar-nav"> <li><a href="#">Menú 1</a></li> <li><a href="#">Menú 2</a></li> <li><a href="#">Menú 3</a></li> </ul> </nav> <div class="row"> <article class="col-md-8"> <section class="well"> Contenido de la página: <strong>article > section</strong> </section> <section class="well"> Otra noticia y ya van dos. </section> </article> <aside class="col-md-4"> <div class="well"> Área de contenido destacado y relacionado: <strong>aside</strong> </div> </aside> </div> <footer class="footer"> <div class="text-muted"> Pie: <strong>footer</strong>. Aquí va el logo y la información de la empresa </div> </footer> </div> </body> </html>
Comenzamos el apartado de JavaScript. Usaremos esta Web como referencia: https://librosweb.es/libro/javascript/
Creamos un proyecto de aplicación JS:
js01/
├── css
├── fonts
├── img
├── index.html
├── js
│ └── index.js
└── snd
En la carpeta js, creamos el archivo index.js con el siguiente contenido:
function saludo(parametro) { document.write(parametro); }
El fichero index.html lo dejamos como este:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Probando JS</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="js/index.js"> </script> </head> <body> <h1> Hola Mundo JS </h1> <!-- Comentario HTML --> <script> /* Comentario JavaScript */ var nombre = prompt("Dime tu nombre:") saludo(nombre + ", te haré reina de un jardín de rosas."); </script> <h2> Vamos a ver más ejemplos </h2> <script> document.write("OTRA PRUEBA"); </script> </body> </html>
Comenzamos a aprender la sintaxis de JS. Hacemos esta página-tutorial.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Probando JS</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="js/index.js"> </script> </head> <body> <h1> Hola Mundo JS </h1> <!-- Comentario HTML --> <script> /* Comentario JavaScript */ /* llamada bloqueante. JS es no bloqueante salvo esto */ // var nombre = prompt("Dime tu nombre:") saludo(nombre + ", te haré reina de un jardín de rosas."); </script> <h2> Vamos a ver más ejemplos </h2> <script> // VARIABLES TIPO NÚMERO var numero = 2 + 3; document.write("<p>2+3=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + 5.9; document.write("<p>2.3+5.9=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + "5.9"; document.write("<p>2.3+'5.9'=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + +"5.9"; document.write("<p>2.3+ +'5.9'=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + -"5.9"; document.write("<p>2.3+ -'5.9'=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); // VARIABLES TIPO CADENA DE CARACTERES var cadena = "Hola"; cadena += " Mundo"; // se pueden anidar unas comillas dobles dentro de simples y viceversa document.write('<p>cadena = "' + cadena + '", que es de tipo: ' + typeof(cadena) + '</p>'); document.write("<p>cadena = '" + cadena + "', que es de tipo: " + typeof(cadena) + "</p>"); document.write('<p>cadena = \'' + cadena + '\', que es de tipo: ' + typeof(cadena) + '</p>'); var variable = numero + cadena; document.write('<p>variable= numero+cadena = \'' + variable + '\', que es de tipo: ' + typeof(variable) + '</p>'); // BOOLEANOS verdadero/falso var booleano = true; document.write("<p>boolano= " + booleano + ", que es de tipo: " + typeof(booleano)); booleano = "pepe"; document.write("<p>boolano= " + booleano + ", que es de tipo: " + typeof(booleano)); </script> </body> </html>
Continuamos el ejemplo de aplicación JS y vemos:
El código:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Probando JS</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="js/index.js"> </script> </head> <body> <h1> Hola Mundo JS </h1> <!-- Comentario HTML --> <script> /* Comentario JavaScript */ /* llamada bloqueante. JS es no bloqueante salvo esto */ // var nombre = prompt("Dime tu nombre:") // saludo(nombre + ", te haré reina de un jardín de rosas."); </script> <h2> Vamos a ver más ejemplos </h2> <script> // VARIABLES TIPO NÚMERO var numero = 2 + 3; document.write("<p>2+3=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + 5.9; document.write("<p>2.3+5.9=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + "5.9"; document.write("<p>2.3+'5.9'=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + +"5.9"; document.write("<p>2.3+ +'5.9'=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); numero = 2.3 + -"5.9"; document.write("<p>2.3+ -'5.9'=" + numero + " que es de tipo: " + typeof(numero) + "</p>"); // VARIABLES TIPO CADENA DE CARACTERES var cadena = "Hola"; cadena += " Mundo"; // se pueden anidar unas comillas dobles dentro de simples y viceversa document.write('<p>cadena = "' + cadena + '", que es de tipo: ' + typeof(cadena) + '</p>'); document.write("<p>cadena = '" + cadena + "', que es de tipo: " + typeof(cadena) + "</p>"); document.write('<p>cadena = \'' + cadena + '\', que es de tipo: ' + typeof(cadena) + '</p>'); var variable = numero + cadena; document.write('<p>variable= numero+cadena = \'' + variable + '\', que es de tipo: ' + typeof(variable) + '</p>'); // BOOLEANOS verdadero/falso var booleano = true; document.write("<p>boolano= " + booleano + ", que es de tipo: " + typeof(booleano)); booleano = "pepe"; document.write("<p>boolano= " + booleano + ", que es de tipo: " + typeof(booleano)); var dato = prompt('Dime un número: ') var tmp = +dato; document.write("<p>tmp= " + tmp + ", que es de tipo: " + typeof(tmp)) if ((typeof(tmp) === 'number') && (!isNaN(tmp))) { document.write('<p>Eso <b>SI</b> es un número</p>') } else { document.write('<p>Eso <b>NO</b> era un número</p>') } // ARRAYS en JS: vamos desde 0 hasta tamaño-1 var semana = ['Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab', 'Dom']; for (var i = 0; i <= 6; i++) { document.write('<br>Día ' + i + ': ' + semana[i]); } // ARRAYs ASOCIATIVOS var asignaturas = []; asignaturas['LMGSGI'] = 'Juangu'; asignaturas['PROGRAMACION'] = 'Manolo'; asignaturas['ENTORNOS'] = 'Jacinto'; asignaturas['BBDD'] = 'Elvira'; document.write('<br>PROG. la da: ' + asignaturas['PROGRAMACION']); document.write('<br> asignaturas[0] = ' + asignaturas[0]); // OPERADORES INCREMENTO var x = 0; document.write('<br>'); document.write(++x); document.write('<br>'); document.write(x); document.write('<br>'); document.write(x++); document.write('<br>'); document.write(x); // OPERADORES LÓGICOS var verdad = true; var falso = false; // Vamos a hacer la tabla del operador AND /* ¡¡OJO!! Esta manera de generar HTML no es la / correcta pero hasta que aprendamos la API DOM de JavaScript y el método "appendChild()" */ var cod_html = ''; cod_html += '<table border="1px solid black">'; // primera fila de la tabla cod_html += '<tr>'; cod_html += '<th>A</th>'; cod_html += '<th>B</th>'; cod_html += '<th>A AND B</th>'; cod_html += '</tr>'; // segunda fila de la tabla cod_html += '<tr>'; cod_html += '<td>' + (falso) + '</td>'; cod_html += '<td>' + (falso) + '</td>'; cod_html += '<td>' + (falso && falso) + '</td>'; cod_html += '</tr>'; // tercera fila de la tabla cod_html += '<tr>'; cod_html += '<td>' + (falso) + '</td>'; cod_html += '<td>' + (verdad) + '</td>'; cod_html += '<td>' + (falso && verdad) + '</td>'; cod_html += '</tr>'; // cuarta fila de la tabla cod_html += '<tr>'; cod_html += '<td>' + (verdad) + '</td>'; cod_html += '<td>' + (falso) + '</td>'; cod_html += '<td>' + (verdad && falso) + '</td>'; cod_html += '</tr>'; // quinta fila de la tabla cod_html += '<tr>'; cod_html += '<td>' + (verdad) + '</td>'; cod_html += '<td>' + (verdad) + '</td>'; cod_html += '<td>' + (verdad && verdad) + '</td>'; cod_html += '</tr>'; // Cerramos la tabla cod_html += '</table>'; document.write(cod_html); </script> </body> </html>
Operadores de comparación:
// OPERADORES de COMPARACIÓN var numero1 = 5; var numero2 = '5'; document.write('numero1=5, numero2="5" '); // COMPARACION REGULARES var resultado = numero1 >= numero2; document.write('<br>'); document.write('numero1 >= numero2 = ' + resultado); resultado = numero1 <= numero2; document.write('<br>'); document.write('numero1 <= numero2 = ' + resultado); resultado = numero1 == numero2; document.write('<br>'); document.write('numero1 == numero2 = ' + resultado); resultado = numero1 != numero2; document.write('<br>'); document.write('numero1 != numero2 = ' + resultado); // COMPARACIÓN ESTRICTA var resultado = numero1 >= numero2; document.write('<br>'); document.write('numero1 >= numero2 = ' + resultado); resultado = numero1 <= numero2; document.write('<br>'); document.write('numero1 <= numero2 = ' + resultado); resultado = numero1 === numero2; document.write('<br>'); document.write('numero1 === numero2 = ' + resultado); resultado = numero1 !== numero2; document.write('<br>'); document.write('numero1 !== numero2 = ' + resultado);
Conversiones de tipos de datos:
// EJEMPLO DE CONVERSION: "PARSEINT" numero2 = '5.2 enanitos de blancanieves'; document.write('<br>numero1=' + numero1 + ', numero2="' + numero2 + '" '); resultado = numero1 === parseInt(numero2); document.write('<br>'); document.write('Usando parseInt (sólo coge los primeros enteros que encuentra) <br>'); document.write('numero1 === parseInt(numero2) = ' + resultado); resultado = numero1 !== parseInt(numero2); document.write('<br>'); document.write('numero1 !== parseInt(numero2) = ' + resultado); // ESTRUCTURAS DE CONTROL if document.write("<h1>Estructura de control IF-ELSE</h1>"); var dato1 = parseInt(prompt('Dame un número:')); var dato2 = parseInt(prompt('Dame otro número:')); if (isNaN(dato1) || isNaN(dato2)) { document.write('Eso no era un número<br>'); } else { if (dato1 <= dato2) { document.write('El primero es menor o igual que el segundo<br>'); } else if (dato1 >= dato2) { document.write('El primero es mayor o igual que el segundo<br>'); } else { document.write('Ninguno de los casos<br>'); } }
Ejercicio: Cálculo de la letra del DNI. Haz un programa JavaScript que pregunte con un prompt() un número de DNI válido y el programa debe calcular la letra.
Recuerda que te explican cómo hacerlo en esta Web: http://www.interior.gob.es/web/servicios-al-ciudadano/dni/calculo-del-digito-de-control-del-nif-nie.
El array para el cálculo es: var letras = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E', 'T'];
// CASO PRACTICO: Cálculo letra DNI var DNI = parseInt(prompt('Dime tu DNI sin letra')); document.write("<h1>Cálculo de la letra del DNI</h1>"); if (isNaN(DNI)) { // No es un número document.write("Eso no es un número."); } else { if (DNI < 1 || DNI > 99999999) { // Si es un número válido 1= Franco document.write("Eso no es un número de DNI válido"); } else { // Es un número válido var letras = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E', 'T']; var letra = DNI % 23; document.write("<br>El DNI: " + DNI + " tiene la letra: " + letras[letra]); } }
Bucle FOR:
Las estructuras if y if...else no son muy eficientes cuando se desea ejecutar de forma repetitiva una instrucción. Por ejemplo, si se quiere mostrar un mensaje cinco veces, se podría pensar en utilizar el siguiente if:
var veces = 0;
if(veces < 4) {
alert("Mensaje");
veces++;
}
La estructura for permite realizar este tipo de repeticiones (también llamadas bucles) de una forma muy sencilla. No obstante, su definición formal no es tan sencilla como la de if():
for(inicializacion; condicion; actualizacion) {
...
}
// ESTRUCTURAS DE CONTROL // EJEMPLO DE BUCLE FOR var dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]; document.write('<h1> Los días de la semana (bucle FOR) </h1>'); document.write('<ol>'); for (var i = 0; i < 7; i++) { document.write("<li>" + dias[i] + "</li>"); } document.write('</ol>');
La estructura while permite crear bucles que se ejecutan ninguna o más veces, dependiendo de la condición indicada. Su definición formal es:
while(condicion) {
...
}
// Un aleatorio entre 0 y 10 var dato = parseInt(Math.random() * 11); var respuesta = parseInt(prompt('Adivina un número entre 0 y 10')); while (dato !== respuesta) { if (dato > respuesta) { // dame un número mayor respuesta = parseInt(prompt('Dame uno más grande!')); } else { if (dato < respuesta) { // dame un número menor respuesta = parseInt(prompt('Más pequeño!')); } else { if (isNaN(respuesta)) { respuesta = parseInt(prompt('Eso no es un número!!!')); } else { // lo adivinaste!!! } } } if (respuesta === 666) break; } document.write('<p>Adivinaste el número: ' + dato + '</p>');
El bucle de tipo do...while es muy similar al bucle while, salvo que en este caso siempre se ejecutan las instrucciones del bucle al menos la primera vez. Su definición formal es:
do {
...
} while(condicion);
// ESTRUCTURA DE CONTROL do..while var dato; // undefined do { dato = prompt("Adivina en qué número estoy pensando..."); // prompt devuelve un string } while (dato != 8) // con != hace casting // } while (dato !== 8) los dos tienen que ser del mismo tipo (dato es string y 8 es number)
Aprendemos DOM con esta Web: http://www.w3schools.com/js/js_htmldom.asp
y esta otra: https://librosweb.es/libro/javascript/capitulo_5/tipos_de_nodos.html
DUDA DE CLASE: Mapas para generar varios enlaces en la misma imagen. Ejemplo: Los vengadores.
Prácticas en clase: Nos conectamos al servidor FTP para subir nuestras prácticas.
Para ver nuestra Web accedemos así: https://alumnos.iesvirgendelcarmen.com/~alumno01/ (no olvides HTTPS ni la barra del final)
Seguimos la API DOM de Java con los manuales de librosWeb: https://librosweb.es/libro/javascript/capitulo_5.html
Nuestro objetivo es aprender a controlar el árbol DOM y, con peticiones AJAX, redibujar sólo partes de la página Web (ahorro tiempo y datos). Usamos AJAX para comunicarnos con el servidor, como puodemos leer en: http://www.w3schools.com/xml/ajax_intro.asp
<!DOCTYPE html> <html> <body> <button type="button" onclick="inicio()">Inicio</button> <button type="button" onclick="saluda()">Saluda</button> <div id="demo"> <h1>The XMLHttpRequest Object</h1> </div> <script> function inicio() { var texto = "<h1>The XMLHttpRequest Object</h1>"; document.getElementById("demo").innerHTML = texto; } function saluda() { var texto = "<h1> Intro a DOM </h1>"; texto += "<p> Hola mundo JS DOM </p>"; texto += "<p> etc... </p>"; document.getElementById("demo").innerHTML = texto; } </script> </body> </html>
Instalamos Intel XDK. Puedes ver una breve reseña en el blog del profesor.
Creamos el proyecto para nuestro juego "BattleShip":
Paso 1, crear la estructura básica de la aplicación (menú y paneles/layout):
Paso 2, añadimos los primeros contenidos a cada pantalla:
Añadimos componentes con Bower y comenzamos con las primeras líneas JS.
Paso 3, creamos las funciones auxiliares para el manejo de matrices.
Esta semana preparamos el algoritmo de colocar los barcos.
var barcos = [
{tam:2, letra:'f', nombre:'fragata'},
{tam:3, letra:'b', nombre:'buque'},
{tam:3, letra:'s', nombre:'submarino'},
{tam:4, letra:'d', nombre:'destructor'},
{tam:5, letra:'p', nombre:'portaaviones'},
];
Aquí tienes el pseudocódigo que tienes que pasar a JS:
FUNCION moneda() // Ya lo tenemos hecho
...
FUNCION dado() // Ya lo tenemos hecho
...
FUNCIÓN COLOCAR_BARCOS(
tablero, // matriz
array_barcos) // barco-> tam, letra
INICIO
REPITE DESDE i=0 HASTA ARRAY_BARCOS.tamano-1
INICIO
VAR BARCO= ARRAY_BARCOS[i];
REPITE
INICIO
BOOLEAN libre = verdad
VAR direccion = MONEDA() // 0 horizontal o 1 vertical
SI (direccion==0) // => Horizontal
INICIO
x = DADO(0..tablero.TAM_X-1)
y = DADO(0..[tablero.TAM_Y-BARCO.tamaño-1]
// si no le resto el tamaño del barco, me puedo salir del tablero
PARA (VAR cont_Y = 0; cont_Y<BARCO.tamaño-1; cont_Y++)
INICIO
SI (tablero[x,cont_Y+Y]!='a')
libre = falso;
FIN
SI (libre)
INICIO
PARA (VAR cont_Y = 0; cont_Y<BARCO.tamaño-1; cont_Y++)
INICIO
tablero[x,cont_Y+Y]=BARCO.letra;
FIN
FIN
FIN
SINO // dirección == 1 => Vertical
INICIO
x = DADO(0..tablero.TAM_X-BARCO.tam-1)
y = DADO(0..tablero.TAM_Y)
PARA (VAR cont_X = 0; cont_X<BARCO.tamaño-1; cont_X++)
INICIO
SI (tablero[cont_X+X,Y]!='a')
libre = falso;
FIN
PARA (VAR cont_X = 0; cont_X<BARCO.tamaño-1; cont_X++)
INICIO
tablero[cont_X+x,y] = BARCO.letra;
FIN
FIN
FIN
MIENTRAS libre!=verdad
FIN
FIN
Hoy vamos a almacenar en localStorage la información de la partida. Para eso necesitamos consultar estas páginas:
Vídeos de la sesión:
Solución al ejercicio de clase:
function colocarBarcos(matriz){ //Compruebo que haya más de ocho filas y que la primera fila(igual a las demás) sean más de 8 columnas. for (var i=0; i<barcos.length;i++){ var barco = barcos[i]; var libre; do { // intento colocar el barco hasta // que encuentro espacio libre para él libre=true; var direccion = moneda(); if (direccion===0) { // horizontal var fila = dado(matriz.length); var col = dado(matriz[fila].length-barco.tam); for (var j=0; j<barco.tam;j++){ if(matriz[fila][j+col]!='a') { libre=false; } } if (libre) { for (var j=0; j<barco.tam;j++){ matriz[fila][j+col]=barco.letra; } } } else { // vertical var fila = dado(matriz.length-barco.tam); var col = dado(matriz[fila].length); for (var j=0; j<barco.tam;j++){ if(matriz[j+fila][col]!='a') { libre=false; } } if (libre) { for (var j=0; j<barco.tam;j++){ matriz[j+fila][col]=barco.letra; } } } } while (!libre); } }
Si no te funciona el proyecto, para seguir las clases esta semana puedes clonar el proyecto desde GitHub:
$ git clone https://github.com/juangualberto/BattleShipJS
ALGORITMO GENERAR TABLERO
INICIO
VAR html = <TABLE>
PARA i=0; i<filas; i++
INICIO
html = html + <TR>
PARA j=0; j<columnas; j++
INICIO
html += <TD id="celda_i_j" class="vacio" onclick="disparo(celda_i_j)"> </TD>
FIN
html = html + </TR>
FIN
html = html + </TABLE>
ESCRIBE_HTML("caja_partida",html);
// $("#partida").html(html);
// document.getElementById("partida").innerHTML = html;
FIN
Creamos las clases para cada barco:
Modificamos la función disparo para cambiar la clase en cada clic:
function disparo(celda,i,j){ // alert("Has disparado en la caja: "+celda+ "hay que mirar el tablero en la posición"+i+","+j); switch (tablero[i][j]){ case 'a': tablero[i][j]='A'; $('#'+celda).removeClass('vacio'); $('#'+celda).addClass('agua'); break; case 'b': tablero[i][j]='B'; $('#'+celda).removeClass('vacio'); $('#'+celda).addClass('buque'); break; case 'd': tablero[i][j]='D'; $('#'+celda).removeClass('vacio'); $('#'+celda).addClass('destructor'); break; case 'f': tablero[i][j]='F'; $('#'+celda).removeClass('vacio'); $('#'+celda).addClass('fragata'); break; case 'p': tablero[i][j]='P'; $('#'+celda).removeClass('vacio'); $('#'+celda).addClass('portaaviones'); break; case 's': tablero[i][j]='S'; $('#'+celda).removeClass('vacio'); $('#'+celda).addClass('submarino'); break; default: } }
Con jQuery, generamos el tabalero:
Esta semana añadimos tiempo (cuenta atrás) y disparos limitados a nuestro juego.
Aprendemos que es un timer gracias a W3Schools.
Nos basamos en este ejemplo:
<!DOCTYPE html> <html> <body> <p>A script on this page starts this clock:</p> <p id="demo"></p> <script> var cuenta = 0; var myVar = setInterval(funcionCallBack, 1000); function funcionCallBack() { cuenta++; document.getElementById("demo").innerHTML = cuenta+" seg"; } </script> </body> </html>
Fíjate en el código de arriba. Creamos un timer con la función setInterval(). Esta función llamará a la función callback (primer parámetro) cada 1000 milisegundos(segundo parámetro).
Para añadir tiempo a nuestro juego necesitaremos una variable "segundos" donde llevar la cuenta de los segundos que nos quedan.
Hay que crear la función callback a la que llame el timer cada 1000 ms que restará un segundo al tiempo cada vez que la llamamos. Si el tiempo llega a 0 hay que parar el timer con la función clearInterval().
Recuerda que puedes ver cómo se usan estas funciones en W3School.
var segundos; var myTimer; function crearPartida(){ // crear una matriz de fil x col tablero = crearMatriz(filas,columnas); // rellenar la matriz "a" inicializaMatriz('a',tablero); colocarBarcos(tablero); generarTablerojQ(); // PONEMOS LOS SEGUNDOS AL TIEMPO DE PARTIDA // ARRANCAMOS EL TIMER!!! -> con setInterval() // volcar la matriz a consola matriz2console(tablero); } function callbackTimer(){ // actualizar el tiempo que queda // si el tiempo es <= 0 para el timer clearInterval() y acaba la partida }
Para controlar los disparos, necesitamos una variable global con el número de disparos total que tenemos por defecto. Cada vez que se dispare en una casilla que antes no lo hayamos hecho, se decrementan los disparos que me quedan.
Ya que tenemos el tiempo y los disparos, ahora tenemos que crear una caja donde ver cómo van el tiempo y los disparos. Vamos a usar una caja de clase "row" (BootStrap) y dentro vamos a colocar tres cajas con el tiempo, un botón de pausa y los disparos que nos quedan.
El tiempo y los disparos los cargamos de localStorage. Si no existen los inicializamos por defecto.
Modificamos nuestra función de carga de configuración de la partida:
var segundos; var myTimer; var disparos; $(document).ready(function(){ //¿hay localStorage disponible? (almacenamos la conf. ahí) if (typeof(Storage) !== "undefined") { barcos = JSON.parse(localStorage.getItem("barcos")); if (barcos === null) { barcos = [ {tam:2, letra:'f', nombre:'fragata'}, {tam:3, letra:'b', nombre:'buque'}, {tam:3, letra:'s', nombre:'submarino'}, {tam:4, letra:'d', nombre:'destructor'}, {tam:5, letra:'p', nombre:'portaaviones'}, ]; localStorage.setItem("barcos",JSON.stringify(barcos)); } filas = parseInt(localStorage.getItem("filas")); columnas = parseInt(localStorage.getItem("columnas")); if (isNaN(filas) || isNaN(columnas)) { filas = 8; columnas = 8; localStorage.setItem("filas",8); localStorage.setItem("columnas",8); } segundos = parseInt(localStorage.getItem("segundos")); if (isNaN(segundos)) { segundos = 100; localStorage.setItem("segundos",100); } disparos = parseInt(localStorage.getItem("disparos")); if (isNaN(disparos)) { disparos = 50; localStorage.setItem("disparos",50); } } else { // NO hay localStorage, no podemos guardar // conf. ni información de las partidas (puntuaciones) console.log("No tenemos LocalStorage"); } });
Esta semana vamos a ver cómo almacenar la información de marcadores de los jugadores.
Primero tenemos que modificar el fichero index.html pues tenemos que añadir nuevos paneles para mostrar el formulario para introducir los puntos y otro panel para mostrar el listado de puntuaciones.
<div class="pages"> ..... <div class="panel" id="puntuaciones" data-title="Puntuaciones"> Mejores puntuaciones </div> <div class="panel" id="formulario" data-title="Tus puntos"> <div class="container"> <form> <div class="form-group"> <label for="nombre">Nombre:</label> <input type="text" class="form-control" id="nombre"> </div> <div class="form-group"> <label for="puntos">Puntos:</label> <input type="text" class="form-control" id="puntos" disabled> </div> <div class="form-group"> <label for="tiempo">Tiempo:</label> <input type="text" class="form-control" id="segundos" disabled> </div> <div class="btn btn-default" onclick="guardarPuntos()">Submit</div> </form> </div> </div> </div>
Ahora añadimos las funciones para terminar la partida, guardar la información de la partida y listar los marcadores de todos los jugadores:
function terminarPartida(){ // CALCULAR PUNTOS $("#puntos").val(aciertos*disparos*100+segundos*500); $("#segundos").val(segundos); // PARAR EL TIMER (porque no me queden disparos // o hayamos hundido todos los barcos) clearInterval(myTimer); // Mostrar el diálogo para guardar los puntos $.afui.clearHistory(); $.afui.loadContent("#formulario",false,false,"up"); } function guardarPuntos(){ // Cargamos los marcadores de localStorage var marcadores = JSON.parse(localStorage.getItem("marcadores")); // Si no existe, lo inicializamos. if (marcadores === null) { marcadores = []; } // Ejemplo de cómo leer de un formulario a JSON var puntuacion = { "nombre": $("#nombre").val(), "puntos": $("#puntos").val(), "tiempo": $("#segundos").val() }; // Introducimos la puntuación en el array. marcadores.push(puntuacion); localStorage.setItem("marcadores",JSON.stringify(marcadores)); mostrarPuntos(); } function mostrarPuntos(){ $("#puntuaciones").empty(); // Cargamos los marcadores de localStorage var marcadores = JSON.parse(localStorage.getItem("marcadores")); // Si no existe, no hacemos nada. var tabla = $("<table border='1px solid black'/>"); tabla.append("<tr><th>nombre</th><th>puntos</th><th>tiempo</th></tr>"); if (marcadores !== null) { for (var jugador in marcadores) { var tr = $("<tr />"); tr.append("<td>"+marcadores[jugador].nombre+"</td>"); tr.append("<td>"+marcadores[jugador].puntos+"</td>"); tr.append("<td>"+marcadores[jugador].tiempo+"</td>"); tabla.append(tr); } } $("#puntuaciones").append(tabla); $.afui.clearHistory(); $.afui.loadContent("#puntuaciones",false,false,"up"); }