Taller
T
ll de
d
Programación de Agentes
co
con
JADE
Gon alo A
Gonzalo
A. Aranda Corral
Dpto. Tecnologías de la Información
Escuela Politécnica Superior “La
La Rábida”
Rábida
Universidad de Huelva
Taller de
Programación de Agentes
Taller de
Programación de Agentes
Publireportaje
Para Programación de Agentes
INTELIGENTES:
Dpto.
p Ciencias de la Computación
p
e
Inteligencia Artificial
Programa
og a a de Master
as e O
Oficial
c a y Doctorado
oc o ado !
http://master.cs.us.es
p
¿Qué es JADE?
Jade es básicamente dos cosas:
Una plataforma:
U
l t f
que permite
it “VIVIR” y “CONVIVIR” a
los agentes dentro de ella.
Un conjunto de herramientas para el desarrollo de
g
y sistemas de forma rápida.
agentes
Java Agent DEvelopment framework
¿Qué es JADE?
Totalmente realizado en Java
Java. (Portabilidad y
Movilidad)
Software libre distribuido p
por TILAB en código
g fuente
bajo LPGL
http://jade.tilab.com/
Estándares
Foundation for Intelligent Physical Agents (FIPA)
Arquitectura: Integración de diferentes aplicaciones,
incluso con plataformas de diferentes propietarios.
Lenguaje de comunicación empleado FIPA-ACL.
Servicios de agentes: ciclo de vida, páginas blancas,
páginas amarillas, transporte de mensajes,...
Conjunto
C j t d
de herramientas
h
i t gráficas
áfi
que soportan
t lla
depuración y ejecución de agentes (RMA, sniffer, ...)
http://www.fipa.org
FIPA: Arquitectura básica
Plataforma
Pl t f
distribuida
di t ib id
Comunicación entre plataformas
Protocolos estándares
Internet
FIPA: Plataforma
Especificación FIPA
Agentes
g
y servicios
Comunicación
FIPA: Arquitectura Agentes
AMS . Agent Management System:
Garantiza que cada agente en la plataforma tenga un único
nombre.
Encargado de proporcionar los servicios de páginas blancas
y ciclo de vida, y de mantener el directorio de los
identificadores de agentes (AID: Agent Identifier) y su
estado.
Cada agente debe registrarse con el AMS para obtener un
AID válido
DF . Directory Facilitator:
Agente que proporciona el servicio de páginas amarillas.
Un agente puede encontrar otros agentes que proporcionan
los servicios que requiere para cumplir sus objetivos
ACC . Agent Communication Channel:
Software que controla el intercambio de mensajes
JADE
FIPA - Compliant
p
Plataforma
Arquitectura
A
Agentes
t
Cómo obtener Jade
Dirección: http://jade.tilab.com
Para la mayoría de las acciones es necesario
registrarse, y aceptar los requisitos de la
licencia LGPL
La versión actual de Jade es la 4.0(Abril
2010), aunque nosotros vamos a realizar
2010)
este seminario sobre la versión 3.7 (Julio
2009)
Instalación
Descargamos
D
ell fifichero
h
(JADE
(JADE-all-3.7.zip)
ll 3 7 i ) de
d la
l
versión correspondiente.
Descomprimimos el fichero y nos salen cuatro
nuevos ficheros:
JADE-doc-3.7.zip: la documentacion jjavadoc, el
manual del administrador, el del programador y un
tutorial.
JADE-src-3.7.zip:
JADE src 3 7 zip: el codigo fuente sin compilar
compilar.
JADE-bin-3.7.zip: el codigo ya compilado y listo
para ser invocado.
JADE-examples-3.7.zip: ejemplos de uso de la
plataforma.
Instalación
Se creará un directorio lib/ debajo
j del cual
estarán las librerías necesarias para la
ejecución
j
de Jade
NECESITA,
NECESITA al menos,
menos JAVA 1
1.4.2
42
(Aunque usaremos la 1.6)
Eclipse: Creación del proyecto
Eclipse: Creación del proyecto
Eclipse: Creación del proyecto
La clase Agent
Implementar agentes(heredar de): jade.core.Agent
jade core Agent
NUNCA SOBREESCRIBIR EL CONSTRUCTOR
Inicialización: setup().
Morir: doDelete().
Sobreescribir: takeDown().
takeDown()
Argumentos:
g
getArguments()
g
g
()
Object[] que proporciona los argumentos que se le han
pasado al agente.
Identificadores de agentes
Descripción del agente: AID (Agent Identier)
jade core AID
jade.core.AID
La clase Agent
g
incorpora
p
el método getAID()
g
() q
que
permite recuperar el nombre del agente.
El nombre del agente,
agente un identificador único
globalmente(normativa FIPA), va a tener la
estructura
<nickname>@<nombre-plataforma>:<puerto>/JADE
Ejercicio 1.
1
Nuestro primer agente:
• Debemos de crear un agente
g
cuya
y misión
sea imprimir un “Hola Mundo”
package ej01;
import jade.core.Agent;
public class Ejercicio01 extends Agent {
protected void setup() {
System.out.println(“Hola Mundo.”);
}
}
Ejecución
Desde
D d lílínea d
de comandos:
d
java <classpath> [opciones] jade.Boot
jade Boot [agente:ClaseAgente]
classpath: direccion y nombre de los *.jar de Jade
opciones: en principio, usaremos la opcion “-gui”
jade.Boot: es la clase de arranque de la plataforma
agente:ClaseAgente: Nombre y clases(incluyendo
paquetes) de nuestro agente
Ejecución
Desde Eclipse:
Creamos una configuración de ejecución.
Configuramos los siguiente parámetros
(Ver pag siguiente)
Ejecución
Ejecución
Ejecución
Ejecución
Resultado
25‐may‐2006 1:46:38 jade.core.Runtime beginContainer
25
may 2006 1:46:38 jade core Runtime beginContainer
INFO: ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
This is JADE 3.3 ‐ 2005/03/02 16:11:05
d
downloaded in Open Source, under LGPL restrictions,
l d d i O
S
d LGPL t i ti
at http://jade.cselt.it/
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
*******************MAS INFORMACION
INFO: ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Agent container Main‐Container@JADE‐IMTP://GON‐WS1 is ready.
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Hola Mundo.
Resultado
25‐may‐2006 1:46:38 jade.core.Runtime beginContainer
25
may 2006 1:46:38 jade core Runtime beginContainer
INFO: ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
This is JADE 3.3 ‐ 2005/03/02 16:11:05
d
downloaded in Open Source, under LGPL restrictions,
l d d i O
S
d LGPL t i ti
at http://jade.cselt.it/
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
SIGUE VIVO!!!
*******************MAS INFORMACION
INFO: ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Agent container Main‐Container@JADE‐IMTP://GON‐WS1 is ready.
SIEMPRE CERRAR
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
HACIENDO SHUTDOWN
Hola Mundo.
DESDE EL MENU DE LA
PLATAFORMA... SI NO, SE
QUEDA ABIERTA!
Plugin para Eclipse
http://dit.unitn.it/~dnguyen/ejade/
Comportamientos
Comportamientos
Acciones y Percepciones:
p
“Comportamientos”.
Comportamientos
El funcionamiento de los comportamientos está
implementado a 2 niveles:
Una cola circular de los comportamientos activos
Una cola con los comportamiento bloqueados.
Los comportamientos se desbloquean al recibir el
agente un mensaje.
Ciclo de vida de un agente
Comportamientos
La clase principal es:
jade.core.behaviours.Behaviour
Tiene 2 métodos principales:
action(): que es el método que se ejecuta cada vez
que se invoca
i
ell método
ét d
done(): hace la comprobación de si el comportamiento
ha terminado o no.
Aquí se puede sobreescribir el constructor (aunque no es aconsejable)
Comportamientos
Ejercicio 2: Crear un agente que implemente un
comportamiento que salude al mundo.
package ej02;
import jade.core.Agent;
import jade core behaviours Behaviour;
import jade.core.behaviours.Behaviour;
public class Ejercicio02 extends Agent {
protected void setup() {
this.addBehaviour(new Behaviour() {
pub c o d act o () {
public void action() {
System.out.println("Hola Mundo. Ejercicio2");
}
public boolean done() { return true; }
bli b l
d
() { t
t
}
}); } }
Comportamientos
Ejercicio 3: Repetir el agente anterior, con
comportamiento en clase separada.
public class B_Ej03 extends Behaviour{
public void action() {
System out println("Hola Mundo Ejercicio3");
System.out.println("Hola Mundo. Ejercicio3");
}
public boolean done() { return true; }
}
protected void setup() {
B_Ej03 ej3 = new B_Ej03();
addBehaviour(ej3);
}
Comportamiento
Ejercicio 4: Implementar un comportamiento
que cuente desde 1 hasta 10
public class B_Ej04 extends Behaviour{
int contador = 1;
public void action() {
System.out.println(contador);
contador++;
}
public boolean done() {
// CONDICION DE FINAL DE COMPORTAMIENTO
return contador > 10;
}
}
Comportamiento
Variable: myAgent
Ciertas acciones las realiza el agente
Reutilización de los
comportamientos
Tipos de comportamientos
C
Comportamientos
t i t estándar:
tá d
Behaviour: Comportamiento genérico.
OneShotBehaviour: done() siempre devuelve
“true”.
CyclicBehaviour:
C li B h i
d
done()
() siempre
i
d
devuelve
l
“false”.
TickerBehaviour: se ejecuta periódicamente
(dado en el constructor).
FSMBehaviour: máquina finita de
estados(Finite State Machine).
..............
Ejemplo
Ejercicio 5: Crear un comportamiento cíclico
que lea un sensor constantemente
public class B_Ej05 extends CyclicBehaviour{
private int estado = 0;
public void action() {
int medida = Sensores.getBumper();
switch(estado) {
case 0:
// No ha tocado case 1:
// Ha tocado }
}
}
Tipos de comportamientos
Los comportamientos
p
además se p
pueden
componer y formar comportamientos más
complejos.
j
Una implementación interesante sería el
comportamiento BDI dentro de Jade.
Comportamientos Compuestos
FSMBehaviour es un comportamiento
p
compuesto.
De manera secuencial, y definiendo transiciones
entre estados, se implementa la acción que debe
realizar el comportamiento.
FSMBehaviour carece de método action()
()
Comportamientos Compuestos
Para la devolución del estado se
sobreescribe el método onEnd(), que
devuelve el entero que nos decidirá la
transición de estado.
También existen otros como:
SequentialBehaviour, ParallelBehaviour,
SequentialBehaviour
ParallelBehaviour
…
Ejemplo FSM
Constantes
public class B_Ej06 extends FSMBehaviour {
// t d FSM // estados FSM private static final String ESTADO_0 = "cero"; private static final String ESTADO_1 = "uno"; private static final String ESTADO_2 = "dos"; private static final String ESTADO_3 = "tres"; private static final String ESTADO ERR = "error"; private static final String ESTADO_ERR = error ; // Valores devueltos
private final int CERO = 0; private final int CINCO = 5; private final int DIEZ = 10; private final int QUINCE = 15;
Ejemplo FSM
Constructor
public B_Ej06(Agent a) {
super(a); ( ) // Registrar los estados
registerFirstState(new ZeroBehaviour(myAgent), ESTADO_0);
registerState(new FiveBehaviour(myAgent), ESTADO_1); registerState(new TenBehaviour(myAgent), ESTADO_2); registerLastState(new TwentyFiveBehaviour(myAgent), ESTADO 3); registerLastState(new TwentyFiveBehaviour(myAgent), ESTADO_3); // transiciones
registerTransition(ESTADO_0, ESTADO_0, CERO); registerTransition(ESTADO_0, ESTADO_1, CINCO); (
)
registerDefaultTransition(ESTADO_0, ESTADO_ERR); scheduleFirst(); }
Ejemplo FSM
Comportamientos internos
class ZeroBehaviour extends OneShotBehaviour {
int transition = CERO; public void action() {
// Cosas que hacer
}
// Se ejecuta al final y es el encargado de devolver el valor.
public int onEnd() {
return transition; } } Comunicación
Comunicación
Comunicación TRANSPARENTE
3 niveles
Máquina: Eventos
E t Má
Entre
Máquinas
i
misma
i
red:
d RMI
Distinta red: CORBA
Comunicación
La capacidad de comunicación = envío de
mensajes ACL.
En 1 mensaje podemos distinguir 4 partes
principales:
Receptor y Emisor
Contenido
Directiva
Lenguaje y Ontologías
Comunicación
El mensaje es un objeto de la clase
jade.lang.acl.ACLMessage
Intención del mensaje: “PERFORMATIVA”
Además, posee otros parámetros:
ReplyWith, ConversationId, etc
Comunicación
Creación de un mensaje
ACLMessage mensaje = new ACLMessage(ACLMessage.REQUEST);
AID agente = new AID("agente2"
AID agente = new AID(
agente2 ,AID.ISLOCALNAME);
AID ISLOCALNAME);
mensaje.addReceiver(agente);
mensaje.setContent("Quiero Jugar");
j
( Q
g
);
myAgent.send(mensaje);
Comunicación
Todas las acciones de un agente, deben de estar
i l
implementadas
t d como comportamientos.
t i t
La
L comunicación
i
ió es una acción.
ió
Estos
E
comportamientos
i
podrián
d iá ser O
OneShot*.
Sh *
Los comportamientos cíclicos se usan para la
recepción contínua de mensajes.
Parámetros de ejecución
Si creamos la
l plataforma
l t f
y ejecutamos
j
t
varios
i
agentes:
(sin parámetros especiales)
Unir un agente
g
a una p
plataforma creada ((en la misma
máquina=desde 2 aplic)
Parámetro: -container
Unir un agente a una plataforma creada OTRA
máquina
Parámetro: -host xxx.xxx.xxx.xxx -container
Parámetro: -host localhost -container
Comunicación
Ejercicio 7: Crear un comportamiento de un
disparo que envíe un mensaje a la plataforma
del servidor.
Intención: “Inform”
Nombre del agente servidor: “servidor”
Ip
p de la p
plataforma:
Comunicación
AID Destino; String Mensaje; int Intencion;
public B_Ej07(String _destino, String _mensaje, int _intencion) {
) {
super();
Destino = new AID(_destino,AID.ISLOCALNAME);
Mensaje = _mensaje;
Intencion = _intencion;
}
public void action() {
ACLMessage mensaje = new ACLMessage(Intencion);
mensaje.addReceiver(Destino);
mensaje.setContent(Mensaje);
myAgent send(mensaje);
myAgent.send(mensaje);
}
Comunicación
Recepción
R
ió d
de mensajes.
j
Quien recibe el mensaje es el “agente”
myAgent.receive();
Si no recibe mensaje,
j , el comportamiento
p
se
debe de bloquear
block();
()
receive()
() .vs. blockingReceive()
g
()
Comunicación
Ejercicio 8: Crear un comportamiento cíclico
que reciba mensajes y los muestre por
pantalla.
public void action() {
ACLMessage envio = myAgent.receive();
if (envio != null) {
System.out.println(envio.getSender().getLocalName() + ": " + envio.getContent());
} else block();
}
Comunicación
Existen plantillas de mensajes
(MessageTemplate)
Se usan para filtrar la recepción de mensajes
Las plantillas se pueden componer.
ACLMessage a = myAgent.receive(
MessageTemplate.and( MessageTemplate.MatchPerformative(ACLMessage.PROPOSE),
l
h
f
i (
)
MessageTemplate.MatchConversationId("12221")
));
Ping Pong
Ping-Pong
Ejercicio extra:
Crear dos agentes,
g
donde uno envíe un Ping
g
a otro y este le conteste con el Pong
correspondiente.
A1 envía un mensaje a A2
A2 lo escribe y RESPONDE
A1 lo escribe y se auto-finaliza
Protocolos
Protocolos
FIPA establece
t bl
unos protocolos
t
l estándares.
tá d
Están basados en el uso de directivas
(performativas).
Algunos implementados en JADE
FIPA Request Interaction Protocol Specification
FIPA Query Interaction Protocol Specification
FIPA Request When Interaction Protocol Specification
FIPA Contract
C t
t Net
N t Interaction
I t
ti Protocol
P t
l Specification
S
ifi ti
...
Protocolos
JADE da libertad de lenguaje.
JADE trae soporte para lenguaje SL y
LEAP(binario)
FIPA recomienda el lenguaje SL
También se puede hacer uso de ontologías
Protocolos
Ejercicio 8: Implementación del protocolo
FIPA-REQUEST para conexión a una
plataforma.
Nombre del servidor: “entorno”
Equipos: 7 Æ Azul, 8 Æ Rojo
Clave: “a”
Clase a sobreescribir:
SimpleAchieveREInitiator
Protocolos
FIPA-REQUEST
Según FIPA
Protocolos
Implementacion del protocolo
public B_Protocolo(Agent a, ACLMessage msg) {
super(a, msg); }
public void
public void
public void
public void
public void
handleAgree(ACLMessage msg) { }
handleRefuse(ACLMessage msg) { }
handleInform(ACLMessage msg) { }
handleNotUnderstood(ACLMessage msg) { }
handleOutOfSequence(ACLMessage msg) { }
Protocolos
Inicialización
Creación de un mensaje y
Activación del comportamiento.
import jade.domain.FIPANames.InteractionProtocol;
…
ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
msg.addReceiver(new AID("entorno",AID.ISLOCALNAME));
msg.setContent(Equipo
tC t t(E i + Cl
Clave);
)
msg.setProtocol(InteractionProtocol.FIPA_REQUEST);
this addBeha io r(ne B
this.addBehaviour(new
B_Protocolo(this,msg));
Protocolo(this msg))
Servicios
Servicios
2 servicios fundamentales:
AMS Æ Páginas Blancas
DF Æ Páginas Amarillas
Servicios: Registro y búsqueda
El registro
g
dentro del servicio de Páginas
g
Blancas es obligatorio para pertenecer a la
plataforma.
El registro en las Páginas Amarillas es
opcional. En él se registran los servicios que
ofrece cada agente
agente, pudiéndose dar más de
una entrada por agente.
Servicios: Registro y búsqueda
“No tenemos p
por q
que saber como se llama el
agente que posee nuestra partida”
“El secreto compartido”, es decir, tenemos
que saber ALGO de lo que queremos buscar
buscar.
Los agentes se pueden registrar en las
plataformas para poder ser buscados (*)
Registro en Páginas Blancas
Se realiza automáticamente al unirse a la
plataforma.
Se puede realizar “a mano” si se desea,
Si extendemos de la clase Agent, esta lo
tiene implementado.
Registro en Páginas Amarillas
//----------------------------------------------------------------//
// Registrar Servicio en el DF
//
//----------------------------------------------------------------//
//
DFAgentDescription dfd = new DFAgentDescription();
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription();
sd.setType(“Servidor");
sd.setName(“Tetris");
dfd addServices(sd);
dfd.addServices(sd);
try {
DFService.register(this,dfd);
System.out.println( Servidor:\t\tRegistrado );
System.out.println(“Servidor:\t\tRegistrado");
} catch(FIPAException fe) {
fe.printStackTrace();
}
Búsqueda en Páginas Amarillas
DFAgentDescription template = new DFAgentDescription();
sd = new ServiceDescription();
sd.setType(“Servidor");
yp (
);
template.addServices(sd);
AID[ ] creadores = null;
try {
DFAgentDescription[ ] result = DFService.search(this,template);
creadores = new AID[result.length];
for (int i=0; i< result.length; i++) {
creadores[i] = result[i].getName();
}
} catch (FIPAException fe) {
creadores
d
= null;
ll ffe.printStackTrace();
i tSt kT
()
}
if (creadores == null) {
this doDelete();
this.doDelete();
}
De Registro
De-Registro
El borrado de las Páginas Blancas ES
AUTOMÁTICO
El borrado de las Páginas Amarillas ES
MANUAL
Debemos de hacerlo cuando el agente muere
muere,
dentro del método takeDown()
Unos casos prácticos
Tetris: Introducción.
Agente Partida
Sistema Multi-agente (2) que
van a interactuar por medio de
mensajes ACL para
implementar el juego del Tetris
Jade nos ofrece la facilidad de
implementación
p e e ac ó rápida
áp da de
comportamientos y la
exportabilidad, casi inmediata,
a un funcionamiento en red.
Agente
g
Jugador
g
Juego de las damas.
Mus
• C
Colaboración
l b
ió entre
t agentes
t por un objetivo
bj ti
común: ganar
Mini WarCraft
Mini-WarCraft
• IImplementación
l
t ió del
d l entorno
t
como un agente,
t
que es el que se encarga de la “física” del
sistema.
sistema
JGomas
JGOMAS: Game Oriented Multi Agent
System
basado en Jade
Grandes Retos
Retos…
Robocup Rescue Simulation
Y más…
Robocup (Soccer)
Simulation
CAPTURAR LA BANDERA
CAPTURAR LA BANDERA
Objetivo
j
del jjuego:
g
Capturar la bandera del equipo contrario y
llevarla a su base.
Evitar que los contrarios capturen su bandera.
CAPTURAR LA BANDERA
Descripción:
Tablero de dimensión: n x m
Las celdas pueden
Por equipos
q p ((Rojo/Azul)
j
)
Estar libres: “ “
Pared: “H”
Bandera: “A” / ”B”
Base*: “C” / “D”
Jugadores: “1” / “2”
Jug
g con Bandera: “3” / “4”
(*) Sólo si no está la bandera
CAPTURAR LA BANDERA
Descripción
Código de equipos
Servicio de la partida
Rojo: “8”
Azul: “7”
Nombre del servicio: "SERVER"
Tipo del servicio: "SERVIDOR_PARTIDA“
Protocolo de conexión:
FIPA-REQUEST
j
jade.proto.SimpleAchieveREInitiator
p
p
CAPTURAR LA BANDERA
Flujo:
INICIO
BUSQUEDA
NEGOCIAC
JUEGO
CAPTURAR LA BANDERA
INICIO
Inicialización de la representación de datos
(
)
internos (Cerebro).
Lanzamiento del comportamiento de
búsqueda
CAPTURAR LA BANDERA
Búsqueda
Búsqueda del servicio dentro del DF
Obtención del nombre del servidor y
almacenarlo.
almacenarlo
CAPTURAR LA BANDERA
Negociación
N
i ió
Implementación del FIPA-REQUEST
Cuando se acepta,
En el inform se manda un mensaje con la
información del tablero
[ANCHO MAPA] [ALTO MAPA]
[ANCHO_MAPA],[ALTO_MAPA],
[ANCHO_VENTANA],[ALTO_VENTANA],
[POS_X],[POS_Y],
[MAPA]
No envía la posición de los jugadores contrarios
CAPTURAR LA BANDERA
Juego
El servidor envía cada x ms(1 ciclo) un
j con la ventana de visión del jjugador.
g
mensaje
Sólo acepta 1 acción por ciclo
ciclo.
Si se envían varias, elige una al azar.
Si se realizan acciones NO permitidas, el
agente es sancionado
sancionado.
CAPTURAR LA BANDERA
Movimientos posibles(Acciones):
Derecha: "1"
Izquierda: "2"
Arriba: "3"
Abajo: "4“
TableroCompleto: "10"
10 -> Envia un string con
el mismo formato del tablero parcial, pero con
todo lo que contiene el mapa, jugadores del
mismo equipo y rivales, banderas...
Penaliza con varios ciclos
CAPTURAR LA BANDERA
Otras percepciones
"6" -> el jugador ha sido expulsado de la
plataforma
Game Over: "9"
9 -> Cuando el jugador gana la
partida, se envia este mensaje
CAPTURAR LA BANDERA
Ejercicio final:
Crear un jugador que, mediante un
p
basado en una máquina
q
de
comportamiento
estados finitos, vaya a por la bandera
contraria y vuelva.
Enlaces interesantes
http://programacionjade.wikispaces.com/
http://dukechile.blogspot.com/search/label/JADE
http://www.exa.unicen.edu.ar/catedras/tmultiag/apunt
es.html
http://jade.tilab.com
…. GOOGLE!!!
Gracias ppor su asistencia!
Gonzalo A. Aranda Corral
Dpto. Tecnologías de la Información
Escuela Politécnica Superior “La Rábida”
Universidad de Huelva
96
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )