Sunteți pe pagina 1din 12

Manual del Desarrollador de Juegos Parte Compartida y Servidor

IStation

Pgina 1/12

Requisitos
Tener instalado un entorno de desarrollo (IDE) para JAVA ( NetBeans, Eclipse, JBuilder, y otros) con el ltimo Java Development Kit ( JDK) instalado. osotros pondremos como e!emplo el IDE desarrollado por "un #a!o licencia $%&, etBeans '.(. )onocimientos de pro*ramaci+n orientada o#!etos en un nivel medio. )onocimiento del len*ua!e de pro*ramaci+n Java y su modelo de eventos en un nivel medio.

Descargas
El so,t-are re.uerido se puede descar*ar gratuitamente de los sitios de Internet .ue a continuaci+n se detallan. NetBeans: /ttp011do-nload.net#eans.or*1net#eans1'.(1,inal1 Eclipse: /ttp011---.eclipse.or*1do-nloads1 JDK: /ttp011!ava.sun.com1!avase1do-nloads1

IStation

Pgina 2/12

Parte Compartida
%arte de clases .ue estar2n disponi#les a la /ora de crear un !ue*o, la ,uncionalidad principal radica clases envoltorio para el env3o de mensa!es y con,i*uraci+n de la partida. Este pa.uete se supone de#er2 car*arse en el am#os puntos de la aplicaci+n, servidor y cliente. Clases a implementar &a nica clase .ue es o#li*atorio implementar para este proyecto es0 4. 5na clase .ue e6tienda DatosPartida.

Clase DatosPartida
Esta clase a#stracta sirve para .ue el applet .ue crea la partida env3e al servidor los datos #2sicos de la partida, .ue son los .ue van a .uedar re,le!ados en la Base de Datos. %ara cada !ue*o, se e6tender2 esta clase, a*re*ando los datos .ue se precisen (e!0 tiempo m26imo de turno) y de,iniendo el m7todo a#stracto getNombreJuego.
public abstract java.lang.String getNombreJuego()

87todo .ue devuelve el nom#re del !ue*o (.ue de#e ser NICO) para .ue el ModuloJuegos /a*a la car*a din2mica correspondiente del !ue*o. El resto de la clase tiene los campos de datos pblicos .ue representan lo .ue indican sus nom#res0
boolean _entrarAMitad int _maxJugadores int _minJugadores int _nivelMax int _nivelMin boolean _observable //si permite observadores boolean _privada

Clase MensajePartida
)lase para en*lo#ar los mensa!es .ue env3a una partida.
public MensajePartida(java.lang.String evento java.lang.!bje"t datos)

)onstructora de 8ensa!e%artida. 9ue tendr2 un String .ue ser2 la descripci+n del tipo de mensa!e y un Object .ue ser2 el mensa!e concreto.

Clases propias del juego


En este proyecto tam#i7n se de#er2n incluir el resto de clases .ue sean necesarias en am#as partes del !ue*o (servidor y cliente). %or e!emplo si decidimos /acer una clase envoltorio .ue a*rupe todos los datos .ue incluir2 un mensa!e, para usarla para el pasa!e de datos, de#e estar a.u3.

IStation

Pgina 3/12

Parte Servidor
Instrucciones a la hora de crear un juego
El framework del servidor permite controlar el curso de la partida, o#teniendo in,ormaci+n de los clientes y noti,ic2ndoles de los /ec/os .ue ocurren en dic/a partida. &as acciones de la partida est2n diri*idas por eventos, ya sean 7stos la lle*ada de un mensa!e por parte de un cliente, o el transcurso de determinado per3odo de tiempo. Clases a implementar %ara implementar el controlador (servidor) de una partida, es necesario crear (como m3nimo) las si*uientes clases0 4. 5na clase .ue implemente ##ni"ioPartida. :. 5na clase .ue e6tienda (/erede) la clase a#stracta Partida. Estas clases se encuentran el la li#rer3a Jue os!ervidor"#ar, .ue se de#e importar en el proyecto (como se e6plic+ en la introducci+n del tutorial). Tam#i7n es necesario implementar la li#rer3a0 Jue osComun"#ar. Manifest El m+dulo de !ue*os necesita ciertos datos de los proyectos para poder /acer la car a$ din%mica y actuali;ar la in,ormaci+n en la #ase de datos. &os atri#utos .ue se de#en a*re*ar al arc/ivo 8A I<E"T.8< .ue est2 en el directorio del proyecto son0 4. )laseInicio0 om#re completo de la clase iniciadora para la partida (incluyendo el pa.uete). =ecordamos .ue esta clase es la .ue implementa la inter,a; IInicio%artida. :. om#reJue*o0 om#re del !ue*o .ue se mostrar2 tal cual en el portal -e#. De#e coincidir con el valor devuelto por el m7todo de DatosPartida. >. =utaJar0 =uta del arc/ivo JA= (#inario) del applet cliente en el servidor -e#. ?. )laseJue*o0 om#re y ruta de la clase .ue e6tiende JuegoAbstra"to en el cliente. @. Tipo0 %or a/ora los tipos contemplados son AcartasA, Ata#leroA, AotrosA. '. =uta<oto0 =uta de la ima*en en el servidor .ue se mostrar2 en el portal -e#. "i en el directorio del proyecto no e6iste nin*n arc/ivo llamado &'NI(E!)"&(, de#e crearse un arc/ivo de te6to con este nom#re y el contenido descrito. Tam#i7n /ay .ue ase*urarse .ue el arc/ivo llamado proje"t.properties dentro de la carpeta nbproje"t tiene una l3nea con el si*uiente te6to0
mani$est.$ile%MAN#&'S(.M&

Ejemplo con el Servidor de la PatataCaliente


)lase#ni"io* #Station.Modulos.Juegos.Servidor.Patata)aliente.#ni"ioPatata)aliente NombreJuego* Patata )aliente +utaJar* juegos/patata/Juegos)lientePatata)aliente.jar )laseJuego* #Station.)liente.Juegos.Patata)aliente.JuegoPatata)aliente

IStation

Pgina 4/12

(ipo* otros +uta&oto* img/Patata.jpg

Incluir una descripcin del uego &a idea es .ue en el portal se muestre una #reve descripci+n del !ue*o para tener una idea *eneral de .u7 va. El portal va a acceder a dic/a descripci+n a trav7s de la #ase de datos. El encar*ado de poner dic/a in,ormaci+n en la BBDD es el ModuloJuegos .ue va a leer del arc/ivo JA= .ue se encuentra en el servidor un ,ic/ero .ue se encuentra en la ruta A1I"tation1Descripcion.t6tA. A.u3 se muestra una ima*en del proyecto Jue os!ervidor*atataCaliente en donde se puede apreciar donde va u#icado el arc/ivo de descripci+n.

!e$puede$ver$el$arc+ivo$dentro$del$pa,uete$I!tation"

Clase Jugador
Esta clase proporciona la ,uncionalidad para tratar un !u*ador. %ermite reali;ar acciones so#re los !u*adores tales como enviar mensa!es o alterar el nmero de puntos. &os m7todos tiles de la clase para un desarrollador son los si*uientes0
publi" java.lang.String getNombre()

Accesora .ue devuelve el nom#re del !u*ador.


public int obtenerPuntos()

)onsulta los puntos actuales del !u*ador.


public void sumarPuntos(int puntos)

"uma a los puntos del usuario (!u*ador) una cantidad de puntos.

IStation

Pgina !/12

public void enviarMensaje(String evento

!bje"t msg)

Env3a un mensa!e (se envuelve con un 8ensa!e%artida).

Clase que implementar IInicioPartida


Esta inter,a; tiene s+lo un m7todo tipo ,actor3a .ue lo .ue /ace es proporcionarnos una nueva instancia de una partida concreta. El prototipo de la ,unci+n es el si*uiente0
public Partida ini"iarPartida(DatosPartida datos #ModuloJuegos modJuegos int idPartida)

Evidentemente lo .ue vamos a devolver ser2 una instancia de una partida concreta (una clase .ue e6tiende a Partida) y el par2metro datos ser2 de clase .ue e6tienda a DatosPartida, como se e6plic+ en la secci+n anterior.

Clase que extender a Partida


&a clase AB"T=A)TA Partida, es la .ue proporciona la ,uncionalidad comn para todas las partidas (en el lado del servidor). Esta$clase$deber%$e-tenderse$para$crear$las$partidas$de$los$#ue os$concretos" &a clase partida se comunica con el 8+dulo de Jue*os a trav7s de la inter,a; #ModuloJuegos. "in em#ar*o, toda la interacci+n con el 8+dulo de Jue*os es transparente al desarrollador de !ue*os. Bay m7todos .ue se pueden rede,inir y otros .ue no, 7stos son los .ue llevan el modi,icador $inal en su ca#ecera. M"todos #ue se tienen #ue implementar obligatoriamente
protected void accionesInicioPartida()

En$este$m.todo$deben$llevarse$a$cabo$las$acciones$derivadas$del$inicio$de$la$partida"$ Estas$acciones$ser%n$llevadas$a$cabo$#usto$despu.s$de$,ue$la$partida$+a/a$iniciado"
protected void accionesFinPartida()

En$este$m.todo$deben$llevarse$a$cabo$las$acciones$derivadas$de$la$finali0aci1n$de$la$ partida"$Estas$acciones$ser%n$llevadas$a$cabo$#usto$antes$de$,ue$la$partida$termine"
protected void jugadorAnadido(Jugador jugador)

Este$m.todo$reali0a$acciones$derivadas$de$la$incorporaci1n$de$un #u ador$a$la$partida" ',u2$se$deben$implementar$para$a3adir$las$acciones$oportunas"


protected void jugadorAbandona(Jugador jugador)

Este$m.todo$reali0a$acciones$dependientes$de$la$partida$concreta$cuando$un$ #u ador$abandona$la$misma"$El$motivo$del$abandono$+a$podido$ser$voluntario$4por$ IStation Pgina $/12

e#emplo5$el$usuario$+a$cerrado$la$ventana$del$#ue o6$o$involuntario$4por$e#emplo5$ por$descone-i1n$de$la$red6" !e$recibe$por$par%metro$el$#u ador$,ue$+a$abandonado"


protected void accionesNuevoTurno(Jugador jAnterior, Jugador jNuevo)

Este$m.todo$reali0a$las$acciones$,ue$provoca$un$cambio$de$turno"$Cuando$este$ m.todo$se$llama5$todos$los$clientes$/a$+an$sido$informados$del$cambio$de$turno5$ lue o$los$mensa#es$,ue$se$env2en$en$este$m.todo$lle ar%n$despu.s$de$dic+a$ informaci1n" *ar%metros:$#u ador$anterior$/$#u ador$nuevo$4el$,ue$tiene$el$turno6


protected void procesarDatos(Jugador jugador, String evento, Object datos)

Este$m.todo$recibe$un$mensa#e$enviado$por$un$#u ador"$!i$la$variable #u ador$es$null$/$el$evento$es$7tempori0ador85$$entonces$el$mensa#e$a$procesar$es$ un$eco" M"todos #ue se pueden so%rescri%ir "i las acciones .ue proporcionan no son las deseadas para el !ue*o .ue se est7 desarrollando, esta es la lista de m7todos .ue se pueden so#rescri#ir para cam#iar su ,uncionalidad0
protected boolean per itirJugador(Jugador jugador)

Este$m.todo$debe$devolver$un$valor$booleano$,ue$indi,ue$si$un$#u ador$ 4solicitante6$puede$entrar$en$la$partida"$9edefinir$esta$funci1n$permitir%$a3adir$ condiciones$particulares$para$entrar$en$la$partida$concreta"


protected Jugador jugadorInicial()

Decide$el$#u ador$,ue$comien0a$la$partida"$*or$defecto5$ele ir%$el$#u ador$,ue$cre1$ la$partida"$!i$se$desea$cambiar$el$#u ador$inicial5$puede$redefinirse$este$m.todo"


prote"ted boolean per itirIniciarPartida(Jugador jug)

Decide$si$el$#u ador$puede$iniciar$la$partida"$*or$defecto5$solamente$el$creador$de$ la$partida$puede$iniciarla"


prote"ted Jugador siguienteJugador(Jugador jAnterior)

Decide$el$#u ador$,ue$#u ar%$el$si uiente$turno"$Esta$implementaci1n$+ace$,ue$el$ orden$de$#ue o$sea$secuencial$/$circular$se n$el$orden$de$entrada$a$la$partida"$ !i$se$,uiere$definir$otro$orden5$puede$redefinirse$este$m.todo" M"todos #ue ! se podrn so%rescri%ir

IStation

Pgina &/12

Bay m7todos .ue est2n declarados como !inal en la clase Partida. "e ad!unta la descripci+n de sus ,uncionalidades.
publi" $inal void ter inarPartida()

:ace$,ue$la$partida$termine5$de#ando$de$proporcionar$todos$los$servicios$a$los$ clientes"$
protected !inal void di$undirMensaje(java.lang.String evento java.lang.!bje"t datos)

Env3a un mensa!e a todos los o#servadores y !u*adores. Csta es la nica manera de enviar mensa!es a los o#servadores, de manera .ue no es posi#le enviar in,ormaci+n a los o#servadores sin .ue sea enviada tam#i7n a todos los !u*adores.
protected !inal Jugador jugadorA"tual()

Devuelve el !u*ador al .ue le corresponde el turno actual.


protected !inal java.util.,ist-Jugador. get,istaJugadores()

Devuelve una lista con todos los !u*adores de la partida.


protected !inal void generar'"o(int milisegundos !bje"t datos)

$enera un mensa!e con los datos pasados por par2metro .ue ser2 enviado de vuelta a la partida transcurrido el tiempo esta#lecido.
protected !inal void "ambioDe(urno(Jugador jugador)

Este m7todo se llama cada ve; .ue un !u*ador solicita el ,in de su turno. "e comprue#a .ue el !u*ador .ue lo solicita estuviese en posesi+n del turno, y utili;a el m7todo si uienteJu ador para averi*uar el si*uiente !u*ador .ue comen;ar2 su turno. Este m7todo tam#i7n puede ser llamado desde otro m7todo de esta misma clase para ,or;ar el ,in de turno de un !u*ador. %ara implementar acciones .ue de#an llevarse a ca#o en los cam#ios de turno, de#e implementarse el m7todo acciones uevoTurno.

IStation

Pgina '/12

Desarrollando un juego
Concepto del juego
Vamos a poner como e!emplo de desarrollo un !ue*o sencillo, La Patata Caliente. Este !ue*o consiste en pasar el turno (la patata) al si*uiente !u*ador sin .ue se aca#e el tiempo de la partida con la patata en tu poder. )uando el tiempo de la ronda (.ue se decide de ,orma aleatoria en el servidor) se aca#a el !u*ador .ue est2 en posesi+n del turno pierde.

Parte Com"n
%ara reali;ar la parte comn /ay .ue se*uir los pasos .ue se indicaron en la parte correspondiente de este manual. En resumen, estos eran0 4. )rear un proyecto .ue se llamara JuegosComunPatataCaliente. :. Importar como #i#lioteca JA= el arc/ivo JuegosComun.jar. >. )rear una clase .ue e6tienda a DatosPartida e implemente su m7todo a#stracto getNombreJuego. Entonces, creamos la clase DatosPatata)aliente con el si*uiente m7todo0
/// / Permite a""eder al nombre del juego / "return )adena de "ara"teres 0ue representa el nombre del juego // public String getNombreJuego() 1 return 2Patata )aliente34 5

D un constructor por de,ecto .ue nos ,acilitar2 el in*reso de los datos de la partida.
/// / )rea una instan"ia de DatosPatata)aliente "on un n6mero de jugadores dado / 7param numJug * Numero maximo de jugadores permitidos // public DatosPatata)aliente(int numJug) 1 _maxJugadores% numJug4 _entrarAMitad% !alse4 _minJugadores% 84 _nivelMax% #nteger.MA9_:A,;'4 _nivelMin% <4 _observable% !alse4 _privada% !alse4 5

)on esta clase la parte comn ya est2 lista, dado .ue no vamos a pasar mensa!es de otro tipo. Da podemos empe;ar con la parte servidor.

IStation

Pgina (/12

Parte Servidor
%ara reali;ar la parte comn /ay .ue se*uir los pasos .ue se indicaron en la parte correspondiente de este manual. En resumen, estos eran0 4. )rear un proyecto .ue se llamara JuegosServidorPatataCaliente. :. Importar como #i#lioteca JA= el arc/ivo JuegosComun.jar. >. Importar como #i#lioteca JA= el arc/ivo JuegosComunPatataCaliente.jar. ?. Importar como #i#lioteca JA= el arc/ivo JuegosServidor.jar. @. Incluir un TET con la descripci+n del !ue*o. '. )rear un ,ic/ero 8A I<E"T.8< F. )rear una clase .ue e6tienda a %artida e implemente sus m7todos a#stractos. G. )rear una clase iniciadora .ue implemente la inter,a; IInicio%artida Interfa) iniciadora )reamos una clase dentro del pa.uete #Station.Juegos.Patata)aliente.Servidor0
public class #ni"ioPatata)aliente i ple ents ##ni"ioPartida 1 public Partida ini"iarPartida(DatosPartida datos #ModuloJuegos mJuegos int idPartida) 1 return ne# PartidaPatata)aliente(mJuegos idPartida (DatosPatata)aliente)datos)4 5

Clase #ue implementa el servidor &a constructora de la clase, simplemente se limita a pasar los par2metros a su sper clase (%artida).
publi" PartidaPatata)aliente(#ModuloJuegos mJuegos int idPartida DatosPatata)aliente datos) 1 super(mJuegos idPartida datos)4 5

;amos$a$anali0ar$los$m.todos$,ue$+a/$,ue$implementar$obli atoriamente: )uando un !u*ador se una a la partida no /ay .ue /acer nada para este !ue*o, el ,rame-orH ya se encar*a de mantenerlo en una lista, para sa#er .ue est2 unido a la misma. &a misma situaci+n se produce cuando un !u*ador a#andona una partida, no tenemos .ue /acer nada. Es cierto .ue podr3amos /a#er optado por penali;ar al !u*ador y restarle

IStation

Pgina 1*/12

puntos por a#andonar el !ue*o antes de ,inali;ar (para esto #astar3a con a*re*ar una l3nea de c+di*o.
prote"ted void jugadorAnadido(Jugador jugador) 1 5 prote"ted void jugadorAbandona(Jugador jugador) 1 //posible a""i=n // jugador.sumarPuntos(>8)4 5

Dado .ue el tiempo .ue va a estar circulando la patata es aleatorio, cuando se da comien;o a la partida, calculamos el tiempo en se*undos .ue .ueremos .ue dure la partida, o lo .ue es lo mismo .ue la patata est7 circulando. D cuando la partida aca#e no tendremos .ue reali;ar nin*una acci+n particular.
protected void a""iones#ni"ioPartida() 1 int tiempoPartida % (int)(java.lang.Mat?.random()/@<A8<)/8<<<4 //'jemplo de uso del m=dulo de ,!B get,ogger().es"ribir#n$orma"ion( C(iempo* C A (tiempoPartida/8<<<) AC segundosC)4 //Benero un '"o para re"ibir un mensaje "uando //?aDa trans"urrido el tiempo de la partida t$is.generar'"o(tiempoPartida null)4 5 protected void a""iones&inPartida() 1 5

&os mensa!es de paso de turno los administra el ,rame-orH de modo .ue no tenemos .ue preocuparnos por los mismos. Desde los clientes no nos lle*ar2n mensa!es, por tanto el nico tipo de mensa!e .ue nos .ueda por procesar en el del E)I, .ue *eneramos cuando se inicia la partida.
prote"ted void pro"esarDatos(Jugador jugador !bje"t datos) 1 String evento

i$(evento E% null FF evento.e0uals(('MP!+#GAD!+)) 1 //;so del ,!B get,ogger().es"ribir#n$orma"ion(CSe a"ab= el tiempoC)4 //'nvHo mensaje a todos los jugadores //indi"a 0ue se a"ab= el tiempo di$undirMensaje(CtiempoC null)4 #terator-Jugador. it % get,istaJugadores().iterator()4 #$ile(it.?asNext()) 1 Jugador jugAux % it.next()4 //Banan todos los jugadores 0ue no tengan la patata i!(EjugAux.e0uals(jugadorA"tual())) 1 jugAux.sumarPuntos(8)4 5 5 //,lamo al $rameIorJ para dar la partida por $inaliKada terminarPartida()4

5 5

IStation

Pgina 11/12

%or ltimo nos .ueda ver .ue /acer cuando un !u*ador toma posesi+n del turno. )omo el ,rame-orH se encar*a de re*istrar este evento, y re*istrar .u7 !u*ador tiene el turno, no /aremos nada cuando pase el turno.
protected void a""ionesNuevo(urno(Jugador jugadorAnterior Jugador jugadorNuevo) 1 5

Este era el ltimo m7todo .ue ten3amos .ue implementar o#li*atoriamente. )on lo cual ya /emos terminado. "i .uisi7ramos cam#iar el comportamiento por de,ecto del ,rame-orH tendr3amos .ue so#re escri#ir los m7todos permitirJugador, jugador#ni"ial, siguienteJugador o permitir#ni"iarPartida.

El$e,uipo$de$I!tation$espera$,ue$manual$te$+a/a$sido$til5$si$tienes$cual,uier$tipo$ de$duda5$entra$a$la$secci1n$del$portal$web$dedicada$a$los$desarrolladores5$o$al$foro"

IStation

Pgina 12/12

S-ar putea să vă placă și