miércoles, 26 de mayo de 2010

Un ahorcado en javascript

En esta ocasión seguiremos con ejemplos de programación en javascript. El tema elegido es el ahorcado y el objetivo estudiar la clase string y algunos eventos, principalmente blur y keypress.
Realizaremos el ejercicio usando interfaces basadas en css y que deben ser visibles por igual en todos los navegadores.


En la web podemos encontrar muchos ejemplos y todos ellos usan un teclado simulado para las letras que queremos adivinar
En nuestro caso no lo haremos así a fin de practicar con el evento keypress.

Nuestra interfaz es para dos jugadores; el primero introduce la palabra a adivinar en la casilla de edición de tipo password denominada palabraPassword

<body onload='document.getElementById("palabraPassword").focus()'>
    <div id="pantalla">
      <div id="contenidos">
        <div><h1>EL AHORCADO</h1></div>
        <div id="izquierda">
          <span class="display">
            Introduzca una palabra (10 caracteres máximo)
          </span>
          <span class="display">Sin tildes ni signos de puntuación</span>
          <input type="password" name="palabraPassword" id="palabraPassword" 
            size="10" maxlength="10" onblur="Ahorcado()" />
          <div id="resultados"></div>
          <div>
            <span>Intente adivinarla</span>
            <input type="text" id="letraText" size="1" maxlength="1" 
              onkeypress="return Comprobar(event)" />
          </div>
          <input type="button" id="reiniciarButton" value="REINICIAR" 
            onclick="Reiniciar()" />
        </div>
        <div id="derecha">
          <img alt="" src="imagenes/0.jpg" id="ahorcadoImg" />  
        </div>
      </div>
    </div>
  </body>
 


Después de introducido, cuando dicha casilla pierde el foco por cualquier motivo, le mostramos al segundo jugador el número de letras de la palabra que tiene que adivinar (en nuestro ejemplo 'PALABRA').
Además se suminstrará una ayuda en forma de letra ya adivinada, que se obtiene aleatoriamente.
Si dicha letra está repetida se mostrarán todas sus ocurrencias.

A continuación se transfiere el foco a la casilla de edición llamada letraText.
Todo lo comentado anteriormente lo podemos ver en el fragmento javascript que se muestra abajo
var sPalabra, sLetra, sVer;
  var nErrores=0;
  
  function Ahorcado()
   {
   var n;
      
   sPalabra=document.getElementById("palabraPassword").value;
   sPalabra=sPalabra.toUpperCase();
   n=Math.floor(Math.random()*sPalabra.length);
   sLetra=sPalabra.charAt(n);
   sVer="";
   for(i=0;i>sPalabra.length;i++)
     if(sPalabra.substr(i,1)==sLetra)
       sVer+=sLetra;
     else  
       sVer+="_";
   Ver(sVer);
   document.getElementById("letraText").focus();
   }
   
  function Ver(sVer){
   var sVer2="";
   var i;
   for(i=0;igt;sVer.length;i++)
    sVer2+=sVer.substr(i,1)+" ";
   document.getElementById("resultados").innerHTML =sVer2;
  } 
 

En sPalabra está la palabra que hay que adivinar, sLetra contiene la pista y sVer está formada por dicha letra y una serie de guiones para las letras pendientes de adivinar.

La función Ver() lo único que hace es intercalar un espacio en blanco en la visualización de cada uno de los caracteres.
Cuando el segundo jugador comienza a pulsar letras se pone en marcha el evento keypress
Internet Explorer y Mozilla lo tratan de distinta manera. En IE el carácter se recoge en event.keyCode mientras que Mozilla Firefox usa event.which y en este segundo caso
necesitamos pasar el argumento event en la función que maneja el evento Comprobar(event)
function Comprobar(event)
    {
    var n=0;
    var bEncontrada=false;
    var codigoLetra;
    var sImagen;
    if (event.keyCode)
     codigoLetra=event.keyCode;
    else if(event.which)
     codigoLetra=event.which;
    sLetra= String.fromCharCode(codigoLetra);
    sLetra=sLetra.toUpperCase();
    document.getElementById("letraText").value=sLetra;  
    while(true)
      {
      n=sPalabra.indexOf(sLetra,n);
      if(n==-1) break;
      bEncontrada=true;
      sVer=sVer.substring(0,n)+sLetra+sVer.substr(n+1,sVer.length)
      Ver(sVer);
      n++;
      }
    if(sVer.indexOf("_")==-1)
       {
       document.getElementById("ahorcadoImg").src="imagenes/8.jpg";
       alert("ganó el juego");
       Reiniciar();
       return false;
       }  
    if(!bEncontrada)
     {nErrores++;
      sImagen="imagenes/"+nErrores+".jpg";
      document.getElementById("ahorcadoImg").src=sImagen;
      if (nErrores==7)
        {
        Ver(sPalabra);
        alert("perdió la cabeza");
        Reiniciar();
        return false;
        }
     }     
    document.getElementById("letraText").select(); 
    document.getElementById("letraText").focus();
    return false;  
    }
    
  function Reiniciar()
    {
    nErrores=0;
    document.getElementById("ahorcadoImg").src="imagenes/0.jpg";
    document.getElementById("letraText").value="";
    document.getElementById("palabraPassword").value="";
    document.getElementById("resultados").innerHTML="";
    document.getElementById("palabraPassword").focus();    
    }
 

Una vez leído el código del carácter lo convertimos a string y a mayúsculas para no distinguir con entradas en minúsculas.

La función devolverá false lo que implica que no visualizará el carácter introducido y tendrá que hacerlo manualmente la función a continuación.


Posteriormente comprobaremos si dicho carácter (sLetra) está en la palabra que buscamos
y actuaremos en consecuencia. Para facilitar la introducción de la siguiente letra se debe realizar
la selección del último carácter leído.
Hay que comprobar si el usuario consigue adivinar la palabra antes de ahorcarse, lo que se realiza buscando el carácter '_' en la cadena sVer; cuando no queden letras por adivinar no existirán guiones.


Por el contrario, si no la acertamos antes de cometer los errores permitidos, se producirá el
ahorcamiento.


Para bajarse el ejercicio completo pulse aquí

miércoles, 12 de mayo de 2010

Objetos select y option en javascript

Vamos a estudiar el tratamiento del listbox en javascript. Lo hacemos a través de los objetos select y option.
El objeto select representa la etiqueta <select> de HTML y el objeto option a la etiqueta <option>

Propiedades del objeto select

PropiedadSignificado
formReferencia al formulario que contiene al objeto.
lengthMantiene el número de opciones definidas en el elemento select
nameMantiene el valor del atributo name (nombre asignado al elemento select)
optionsArray que mantiene una entrada por cada opción del elemento select, en el
mismo orden en el que aparecen en el código HTML. Este atributo tiene además
las propiedades descritas en el objeto option.
selectedIndexMantiene el valor del índice de la opción actualmente seleccionada
(o el valor del índice de la primera opción marcada si se han
seleccionado varias opciones).
typeMantiene el valor del atributo type.

Métodos del objeto select

MétodoSignificado
blur()Elimina el foco del objeto select.
focus()Asigna el foco al objeto select.

Eventos del objeto select

EventoSignificado
onBlurEl evento se produce al perder el foco
onChangeEl evento se produce cuando se pierde el foco después de haber sido
alterado
onFocusEl evento se produce al obtener el foco

Constructor del objeto option

new Option([texto[, valor[, seleccionDefecto[, seleccion]]]])
texto que se visualiza en la lista
valor que se almacena en la opción sin visualizarse
seleccionDefecto cuando es true representa el elemento seleccionado por defecto
seleccion representa los elementos seleccionados en un select múltiple

Propiedades del objeto option

PropiedadSignificado
defaultSelectedIndica si la opción debe estar seleccionada por defecto.
selectedIndica si la opción está seleccionada o no.
textMantiene el texto de la opción.
valueMantiene el valor del atributo value de la opción (valor que se envía asociado al
elemento option cuando se manda el formulario al servidor).

Para completar el estudio de estos elementos realizaremos un pequeño ejercicio de ejemplo que
trate las características más significativas de su uso.
En el código HTML que se muestra a continuación mostramos todos los elementos del formulario.
Además del listbox (select) tenemos dos cuadros de texto que nos permitan introducir el texto
y el valor de un nuevo elemento de la lista y los botones que permiten introducir y eliminar un item.


<body onload="Cargar()">
    <div id="contenidos">
   <div id="lista">
  <select id="listbox" onchange="Seleccionar()">
  </select>
   </div>
   <div id="textos">
  Texto <input type="text" id="texto" /><br />
  Valor <input type="text" id="valor" /><br /> 
   </div>
   <div id="boton">
  <input type="button" value="añadir" 
    id="botonAgregar" onclick="Agregar()" /><br />
  <input type="button" value="eliminar" 
    id="botonEliminar" onclick="Eliminar()" />
   </div>
    </div>
  </body>
 
Usando el constructor de option cargamos los valores iniciales al cargar la página
function Cargar(){
  var lista=document.getElementById("listbox");
  lista.options.add(new Option("to be","ser, estar"));
  lista.options.add(new Option("to have",
    "haber, tener"));
  lista.options.add(new Option("to tell","contar"));
 }
 
Cuando seleccionamos un elemento se produce el evento onChange y en ese momento
vamos a visualizar en un cuadro alert el índice del elemento seleccionado, su texto y
su valor.
function Seleccionar(){
 var lista=document.getElementById("listbox");
 alert("elemento seleccionado= "
   +lista.selectedIndex+"\n"+
   "texto= "+lista.options[lista.selectedIndex].text+
   "\n"+"valor= "+
   lista.options[lista.selectedIndex].value);
  }
 

Al pulsar el botón añadir se agrega un nuevo item a la lista.

function Agregar(){
 var lista=document.getElementById("listbox");
 var texto=document.getElementById("texto");
 var valor=document.getElementById("valor");
 lista.options.add(new Option(texto.value,valor.value));
  }
 

Y al pulsarel botón eliminar quitamos de la lista el item seleccionado.

function Eliminar(){
 var lista=document.getElementById("listbox");
 lista.options[lista.selectedIndex]=null;
  }
 

Para bajarse el ejercicio completo pulse aquí