Programación de juegos para móviles con J2ME

En este cap�tulo quiero presentarte, de forma general, J2ME y encuadrarla dentro de la tecnolog�a Java. Tambi�n vamos a hacer una breve introducci�n al lenguaje Java, al menos en sus aspectos b�sicos para poder adentrarte sin problemas en la programaci�n con J2ME.

.�J2EE

Cuando Sun decidi� lanzar su nuevo standard Java, llamado Java2, cre� tres diferentes entornos para desarrollo y ejecuci�n de aplicaciones. Estos fueron J2SE, J2EE y J2ME.

J2SE (Java 2 Standard Edition) es, por decirlo de alguna manera, la base de la tecnolog�a Java. Permite el desarrollo de applets (aplicaciones que se ejecutan en un navegador web) y aplicaciones independientes (standalone). J2SE es el heredero directo del Java inicial (antes de Java 2). J2EE (Java 2 Enterprise Edition) est� basado en J2SE, pero a�ade una serie de caracter�sticas necesarias en entornos empresariales, relativos a redes, acceso a datos y entrada/salida que requieren mayor capacidad de proceso, almacenamiento y memoria. La decisi�n de separarlos es debida a que no todas estas caracter�sticas son necesarias para el desarrollo de aplicaciones standard.

Al igual que J2EE cubre unas necesidades m�s amplias que J2SE, se hace patente la necesidad de un subconjunto de J2SE para entornos m�s limitados. La respuesta de Sun es J2ME (Java 2 Micro Edition).

J2ME se basa en los conceptos de configuraci�n y perfil. Una configuraci�n describe las caracter�sticas m�nimas en cuanto a la configuraci�n hardware y software. La configuraci�n que usa J2ME es la CLDC (Connected Limited Device Configuration). Concretamente CLDC define:

  • Cu�les son las caracter�sticas del lenguaje Java incluidas.
  • Qu� funcionalidad ser� incluida en la m�quina virtual Java.
  • Las APIs necesarias para el desarrollo de aplicaciones en m�viles.
  • Los requerimientos Hardware de los dispositivos.

Debido a las limitaciones del hardware en el que correr� la m�quina virtual, algunas de las caracter�sticas del lenguaje Java han sido recortadas. En concreto, se ha omitido el soporte de operaciones matem�ticas en punto flotante, y por lo tanto, los tipos de datos que manejan esta de informaci�n. La otra gran diferencia es que la m�quina virtual tampoco dar� soporte al m�todo finalize() encargado de eliminar los objetos de la memoria. Tambi�n se limita el n�mero de excepciones disponibles para el control de errores.

J2ME est� formado por la configuraci�n CLDC y por el perfil MID (conocido por MIDP o MID Profile). CLDC es una especificaci�n general para un amplio abanico de dispositivos, que van desde PDAs a tel�fonos m�viles y otros. Un perfil define las caracter�sticas del dispositivo de forma m�s especifica. MIDP (Mobile Information Device Profile) define las APIs y caracter�sticas hardware y software necesarias para el caso concreto de los tel�fono m�viles. Las caracter�sticas concretas de la versi�n 1.0 y 2.0 de MIDP pueden ser consultadas en la p�gina web de Sun (http://java.sun.com/j2me/).

.�El lenguaje Java

El lenguaje Java es un lenguaje completamente orientado a objetos. Todo en Java es un objeto. Durante el resto del cap�tulo vamos a ver las caracter�sticas generales del lenguaje Java (s�lo las necesarias en J2ME), lo que nos permitir� entrar en el siguiente cap�tulo con la base necesaria para empezar a programar MIDlets. Un MIDlet es un programa capaz de correr en un dispositivo m�vil. El nombre guarda cierta similitud (no casual) con los programas capaces de correr en un navegador (applets). Si quieres ampliar conocimientos sobre el lenguaje Java, puedes consultar la bibliograf�a en los ap�ndices de este libro.

.�Variables y Tipos de Datos

Las variables nos permiten almacenar informaci�n y tal como indica su propio nombre, pueden variar a lo largo de la ejecuci�n del programa. Una variable se define a partir de un nombre y un tipo.

El nombre de una variable puede ser cualquiera, aunque conviene utilizar nombres claros y relacionados con el cometido de la variable. S�lo hemos de tener en cuenta algunas reglas en los nombres de variables:

  • No pueden contener espacios en blanco.
  • Dos variables no pueden tener el mismo nombre.
  • No podemos utilizar palabras reservadas de Java.

Los programadores en Java suelen seguir una serie de convenciones a la hora de nombrar las variables. Esto facilita la lectura de c�digo de terceros.

  • Las variables comienzan con una letra min�scula.
  • Si la variable est� compuesta por dos o m�s palabras, la segunda (y las siguientes tambi�n) comienzan por letra may�scula. Por ejemplo numeroDeVidas.
  • Los nombres de las clases comienzan por letra may�scula.

Las variables tienen asociado un tipo. El tipo de la variable define qu� dato es capaz de almacenar. Los tipos de datos v�lidos en Java son los siguientes:

  • byte. Ocho bits.
  • short. N�mero entero de 16 bits.
  • int. N�mero entero de 32 bits.
  • long. N�mero entero de 64 bits.
  • float. N�mero en punto flotante de 32 bits.
  • double. N�mero en punto flotante de 64 bits.
  • char. Car�cter ASCII.
  • boolean. Valor verdadero o falso.

Hay que aclarar que los tipos float y double, a�n formando parte del standard Java, no est�n disponibles en J2ME.

Antes de poder utilizar una variable, hay que declararla, es decir, darle un nombre y un tipo. La siguiente l�nea declara una variable llamada vidas de tipo entero de 32 bits.

int vidas;

Una variable por s� misma no es muy �til, a no ser que podamos realizar operaciones con ellas. Estas operaciones se realizan por medio de operadores. Hay cinco tipos de operadores.

  • De asignaci�n
  • Aritm�ticos
  • Relaci�nales
  • L�gicos
  • A nivel de bit

Cuando declaramos una variable �sta no contiene ning�n valor (realmente si, tiene el valor null). Para darle un valor a la variable utilizamos el operador de asignaci�n = (signo de igualdad). As�, para asignar el valor 3 a la variable vidas, procedemos de la siguiente forma.

vidas = 3;

Observa el punto y coma (;) al final de la l�nea. En Java cada instrucci�n acaba con un punto y coma.

Tenemos disponibles otros operadores de asignaci�n:

Operador Significado
a += ba = a + b
a -= ba = a � b
a *= ba = a * b
a /= ba = a / b
a %= ba = a % b
a &= ba = a & b
a |= ba = a | b

Los siguientes operadores que vamos a ver son los operadores aritm�ticos. Hay dos tipos, los operadores unarios y los binarios. Los operadores aritm�ticos unarios son ++ y --. Pueden ir delante o detr�s de una variable, y su misi�n es incrementar (o decrementar) en una unidad el valor de la variable. Si se sit�an tras la variable hablamos de postincremento (o postdecremento), es decir, la variable es incrementada (o decrementada) despu�s de haberse hecho uso de ella. Si por el contrario va delante hablamos de preincremento (o predecremento), es decir, primero se modifica su valor y despu�s se hace uso de la variable. Veamos un ejemplo:

nuevasVidas = ++vidas;

En este ejemplo, primero incrementamos el valor de la variable vidas, y despu�s se lo asignamos a la variable nuevasVidas.

enemigoActual = enemigos--;

Aqu�, primero asignamos a la variable enemigoActual el valor de la variable enemigos, y despu�s decrementamos el valor de esta �ltima variable.

El otro tipo de operadores aritm�ticos son los binarios.

Operador Significado
a + bSuma de a y b
a - bDiferencia de a y b
a * bProducto de a por b
a / bDiferencia entre a y b
a % bResto de la divisi�n entre a y b

Los operadores relacionales nos permiten comparar dos variables o valores. Un operador relacional devuelve un valor de tipo boolean, es decir, verdadero (true) o falso (false).

Operador Significado
a > btrue si a es mayor que b
a < btrue si a es menor que b
a >= btrue si a es mayor o igual que b
a <= btrue si a es menor o igual que b
a == btrue si a es igual que b
a != btrue si a es distinto a b

Los operadores l�gicos nos permiten realizar comprobaciones l�gicas del tipo Y, O y NO. Al igual que los operadores relaciones devuelven true o false.

Operador Significado
a && btrue si a y b son verdaderos
a || btrue si a o b son verdaderos
!atrue si a es false, y false si a es true

Cuando veamos la estructura de control if() nos quedar� m�s clara la utilidad de los operadores l�gicos.

Los operadores de bits trabajan, como su propio nombre indica, a nivel de bits, es decir, permite manipularlos directamente.

Operador Significado
a >> bDesplaza los bits de a hacia la derecha b veces
a << bDesplaza los bits de a hacia la izquierda b veces
a <<< bIgual que el anterior pero sin signo
a & bSuma l�gica entre a y b
a | bO l�gico entre a y b
a ^ bO exclusivo (xor) entre a y b
~ aNegaci�n l�gica de a (not)

Cuando una expresi�n est� compuesta por m�s de un operador, estos se aplican en un orden concreto. Este orden se llama orden de precedencia de operadores. En la siguiente tabla se muestra el orden en el que son aplicados los operadores.

Orden Operadores

1operadores sufijo[] . (params) expr++ expr--
2operadores unarios++expr --expr +expr -expr ~ !
3creaci�n o tiponew (type)expr
4multiplicadores* / %
5suma/resta+ -
6desplazamiento<< >> >>>
7relacionales< > <= >= instanceof
8>igualdad== !=
9bitwise AND&
10bitwise exclusive OR^
11bitwise inclusive OR|
12AND l�gico&&
13OR l�gico||
14condicional? :
15asignaci�n= += -= *= /= %= ^= &= |= <<= >>= >>>=

.�Clases y Objetos

�Qu� es un objeto? Tratar� de explicarlo de la forma m�s intuitiva posible sin entrar en demasiados formalismos. Si te pido que pienses en un objeto, seguramente pensar�s en un l�piz, una mesa, unas gafas de sol, un coche o cualquier otra cosa que caiga dentro de tu radio de visi�n. �sta es la idea intuitiva de objeto: algo f�sico y material. En POO, el concepto de objeto no es muy diferente. Una de las diferencias b�sicas evidentes es que un objeto en Java puede hacer referencia a algo abstracto.

Como en el ejemplo del coche, un objeto puede estar compuesto por otra clase de objeto, como rueda, carrocer�a, etc... Este concepto de clase de objeto es importante. Un objeto siempre pertenece a una clase de objeto. Por ejemplo, todas las ruedas, con independencia de su tama�o, pertenecen a la clase rueda. Hay muchos objetos �rueda� diferentes que pertenecen a la clase rueda y cada uno de ellos forman una instancia de la clase rueda. Tenemos, pues, instancias de la clase rueda que son ruedas de cami�n, ruedas de coches o ruedas de motocicleta.

Volvamos al ejemplo del coche. Vamos a definir otra clase de objeto, la clase coche. Esta clase define a �algo� que est� compuesto por objetos (instancias) de la clase rueda, la clase carrocer�a, la clase volante, etc... Ahora vamos a crear un objeto de la clase coche, al que llamaremos coche_rojo. En este caso hemos instanciado un objeto de la clase coche y hemos definido uno de sus atributos, el color, al que hemos dado el valor de rojo. Vemos pues, que un objeto puede poseer atributos. Sobre el objeto coche podemos definir tambi�n acciones u operaciones posibles. Por ejemplo, el objeto coche, entre otras cosas, puede realizar las operaciones de acelerar, frenar, girar a la izquierda, etc... Estas operaciones que pueden ser ejecutadas sobre un objeto se llaman m�todos del objeto.

Podr�amos hacer ya una primera definici�n de lo que es un objeto. Es la instancia de una clase de objeto concreta, que est� compuesta por atributos y m�todos. Esta definici�n nos muestra una de las tres principales caracter�sticas que definen a la POO. Me refiero al encapsulamiento, que no es, ni m�s ni menos, que la capacidad que tiene un objeto de contener datos (atributos) y c�digo (m�todos).

.�Clases y Objetos en Java

Antes de poder crear un objeto hay que definirlo. Un objeto, tal como dec�amos antes, pertenece a una clase, as� que antes de crear nuestro objeto, hay que definir una clase (o utilizar una clase ya definida en las APIs de Java). La forma b�sica para declarar una clase en Java es.

class nombre_clase {
// variables de la clase (atributos)
...
// m�todos de la clase
}

En Java, utilizamos las dos barras inclinadas (//) para indicar que lo que sigue es un comentario. Una vez definida la clase, podemos ya crear un objeto de la clase que hemos declarado. Lo hacemos as�.

clase_objeto nombre_objeto;

Las variables de la clase o atributos son variables como las que vimos en la secci�n anterior.

Los m�todos, son similares a las funciones de otros lenguajes. La declaraci�n de un m�todo tiene la siguiente forma.

tipo NombreMetodo(tipo arg1, tipo arg2, ...) {
// cuerpo del m�todo (c�digo)

}

El m�todo tiene un tipo de retorno (tipo que devuelve al ser llamado). Tambi�n tiene una lista de argumentos o par�metros.

Vamos a clarificar lo visto hasta ahora con un ejemplo.

class Coche {
	// variables de clase
	int velocidad;

	// m�todos de la clase
	void acelerar(int nuevaVelocidad) {
		velocidad = nuevaVelocidad;
	}

	void frenar() {
		velocidad = 0;
	}
}

Hemos declarado la clase coche, que tiene un s�lo atributo, la velocidad, y dos m�todos, uno para acelerar y otro para frenar. En el m�todo acelerar, simplemente recibimos como par�metro una nueva velocidad, y actualizamos este atributo con el nuevo valor. En el caso del m�todo frenar, ponemos la velocidad a 0. Veamos ahora c�mo declaramos un objeto de tipo coche y c�mo utilizar sus m�todos.

// declaraci�n del objeto
Coche miCoche = new Coche();

// acelerar hasta 100 km/h 
miCoche.acelerar(100);

// frenar
miCoche.frenar();

En primer lugar, hemos creado el objeto miCoche que pertenece a la clase Coche mediante el operador new. Despu�s, podemos acceder tanto a los m�todos como a las variables miembro usando su nombre precedido de un punto y el nombre del objeto. Tambi�n podr�amos haber accedido a la variable miembro: miCoche.velocidad = 100; �sta no es una pr�ctica aconsejable. Lo �ptimo es que la clase ofrezca los m�todos necesarios para acceder a las variables miembro para tener as� control sobre el acceso a los atributos. No queremos que nadie haga algo como miCoche.velocidad = 1200; sin que podamos controlarlo.

Si nuestro m�todo tiene alg�n tipo de retorno, quiere decir que ha de devolver un valor de dicho tipo. Esto se hace mediante la palabra reservada return.

	return vidas;

Esta l�nea al final del m�todo devuelve el valor de la variable vidas.

Hay un tipo especial de m�todo que se llama constructor. Un constructor es un m�todo que se llama exactamente igual que la clase a la que pertenece. Cuando creamos un objeto con new, el m�todo constructor es ejecutado de forma autom�tica.

Hay cuatro tipos de modificadores que permiten especificar qu� tipo de clase estamos declarando. Los tipos de modificadores son los siguientes.

  • abstract. Una clase abstract tiene al menos un m�todo abstracto. Una clase abstracta s�lo puede ser heredada para implementar los m�todos abstractos que contiene. En ning�n caso podemos instanciar un objeto de este tipo.
  • final. Una clase final no puede ser heredada por ninguna otra.
  • public. Una clase public puede ser accedida por otras clases pertenecientes al mismo paquete, o por cualquier otra siempre que sea importada o heredada.
  • synchronizable. Significa que esta clase s�lo puede ser accedida por un s�lo thread a la vez. Se utiliza en aplicaciones multihebra para asegurar que no hay problemas de sincronizaci�n entre hilos.

Al igual que tenemos modificadores para las clases, tambi�n tenemos modificadores de acceso a las variables miembro y a los m�todos.

  • public. Se puede acceder desde fuera de la clase a la que pertenece.
  • protected. S�lo las subclases pueden acceder a este miembro de la clase.
  • private. S�lo se puede acceder a la variable o al m�todo desde el interior de la clase.
  • friendly. Es la opci�n por defecto si no se especifica nada. Permite s�lo el acceso desde las clases pertenecientes al mismo paquete.

Un paquete nos permite agrupar clases bajo un nombre com�n, por ejemplo, si hici�ramos una librer�a capaz de manejar gr�ficos, tendr�amos un mont�n de clases encargadas de manejar el color, p�xeles, im�genes, etc... Tiene l�gica agrupar todas estas clases dentro de un paquete. Cuando creamos un paquete, las clases que est�n incluidas se almacenan en un mismo directorio con el nombre del paquete. Indicamos que una clase pertenece a un paquete concreto mediante la palabra reservada package al principio del archivo fuente.

	package nombre_paquete;

Si quisi�ramos utilizar este paquete que acabamos de crear, hay que importarlo. Para ello utilizamos la palabra reservada import.

	import nombre_paquete; 

J2ME dispone de multitud de paquetes, por ejemplo, si queremos utilizar el interfaz de usuario propio de J2ME, debemos importar el paquete lcdui.

	import javax.microedition.lcdui.*; 

El punto se utiliza para indicar la jerarqu�a de paquetes, es decir, la jerarqu�a de directorios donde est�n almacenadas las clases. El asterisco indica que deben importarse todas las clases pertenecientes al paquete.

.�Herencia

No s� de color tienes los ojos, pero puedo asegurar que del mismo color que alguno de tus ascendientes. Este mecanismo biol�gico fue descrito por Mendel (armado con una buena dosis de paciencia y una gran cantidad de guisantes) y se llama herencia. La herencia se transmite de padres a hijos, nunca al rev�s. En Java la herencia funciona igual, es decir, en un s�lo sentido. Mediante la herencia, una clase hija (llamada subclase) hereda los atributos y los m�todos de su clase padre.

Imaginemos -volviendo al ejemplo del coche- que queremos crear una clase llamada CochePolicia, que adem�s de acelerar y frenar pueda activar y desactivar una sirena. Podr�amos crear una clase nueva llamada CochePolicia con los atributos y clases necesarios tanto para frenar y acelerar como para activar y desactivar la sirena. En lugar de eso, vamos a aprovechar que ya tenemos una clase llamada Coche y que ya contiene algunas de las funcionalidades que queremos incluir en CochePolicia. Ve�moslo sobre un ejemplo.

Class CochePolicia extends Coche {

	// variables
	int sirena;

	// m�todos
	void sirenaOn() { 
			sirena=1; 
	}
	void sirenaOff() { 
			sirena=0; 
	}
}

Lo primero que nos llama la atenci�n de la declaraci�n de la clase es su primera l�nea. Tras el nombre de la clase hemos a�adido la palabra extends seguido de la clase padre, es decir, de la cual heredamos los m�todos y atributos. La clase CochePolicia posee dos atributos, velocidad, que ha sido heredado y sirena, que ha sido declarada dentro de la clase CochePolicia. Con los m�todos sucede exactamente igual. La clase hija ha heredado acelerar() y frenar(), adem�s le hemos a�adido los m�todos sirenaOn() y sirenaOff(). Un objeto instancia de CochePolicia puede utilizar sin ning�n problema los m�todos acelerar() y frenar() tal y como hac�amos con los objetos instanciados de la clase Coche.

No es posible heredar de dos o m�s clases a la vez (al contrario que en C++). Esto se llama herencia m�ltiple, y suele conllevar m�s problemas que ventajas, as� que los dise�adores de Java prefirieron no incluir esta caracter�stica.

.�Polimorfismo

El polimorfismo es otra de las grandes caracter�stica de la POO. La palabra polimorfismo deriva de poli (m�ltiples) y del t�rmino griego morfos (forma). Es decir, m�ltiples formas.

Supongamos que queremos dotar al m�todo frenar de m�s funcionalidad. Queremos que nos permita reducir hasta la velocidad que queramos. Para ello le pasaremos como par�metro la velocidad, pero tambi�n ser�a �til que frenara completamente si no le pasamos ning�n par�metro. El siguiente c�digo cumple estos requisitos.


// Declaraci�n de la clase coche
class Coche {
	// Atributos de la clase coche
int velocidad;

	// M�todos de la clase coche
	void acelerar(int velocidad);
	void frenar() {
	// Ponemos a 0 el valor del atributo velocidad
	velocidad = 0;
}
	void frenar(int velocidad) {
	// Reducimos la velocidad
		if (velocidad < this.velocidad)
this.velocidad = velocidad;

	}
}

Como ves tenemos dos m�todos frenar. Cuando llamemos al m�todo frenar(), Java sabr� cual tiene que ejecutar dependiendo de si lo llamamos con un par�metro de tipo entero o sin par�metros. Esto que hemos hecho se llama sobrecarga de m�todos. Podemos crear tantas versiones diferentes del m�todo siempre y cuando sean diferentes. El constructor de una clase tambi�n puede ser sobrecargado. En el ejemplo, encontramos la palabra reservada this. �sta se utiliza para indicar que a la variable que nos referimos es la de la clase, y no la que se ha pasado como par�metro. Hay que hacer esta distinci�n, ya que tienen el mismo nombre.

.�Estructuras de control

Las estructuras de control de Java son similares a las de C. Tenemos las estructuras de control condicionales y repetitivas cl�sicas de la programaci�n estructurada.

La estructura de control m�s b�sica es if/else, que tiene la siguiente forma:


if (condici�n) {
	sentencias;
} else {
	sentencias;
}

Mediante esta estructura condicional, podemos ejecutar un c�digo u otro dependiendo de si se cumple una condici�n concreta. La segunda parte de la estructura (else) es opcional. Las siguientes l�neas muestran un ejemplo de uso de la estructura if/else.

if (vidas == 0) {
	terminar = true;
} else {
	vidas--;
}

En este ejemplo, si la variable vidas vale 0, la variable terminar tomar� el valor true. En otro caso, se decrementa el valor de la variable vidas.

La otra estructura condicional es switch, que permite un control condicional m�ltiple. Tiene el formato siguiente.


switch (expresi�n) {
	case val1:
		sentencias;
		break;
	case val2:
		sentencias;
		break;
	case valN:
		sentencias;
		break;
	default:
		sentencias;
		break;
}

Dependiendo del valor que tome la expresi�n, se ejecutar� un c�digo determinado por la palabra reservada case. Observa como al final de las sentencias se incluye la palabra reservada break, que hace que no se siga ejecutando el c�digo perteneciente al siguiente bloque. Si el valor de la expresi�n no coincide con ninguno de los bloques, se ejecuta el bloque default. Lo veremos mejor con un ejemplo.

switch (posicion) {
	case 1:
		medalla = �oro�;
		break;
	case 2:
		medalla = �plata�;
		break;
	case 3:
		medalla = �bronce�;
		break;
	default:
		medalla = �sin medalla�;
		break;
}

Las estructuras que hemos visto hasta ahora nos permiten tomar decisiones. Las siguientes que vamos a ver nos van a permitir realizar acciones repetitivas. Son los llamados bucles. El bucle m�s sencillo es el bucle for.


for (inicializaci�n_contador ; control ; incremento) {
	sentencias;
}

Este bucle ejecuta el bloque de sentencias un n�mero determinado de veces.

[
for (i=1 ; i<=10 ; i++) {
	suma+=i;
}

Este ejemplo de c�digo suma los 10 primero n�meros. La variable i lleva la cuenta, es decir, es el contador del bucle. En la primera secci�n nos encargamos de inicializar la variable con el valor 1. La segunda secci�n es la condici�n que ha de darse para que se contin�e la ejecuci�n del bucle, en este caso, mientras i sea menor o igual a 10, se estar� ejecutando el bucle. La tercera secci�n es la encargada de incrementar la variable en cada vuelta.

El siguiente bucle que te voy a presentar es el bucle while y tiene la siguiente estructura.


while (condici�n) {
	sentencias;
}

El bloque de sentencias se ejecutar� mientras se cumpla la condici�n del bucle.

vueltas = 10;
while (vueltas > 0) {
	vueltas--;
}

A la entrada del bucle, la variable vueltas tiene el valor 10. Mientras el valor de esta variable sea mayor que 0, se va a repetir el bloque de c�digo que contiene. En este caso, el bloque de c�digo se encarga de decrementar la variable vuelta, por lo que cuando su valor llegue a 0, no volver� a ejecutarse. Lo que estamos haciendo es simular un bucle for que se ejecuta 10 veces.

El bucle do/while funciona de forma similar al anterior, pero hace la comprobaci�n a la salida del bucle.


do {
	sentencias;
} while (condici�n);

El siguiente ejemplo, es igual que el anterior. La diferencia entre ambos es que con el bucle do/while, el c�digo se ejecutar� siempre al menos una vez, ya que la comprobaci�n se hace al final, mientras que con el bucle while, es posible que nunca se ejecute el c�digo interno si no se cumple la condici�n.

vueltas = 10;
do {
	vueltas--;
} while(vueltas > 0);

Veamos una �ltima estructura propia de Java (no existe en C) y que nos permite ejecutar un c�digo de forma controlada. Concretamente nos permite tomar acciones espec�ficas en caso de error de ejecuci�n en el c�digo.


try {
	sentencias;
} catch (excepci�n) {
	sentencias;
}

Si el c�digo incluido en el primer bloque de c�digo produce alg�n tipo de excepci�n, se ejecutar� el c�digo contenido en el segundo bloque de c�digo. Una excepci�n es un tipo de error que Java es capaz de controlar por decirlo de una forma sencilla, realmente, una excepci�n es un objeto de la clase Exception. Si por ejemplo, dentro del primer bloque de c�digo intentamos leer un archivo, y no se encuentra en la carpeta especificada, el m�todo encargado de abrir el archivo lanzar� una excepci�n del tipo IOException.

.�Estructuras de datos

Ya hemos visto los tipos de datos que soporta Java. Ahora vamos a ver un par de estructuras muy �tiles. Concretamente la cadena de caracteres y los arrays.

Una cadena de caracteres es una sucesi�n de caracteres continuos. Van encerrados siempre entre comillas. Por ejemplo:

�En un lugar de La Mancha...�

Es una cadena de caracteres. Para almacenar una cadena, Java dispone del tipo String.

String texto;

Una vez declarada la variable, para asignarle un valor, lo hacemos de la forma habitual.

texto = �Esto es un texto�;

Podemos concatenar dos cadenas utilizando el operador +. Tambi�n podemos concatenar una cadena y un tipo de datos distinto. La conversi�n a cadena se hace de forma autom�tica.

String texto;
int vidas;

texto = �Vidas:� + vidas;

Podemos conocer la longitud de una variable de tipo String (realmente un objeto de tipo String) haciendo uso de su m�todo lenght.

longitud = texto.lenght();

El otro tipo de datos que veremos a continuaci�n es el array. Un array nos permite almacenar varios elementos de un mismo tipo bajo el mismo nombre. Imagina un juego multijugador en el que pueden participar cinco jugadores a la vez. Cada uno llevar� su propio contador de vidas. Mediante un array de 5 elementos de tipo entero (int) podemos almacenar estos datos. La declaraci�n de un array se hace as�.

public int[] vidas;
vidas = new int[5];

o directamente:

public int[] vidas = new int[5]; 

Hemos declarado un array de cinco elementos llamado vidas formado por cinco n�meros enteros. Si quisi�ramos acceder, por ejemplo, al tercer elemento del array, lo har�amos de la siguiente manera.

v = vidas[3];

La variable v tomar� el valor del tercer elemento del array. La asignaci�n de un valor es exactamente igual a la de cualquier variable.

vidas[3] -= 1;

El siguiente ejemplo muestra el uso de los arrays.


tmp = 0;
for (i=1 ; i<=puntos.lenght ; i++) {
	if (tmp < puntos[i]) {
		tmp = puntos[i];
	}
}

record = tmp;

En este ejemplo, el bucle for recorre todos los elementos del array puntos que contiene los puntos de cada jugador (el m�todo lenght nos devuelve el n�mero de elementos el array). Al finalizar el bucle, la variable tmp contendr� el valor de la puntuaci�n m�s alta.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO