Está en la página 1de 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 Jueos!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 JueosComun"#ar.
Manifest
El m+dulo de !ue*os necesita ciertos datos de los proyectos para poder /acer la cara
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 8AI<E"T.8< .ue est2 en el directorio
del proyecto son0
4. )laseInicio 0 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*o 0 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.
>. =utaJar 0 =uta del arc/ivo JA= (#inario) del applet cliente en el servidor -e#.
?. )laseJue*o 0 om#re y ruta de la clase .ue e6tiende JuegoAbstra"to en el
cliente.
@. Tipo 0 %or a/ora los tipos contemplados son AcartasA, Ata#leroA, AotrosA.
'. =uta<oto 0 =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 Jueos!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 #ueos 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
#uador 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
#uador abandona la misma" El motivo del abandono +a podido ser voluntario 4por
IStation Pgina $/12
e#emplo5 el usuario +a cerrado la ventana del #ueo6 o involuntario 4por e#emplo5
por descone-i1n de la red6"
!e recibe por par%metro el #uador ,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
lueo los mensa#es ,ue se env2en en este m.todo llear%n despu.s de dic+a
informaci1n"
*ar%metros: #uador anterior / #uador 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 #uador" !i la variable
#uador 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 peritirJugador(Jugador jugador)
Este m.todo debe devolver un valor booleano ,ue indi,ue si un #uador
4solicitante6 puede entrar en la partida" 9edefinir esta funci1n permitir% a3adir
condiciones particulares para entrar en la partida concreta"
protected Jugador jugadorInicial()
Decide el #uador ,ue comien0a la partida" *or defecto5 eleir% el #uador ,ue cre1
la partida" !i se desea cambiar el #uador inicial5 puede redefinirse este m.todo"
prote"ted boolean peritirIniciarPartida(Jugador jug)
Decide si el #uador puede iniciar la partida" *or defecto5 solamente el creador de
la partida puede iniciarla"
prote"ted Jugador siguienteJugador(Jugador jAnterior)
Decide el #uador ,ue #uar% el siuiente turno" Esta implementaci1n +ace ,ue el
orden de #ueo sea secuencial / circular sen 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 terinarPartida()
: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
siuienteJuador 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 accionesuevoTurno.
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 8AI<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 ipleents ##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
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(mJuegosidPartidadatos)4
5
;amos a anali0ar los m.todos ,ue +a/ ,ue implementar obliatoriamente:
)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 String evento
!bje"t datos) 1
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

También podría gustarte