Chess Master II
añadido: Tue 11 Aug 2009
Hola a todos nuevamente,
Como les habia comentado, utilizare varios posts para hablar sobre las experiencias adquiridas al desarrollar el Alien B*tch Burner Chess.
Hoy hablaremos de la arquitectura y los modulos dentro de nuestro juego de ajedrez.
En escencia, el patron de arquitectura que utilizamos es, el ya conocido, MVC (Model - View - Controller).
Esto significa que dividiremos cada uno de nuestros modulos funcionales en 3 partes, un modelo que mantiene la informacion abstraida para facilitar su manipulacion, una vista que es la manera en la que desplegamos la informacion del modelo al usuario, y un controlador que es el encargado de realizar calculos pesados y manipular la informacion del modelo.
En cuanto los modulos que existen dentro del juego son:
Tablero(Board), Piezas, ChessMove & AI, y aunque parezcan pocas cada una requiere una gran cantidad de trabajo.
Board
El tablero es el lugar donde todo nuestro juego se lleva a cabo, es el ambiente persistente, por asi decirlo. Este modulo si requiere de los 3 compontentes MVC, y las responsabilidades se dividen como sigue:
-Board model: Es la representacion abstracta del tablero (normalmente un arreglo de 8x8 bastara), cuando se realiza el movimiento de alguna pieza, dicho arreglo sera actualizado apartir de la informacion recibida de la pieza y su controlador (leer abajo) calculara las coordenadas de pantalla. El Board Model tiene tambien una pila de suma importancia para los juegos de ajedrez en computadora que es el MoveStack, que nos permite deshacer movimientos a placer.
-Board View: Es la representacion grafica del tablero, una sucesión de escaques blanco y negro, o en caso de ser algo más elaborado, toda la computación de los graficos y el "catching" de los eventos ocurre en este módulo, al recibir un click o algun otro tipo de evento debe comunicarse con el controlador, que a su vez encausará el evento a una ficha en caso de requerir moverla o al tablero para alguna interacción, etc...
-Board Controller: Este módulo realiza algunos cálculos sencillos, como la transformación de la información de las coordenadas de un "Click" en la vista para representar una coordenada en el arreglo del modelo, que para un tablero 2D es una simple división, pero si queremos hacer algo mas complejo puede requerir muchas mas operaciones. El Board Controller se encarga ademas de cargar las texturas para el tablero, preparar los mensajes emergentes (pop ups) cuando son necesarios (aunque al final se despliegan gracias al Board View). Por último, el board controller se encarga de mantener el ciclo de juego corriendo, es decir, de cambiar el turno del jugador, hacer y deshacer los movimientos en caso de ser necesario, y mandar llamar a la Inteligencia Artificial para checar algunas reglas (ver abajo)
Piece
Todos los componentes de Piece pueden hacer uso del mecanismo de herencia, principalmente porque todas las piezas tienen ciertos atributos básicos: Valor numérico, color, posición y metodos compartidos: move, getMoves, eatPiece... entre otros, asi que en este caso describire solo lo que deben hacer el Piece Model, Piece View y Piece Controller, y haré algunas aclaraciones para las especializaciones requeridas.
-Piece Model: Quiza una de las clases más sencillas de todo el juego, se encarga de mantener cierta información sobre cada pieza, como su color o su posición. Para casi todas las piezas, el Piece Model solo cambia el atributo de valor (pawn=1, knight=3...), pero para el Rey y las torres se agrega una bandera "hasMoved" que facilita MUCHO cuando se quieren aplicar las reglas del enroque.
-Piece View: Principalmente, el piece view se encarga de mostrar el skin de la pieza y recibir los clicks para ser seleccionado, se comunica con su modelo para conocer sus propias coordenadas de tablero y con su controlador para conocer sus coordenadas de pantalla.
-Piece Controller: La clase padre Piece Controller, es placticamente enclenque, definiendo solo las interfaces para algunos de los métodos más importantes de todo nuestro desarrollo: PieceController::getMoves() y su derivado PieceController::getAttacked(), la diferencia entre estos dos, es que el primero nos devuelve todos los movimientos posibles de nuestra pieza, y el segundo nos devuelve todos los escaques amenazados por nuestra pieza, en caso practico, el primero nos devolveria solamente escaques libres y escaques con piezas de nuestro enemigo (podemos comernos las piezas de nuestro enemigo y terminar nuestro movimiento ahi), el segundo nos devuelve, además de los mismos elementos que el primero, los escaques con piezas propias atacados por la ficha en cuestión. Esto es muy útil para detectar por ejemplo movimientos ilegales del rey, donde se intente comer una pieza que tenemos defendida por otra. El PieceController además se encarga de la transformacion de las coordenadas del modelo a las coordenadas para la pantalla, de realizar la "destrucción" de la pieza cuando es comida, entre otras. Algunas de las especializaciones mas interesantes de esta clase son el Rey, porque debe agregar todos los métodos para enrocar, y el Peón, que debe agregar excepciones para coronarse y para comer al paso (más sobre esto cuando hablemos de la implementación del as reglas)
Artificial Intelligence: Este módulo es un enorme controlador, omnisciente y omnipresente, (jejeje). La implementación exacta la dejaremos para dentro de 2 posts, pero principalmente es un conjunto de métodos que evalúan una posición y sugieren la mejor opción. Dentro de esta clase también se encuentran los métodos que evaluan si una posición es Jaque o Jaque Mate, quizá estos métodos podrian estar en Board Controller, sí, pero debido a que la AI los utiliza constantemente me pareció más adecuado mantenerlos aquí, podemos dejarlo abierto a discusión, ¿Que opinan?
ChessMove: Una clase que es solo un modelo para un movimiento, es la manera de abstraer la acción de mover una pieza en el juego. No es nada compleja y consta principalmente de una serie de atributos como: Origen, Destino, Color, y banderas especiales para saber si fue un movimiento de "Al Paso", Enroque o Promoción.
Bueno, sería todo por ahora, creo que con esto podemos vislumbrar a grandes rasgos la arquitectura de un juego de ajedrez completamiente Orientado a Objetos, en el proximo post hablaremos sobre como tratar con las reglas y los movimientos, hasta entonces, un saludo.
Sisnett
wiagvn dijo:
XJmxJ1 <a href="http://nurmjydzgsdi.com/">nurmjydzgsdi</a>, [url=http://bvxqtxbldqkb.com/]bvxqtxbldqkb[/url], [link=http://klpxtvpdajcy.com/]klpxtvpdajcy[/link], http://lsoayqdxdumg.com/
amobemnerafax dijo:
kendra wilkinson playboy naked http://www.derektrucks.com/blog/kendra-wilkinson-nude kendra wilkinson naked playboy issue
cpcyuja dijo:
ty2FUJ <a href="http://mntxtaxvclgi.com/">mntxtaxvclgi</a>, [url=http://xpeldswuasix.com/]xpeldswuasix[/url], [link=http://bndoelzxtbdp.com/]bndoelzxtbdp[/link], http://qrlwkjlgwwmf.com/
pneummarplece dijo:
kendra wilkinson nude forum http://www.derektrucks.com/blog/kendra-wilkinson-nude kendra wilkinson playboy nude
lqhbfjqjotl dijo:
ppqmiD <a href="http://beyxzejhufaq.com/">beyxzejhufaq</a>, [url=http://kalwgepnupfs.com/]kalwgepnupfs[/url], [link=http://baubitbdqjlm.com/]baubitbdqjlm[/link], http://vxcoonqqpjgu.com/
hyjogxjq dijo:
OFgfBx <a href="http://sgvcgugyjlaz.com/">sgvcgugyjlaz</a>, [url=http://lxswkatnrqme.com/]lxswkatnrqme[/url], [link=http://azxiqwatjxum.com/]azxiqwatjxum[/link], http://aiviosihrmaa.com/
tlferlquye dijo:
Lk1lIi <a href="http://woniooqhvuyf.com/">woniooqhvuyf</a>, [url=http://wkogoaciwmut.com/]wkogoaciwmut[/url], [link=http://qtfulpilaewz.com/]qtfulpilaewz[/link], http://ulcrawcxufvp.com/
iobrqd dijo:
jZ78gD <a href="http://auvjrvyyhbww.com/">auvjrvyyhbww</a>, [url=http://vayjzieblozu.com/]vayjzieblozu[/url], [link=http://xglvvjneaukv.com/]xglvvjneaukv[/link], http://jiwjvbczpxuj.com/
mqbqeyghw dijo:
cGZmdC <a href="http://qlabxrmbqock.com/">qlabxrmbqock</a>, [url=http://lmkycxazthal.com/]lmkycxazthal[/url], [link=http://tjuqdizovvac.com/]tjuqdizovvac[/link], http://antxwykyofms.com/
pzulvwgq dijo:
MRpJQv <a href="http://ivntxhasqsku.com/">ivntxhasqsku</a>, [url=http://ufoshlwwseoi.com/]ufoshlwwseoi[/url], [link=http://aglypqbwuijx.com/]aglypqbwuijx[/link], http://rdrhqqbmogjj.com/
svjttnwduin dijo:
la6UOY <a href="http://whdvapfcwwpq.com/">whdvapfcwwpq</a>, [url=http://tbgpweqlmjyp.com/]tbgpweqlmjyp[/url], [link=http://ylurhjacxpoo.com/]ylurhjacxpoo[/link], http://mzyatynhimvl.com/
oueatkjuyk dijo:
2Fj9iJ <a href="http://luwpehuiojfg.com/">luwpehuiojfg</a>, [url=http://bsvkgtqavhmw.com/]bsvkgtqavhmw[/url], [link=http://iqgiozjowcht.com/]iqgiozjowcht[/link], http://xebiumskyyds.com/
Sisnett dijo:
No, pero seguro que te gana al ajedrez :)
dijo:
niño robotico especificamente jajaja
dijo:
Y la AI puede hacer que un niño se crea humano???