This file is part of JPuzzle
   ============================
   
   JPuzzle is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   
   JPuzzle is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with JPuzzle.  If not, see .
   
   ============================
   JPuzzle Version 1 Copyright © 2008 HackmanGT
   HackmanGT@hotmail.com
   

¿Que es?
--------

JPuzzle es una aplicación que simula el funcionamiento de un juego de fichas,
usando el paradigma de programación modelo vista controlador. Utiliza eventos
para comunicarse internamente, maneja la información consistente en una matriz
y tiene la inteligencia artificial para resolver el tablero por sí mismo. Al
tablero se le puede cambiar el tamaño, desde 3 x 3 celdas hasta 10 x 10 celdas,
generando un tablero de 99 fichas. (La capacidad real es de MAX_INTEGER x
MAX_INTEGER 4 mil millones ? limitada por la capacidad del hardware).

Las opciones están disponibles durante todo el funcionamiento de la aplicación,
puede mostrar una rejilla, una imágen aleatoria seleccionada de una lista de
tres opciones originales, así como mostrar los números ordinales en la tabla.
Tiene la capacidad de animar los movimientos en tiempo real.

Conceptos
---------

La clase Tabla es el modelo que esta conformado por una matriz de Celdas, el
Tablero es el controlador que envía mensajes a la clase Mesa que representa
la vista. En todo momento se hace uso de la clase Posicion para manejar las
coordenadas de las celdas y hacer operaciones con ellas.

La clase Panel representa el panel de control que contiene la Mesa, en este
panel se pueden habilitar las opciones del juego, así como realizar las
operaciones de Cambiar Tamaño, Desordenar o Resolver el tablero.

La clase Cerebro, (formalmente llamada Pinky); representa el cerebro que
resuelve el tablero. Intenta resolver una a una cada una de las celdas en
el orden natural, utilizando un paradigma de "buscar la posición más adecuada"
para "intentar moverse hacia ella"; repitiendo este proceso hasta que logre
llegar al objetivo por cada celda.

No se hace uso de manejo de excepciones, casi no existe el concepto de
try/catch en toda la aplicación, preferiblemente se optimizó el código para
validar todas las operaciones de la aplicación. Si se extiende el código se
necesita conocer bien su funcionamiento o adaptarlo a try/catch. Principalmente
en la sincronización del acceso al modelo de datos.

Posiblemente, todavía contenga errores. :-(

Metodología
-----------

Aunque el código se puede comenzar a leer en cualquier punto, aconsejo el
siguiente orden, para comprender el funcionamiento del juego ...

Graphics / Matriz.java
Utilities / Celda.java
Utilities / Posicion.java
Utilities / Tabla.java
Utilities / Tablero.java
Graphics / Mesa.java
Graphics / Panel.java
Utilities / Cerebro.java
. / Puzzle.java

Reconocimientos
---------------

El código fuente fué totalmente desarrollado por mí (HackmanGT) en el período
pre-establecido del 17 de Septiembre al 5 de octubre, y puesto en clase de
dominio público bajo la licencia GPL, con el objetivo de participar en el
concurso de programación de "Foros del Web".

http://www.forosdelweb.com/f14/segunda-competencia-para-programadores-621190/

Las imágenes fueron tomadas de varias fuentes bajo la licencia Creative Commons.

[__ JPuzzle1.gif __]
http://www.forosdelweb.com/f102/robibaggio-vs-paolamurias-612510/
paolamurias & RobiBaggio
LGPL (?)

[__ JPuzzle2.gif __]
http://www.flickr.com/photos/news_fedora/214287995/
News Fedora
Creative Commons (No comercial, Atribución)

[__ JPuzzle3.gif __]
No tengo ni la más minima idea.
Pero está bonita. :-)

Agradecimiento especial a David (dlorde) por asegurar que el evento paint() se
ejecuta en Swing Event Dispatching Thread; facilitando la sincronización de los
métodos Desordenar y Resolver (Aunque puede ser que la aplicación todavía
contenga errores de sincronización).

http://www.codeguru.com/forum/showthread.php?t=462429

El lenguaje de programación Java fué diseñado por SUN Microsystems. Se utilizó
la herramienta NetBeans 6 sobre Linux Debian Etch (mientras descargaba la última
versión Beta).

Cosas por hacer
---------------

 * Sonidos       : Agregar un click al presionar cada celda.
 * Musica        : Agregar un tema musical.
 * Accesibilidad : Agregar soporte para el teclado.
 * Agilidad      : (*) A veces las celdas no se mueven al hacer click. (*)
                   Creo que lo toma como un doble click.
 * Animación     : Agregar una animación o algo mejor al ganar.
 * Abstracción   : Abstraer más los conceptos de MVC.
 * Mas ...       : Todo lo que se me olvidó ...


Bueno ... ya!

Guatemala, 5 de Octubre de 2008. ( 20:33:26 GMT-6 )

   ============================
   JPuzzle Version 1 Copyright © 2008 HackmanGT
   HackmanGT@hotmail.com